path: root/src/plugins/platforms/xcb
diff options
authorUli Schlachter <>2014-12-04 17:57:02 +0100
committerShawn Rutledge <>2014-12-09 16:01:59 +0100
commit2203d9d93e24e00d6e9bc9bda0e65a0c7f9923cc (patch)
tree67cf443dc490d58a66c63cc2494fd96f9424d4a2 /src/plugins/platforms/xcb
parent459e22a9dfd7105918528def302604a6c0628115 (diff)
xcb: Fix transparent tray backgrounds with 24bpp tray visuals
Commit 0eefa785a0d8 ported Qt4's method of indirectly drawing the tray icon's background to Qt5. This commit makes it work a bit better. When drawing the tray's background, we use a ClearArea request to make the X11 server fill the tray icon with its background. Then we grab that background from the server and paint the icon on top of it. So this is pretty much pseudo-transparency at work. One small ingredient that was missing before is the BackgroundPixmap of the tray icon. If this attribute is set to ParentRelative, then our tray icon inherits the background of its parent window. That way the ClearArea will actually produce the expected background. Task-number: QTBUG-35832 Change-Id: I63fc4609064d8f858ca9e5cc290409a298b918b7 Reviewed-by: Jørgen Lind <> Reviewed-by: Shawn Rutledge <>
Diffstat (limited to 'src/plugins/platforms/xcb')
2 files changed, 13 insertions, 0 deletions
diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
index 3058b29f2d..15ba7cc021 100644
--- a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
+++ b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
@@ -208,6 +208,18 @@ void QXcbNativeInterface::clearRegion(const QWindow *qwindow, const QRect& rect)
+void QXcbNativeInterface::setParentRelativeBackPixmap(const QWindow *qwindow)
+ if (const QPlatformWindow *platformWindow = qwindow->handle()) {
+ const QXcbWindow *qxwindow = static_cast<const QXcbWindow *>(platformWindow);
+ xcb_connection_t *xcb_conn = qxwindow->xcb_connection();
+ const quint32 mask = XCB_CW_BACK_PIXMAP;
+ const quint32 values[] = { XCB_BACK_PIXMAP_PARENT_RELATIVE };
+ Q_XCB_CALL(xcb_change_window_attributes(xcb_conn, qxwindow->xcb_window(), mask, values));
+ }
void *QXcbNativeInterface::nativeResourceForIntegration(const QByteArray &resourceString)
void *result = 0;
diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.h b/src/plugins/platforms/xcb/qxcbnativeinterface.h
index b667f1a372..3ec96975f5 100644
--- a/src/plugins/platforms/xcb/qxcbnativeinterface.h
+++ b/src/plugins/platforms/xcb/qxcbnativeinterface.h
@@ -106,6 +106,7 @@ public:
Q_INVOKABLE void beep();
Q_INVOKABLE bool systemTrayAvailable(const QScreen *screen) const;
Q_INVOKABLE void clearRegion(const QWindow *qwindow, const QRect& rect);
+ Q_INVOKABLE void setParentRelativeBackPixmap(const QWindow *window);
Q_INVOKABLE bool systrayVisualHasAlphaChannel();
Q_INVOKABLE bool requestSystemTrayWindowDock(const QWindow *window);
Q_INVOKABLE QRect systemTrayWindowGlobalGeometry(const QWindow *window);