diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp index 7d69564..21a2ebd 100644 --- a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp +++ b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp @@ -102,6 +102,13 @@ void QXcbNativeInterface::beep() // For QApplication::beep() xcb_bell(connection, 0); } +void QXcbNativeInterface::clearArea(const QWindow *window, int x, int y, int width, int height) +{ + QPlatformScreen *screen = QGuiApplication::primaryScreen()->handle(); + xcb_connection_t *connection = static_cast(screen)->xcb_connection(); + xcb_clear_area(connection, 0, window->winId(), x, y, width, height); +} + static inline QXcbSystemTrayTracker *systemTrayTracker(const QScreen *s) { return static_cast(s->handle())->connection()->systemTrayTracker(); diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.h b/src/plugins/platforms/xcb/qxcbnativeinterface.h index 9c4fa44..22cdeca 100644 --- a/src/plugins/platforms/xcb/qxcbnativeinterface.h +++ b/src/plugins/platforms/xcb/qxcbnativeinterface.h @@ -100,6 +100,7 @@ public: static void *glxContextForContext(QOpenGLContext *context); Q_INVOKABLE void beep(); + Q_INVOKABLE void clearArea(const QWindow *window, int x, int y, int width, int height); Q_INVOKABLE bool systemTrayAvailable(const QScreen *screen) const; Q_INVOKABLE bool requestSystemTrayWindowDock(const QWindow *window); Q_INVOKABLE QRect systemTrayWindowGlobalGeometry(const QWindow *window); diff --git a/src/widgets/util/qsystemtrayicon_x11.cpp b/src/widgets/util/qsystemtrayicon_x11.cpp index 347e570..0f868bb 100644 --- a/src/widgets/util/qsystemtrayicon_x11.cpp +++ b/src/widgets/util/qsystemtrayicon_x11.cpp @@ -195,12 +195,24 @@ bool QSystemTrayIconSys::event(QEvent *e) void QSystemTrayIconSys::paintEvent(QPaintEvent *) { - // Note: Transparent pixels require a particular Visual which XCB - // currently does not support yet. + // Note: Transparent pixels require a particular Visual which no one + // implemented support for in the XCB QPA yet. const QRect rect(QPoint(0, 0), geometry().size()); QPainter painter(this); painter.setCompositionMode(QPainter::CompositionMode_Source); +#if 1 + // Partly stolen from qt4 + const QRegion oldSystemClip = painter.paintEngine()->systemClip(); + const QRect clearedRect = oldSystemClip.boundingRect(); + QMetaObject::invokeMethod(QGuiApplication::platformNativeInterface(), + "clearArea", Qt::DirectConnection, + Q_ARG(const QWindow *, windowHandle()), + Q_ARG(int, clearedRect.x()), Q_ARG(int, clearedRect.y()), + Q_ARG(int, clearedRect.width()), Q_ARG(int, clearedRect.height())); + painter.drawPixmap(QPoint(0, 0), QGuiApplication::primaryScreen()->grabWindow(winId(), 0, 0, rect.size().width(), rect.size().height())); +#else painter.fillRect(rect, Qt::transparent); +#endif painter.setCompositionMode(QPainter::CompositionMode_SourceOver); q->icon().paint(&painter, rect); }