From 556221d97b6c4ca387ca5535ef8f0a2b0f5b7644 Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Fri, 30 Oct 2015 18:15:18 +0300 Subject: QSystemTrayIcon/X11: Move platform-specific calls to the xcb plugin - Detect the tray icon window in the platform plugin by the object name. This way we don't need QXcbWindowFunctions::requestSystemTrayWindowDockIdentifier(). - Get rid of unused calls QXcbIntegrationFunctions::xEmbedSystemTrayVisualHasAlphaChannel() and QXcbWindowFunctions::setParentRelativeBackPixmap(). - Mark the tray icon window as embedded to be able to get the correct result from QWindow::mapToGlobal(). It allows to drop QXcbWindowFunctions::systemTrayWindowGlobalGeometry(). This change allows to remove the intermediate level between the QSystemTrayIconSys widget and the xcb plugin. The code looks clearer. Change-Id: I7d067131287a6dec162b36f0bddc8cb518aaa38c Reviewed-by: Gatis Paeglis --- src/plugins/platforms/xcb/qxcbconnection.cpp | 16 --------- src/plugins/platforms/xcb/qxcbconnection.h | 2 -- src/plugins/platforms/xcb/qxcbnativeinterface.cpp | 38 ---------------------- src/plugins/platforms/xcb/qxcbnativeinterface.h | 5 --- .../platforms/xcb/qxcbsystemtraytracker.cpp | 30 +---------------- src/plugins/platforms/xcb/qxcbsystemtraytracker.h | 2 -- src/plugins/platforms/xcb/qxcbwindow.cpp | 38 ++++------------------ src/plugins/platforms/xcb/qxcbwindow.h | 8 +---- 8 files changed, 9 insertions(+), 130 deletions(-) (limited to 'src/plugins/platforms/xcb') diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp index 52f93b9483..01e67039f1 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection.cpp @@ -2287,22 +2287,6 @@ QXcbSystemTrayTracker *QXcbConnection::systemTrayTracker() const return m_systemTrayTracker; } -bool QXcbConnection::xEmbedSystemTrayAvailable() -{ - if (!QGuiApplicationPrivate::platformIntegration()) - return false; - QXcbConnection *connection = static_cast(QGuiApplicationPrivate::platformIntegration())->defaultConnection(); - return connection->systemTrayTracker(); -} - -bool QXcbConnection::xEmbedSystemTrayVisualHasAlphaChannel() -{ - if (!QGuiApplicationPrivate::platformIntegration()) - return false; - QXcbConnection *connection = static_cast(QGuiApplicationPrivate::platformIntegration())->defaultConnection(); - return connection->systemTrayTracker() && connection->systemTrayTracker()->visualHasAlphaChannel(); -} - Qt::MouseButtons QXcbConnection::queryMouseButtons() const { int stateMask = 0; diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h index e93159aa80..fa39bf6874 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.h +++ b/src/plugins/platforms/xcb/qxcbconnection.h @@ -506,8 +506,6 @@ public: QXcbNativeInterface *nativeInterface() const { return m_nativeInterface; } QXcbSystemTrayTracker *systemTrayTracker() const; - static bool xEmbedSystemTrayAvailable(); - static bool xEmbedSystemTrayVisualHasAlphaChannel(); Qt::MouseButtons queryMouseButtons() const; Qt::KeyboardModifiers queryKeyboardModifiers() const; diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp index db44e58cbb..82d3912c4f 100644 --- a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp +++ b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp @@ -54,7 +54,6 @@ #include #include -#include #include #include @@ -106,21 +105,6 @@ static inline QXcbSystemTrayTracker *systemTrayTracker(const QScreen *s) return static_cast(s->handle())->connection()->systemTrayTracker(); } -bool QXcbNativeInterface::systemTrayAvailable(const QScreen *screen) const -{ - return systemTrayTracker(screen); -} - -bool QXcbNativeInterface::requestSystemTrayWindowDock(const QWindow *window) -{ - return QXcbWindow::requestSystemTrayWindowDockStatic(window); -} - -QRect QXcbNativeInterface::systemTrayWindowGlobalGeometry(const QWindow *window) -{ - return QXcbWindow::systemTrayWindowGlobalGeometryStatic(window); -} - xcb_window_t QXcbNativeInterface::locateSystemTray(xcb_connection_t *conn, const QXcbScreen *screen) { if (m_sysTraySelectionAtom == XCB_ATOM_NONE) { @@ -140,16 +124,6 @@ xcb_window_t QXcbNativeInterface::locateSystemTray(xcb_connection_t *conn, const return sel_owner_r->owner; } -bool QXcbNativeInterface::systrayVisualHasAlphaChannel() -{ - return QXcbConnection::xEmbedSystemTrayVisualHasAlphaChannel(); -} - -void QXcbNativeInterface::setParentRelativeBackPixmap(QWindow *window) -{ - QXcbWindow::setParentRelativeBackPixmapStatic(window); -} - void *QXcbNativeInterface::nativeResourceForIntegration(const QByteArray &resourceString) { QByteArray lowerCaseResource = resourceString.toLower(); @@ -371,18 +345,6 @@ QFunctionPointer QXcbNativeInterface::platformFunction(const QByteArray &functio if (function == QXcbWindowFunctions::setWmWindowIconTextIdentifier()) return QFunctionPointer(QXcbWindowFunctions::SetWmWindowIconText(QXcbWindow::setWindowIconTextStatic)); - if (function == QXcbWindowFunctions::setParentRelativeBackPixmapIdentifier()) - return QFunctionPointer(QXcbWindowFunctions::SetParentRelativeBackPixmap(QXcbWindow::setParentRelativeBackPixmapStatic)); - - if (function == QXcbWindowFunctions::requestSystemTrayWindowDockIdentifier()) - return QFunctionPointer(QXcbWindowFunctions::RequestSystemTrayWindowDock(QXcbWindow::requestSystemTrayWindowDockStatic)); - - if (function == QXcbWindowFunctions::systemTrayWindowGlobalGeometryIdentifier()) - return QFunctionPointer(QXcbWindowFunctions::SystemTrayWindowGlobalGeometry(QXcbWindow::systemTrayWindowGlobalGeometryStatic)); - - if (function == QXcbIntegrationFunctions::xEmbedSystemTrayVisualHasAlphaChannelIdentifier()) - return QFunctionPointer(QXcbIntegrationFunctions::XEmbedSystemTrayVisualHasAlphaChannel(QXcbConnection::xEmbedSystemTrayVisualHasAlphaChannel)); - if (function == QXcbWindowFunctions::visualIdIdentifier()) { return QFunctionPointer(QXcbWindowFunctions::VisualId(QXcbWindow::visualIdStatic)); } diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.h b/src/plugins/platforms/xcb/qxcbnativeinterface.h index 6a752c68ca..129f3a4a1f 100644 --- a/src/plugins/platforms/xcb/qxcbnativeinterface.h +++ b/src/plugins/platforms/xcb/qxcbnativeinterface.h @@ -122,11 +122,6 @@ public: QXcbConnection::PeekOptions option = QXcbConnection::PeekDefault, qint32 peekerId = -1); - Q_INVOKABLE bool systemTrayAvailable(const QScreen *screen) const; - Q_INVOKABLE void setParentRelativeBackPixmap(QWindow *window); - Q_INVOKABLE bool systrayVisualHasAlphaChannel(); - Q_INVOKABLE bool requestSystemTrayWindowDock(const QWindow *window); - Q_INVOKABLE QRect systemTrayWindowGlobalGeometry(const QWindow *window); Q_INVOKABLE QString dumpConnectionNativeWindows(const QXcbConnection *connection, WId root) const; Q_INVOKABLE QString dumpNativeWindows(WId root = 0) const; diff --git a/src/plugins/platforms/xcb/qxcbsystemtraytracker.cpp b/src/plugins/platforms/xcb/qxcbsystemtraytracker.cpp index 8b9c67e98a..684e603fab 100644 --- a/src/plugins/platforms/xcb/qxcbsystemtraytracker.cpp +++ b/src/plugins/platforms/xcb/qxcbsystemtraytracker.cpp @@ -91,8 +91,7 @@ xcb_window_t QXcbSystemTrayTracker::locateTrayWindow(const QXcbConnection *conne return reply->owner; } -// API for QPlatformNativeInterface/QPlatformSystemTrayIcon: Request a window -// to be docked on the tray. +// Request a window to be docked on the tray. void QXcbSystemTrayTracker::requestSystemTrayWindowDock(xcb_window_t window) const { xcb_client_message_event_t trayRequest; @@ -122,23 +121,6 @@ xcb_window_t QXcbSystemTrayTracker::trayWindow() return m_trayWindow; } -// API for QPlatformNativeInterface/QPlatformSystemTrayIcon: Return the geometry of a -// a window parented on the tray. Determines the global geometry via XCB since mapToGlobal -// does not work for the QWindow parented on the tray. -QRect QXcbSystemTrayTracker::systemTrayWindowGlobalGeometry(xcb_window_t window) const -{ - xcb_connection_t *conn = m_connection->xcb_connection(); - auto geomReply = Q_XCB_REPLY(xcb_get_geometry, conn, window); - if (!geomReply) - return QRect(); - - auto translateReply = Q_XCB_REPLY(xcb_translate_coordinates, conn, window, m_connection->rootWindow(), 0, 0); - if (!translateReply) - return QRect(); - - return QRect(QPoint(translateReply->dst_x, translateReply->dst_y), QSize(geomReply->width, geomReply->height)); -} - inline void QXcbSystemTrayTracker::emitSystemTrayWindowChanged() { if (const QPlatformScreen *ps = m_connection->primaryScreen()) @@ -170,16 +152,6 @@ xcb_visualid_t QXcbSystemTrayTracker::visualId() return visual; } -bool QXcbSystemTrayTracker::visualHasAlphaChannel() -{ - const xcb_visualid_t systrayVisualId = netSystemTrayVisual(); - if (systrayVisualId != XCB_NONE) { - quint8 depth = m_connection->primaryScreen()->depthOfVisual(systrayVisualId); - return depth == 32; - } - return false; -} - xcb_visualid_t QXcbSystemTrayTracker::netSystemTrayVisual() { if (m_trayWindow == XCB_WINDOW_NONE) diff --git a/src/plugins/platforms/xcb/qxcbsystemtraytracker.h b/src/plugins/platforms/xcb/qxcbsystemtraytracker.h index c692cf590d..d2fc24c957 100644 --- a/src/plugins/platforms/xcb/qxcbsystemtraytracker.h +++ b/src/plugins/platforms/xcb/qxcbsystemtraytracker.h @@ -57,14 +57,12 @@ public: xcb_window_t trayWindow(); void requestSystemTrayWindowDock(xcb_window_t window) const; - QRect systemTrayWindowGlobalGeometry(xcb_window_t window) const; void notifyManagerClientMessageEvent(const xcb_client_message_event_t *); void handleDestroyNotifyEvent(const xcb_destroy_notify_event_t *) override; xcb_visualid_t visualId(); - bool visualHasAlphaChannel(); signals: void systemTrayWindowChanged(QScreen *screen); diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 33395bdfdb..316adb8fa9 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -558,6 +558,9 @@ void QXcbWindow::create() QByteArray wmWindowRole = window()->property(wm_window_role_property_id).toByteArray(); setWmWindowRole(wmWindowRole); } + + if (m_trayIconWindow) + m_embedded = requestSystemTrayWindowDock(); } QXcbWindow::~QXcbWindow() @@ -792,7 +795,7 @@ void QXcbWindow::show() else if (connection()->time() != XCB_TIME_CURRENT_TIME) updateNetWmUserTime(connection()->time()); - if (window()->objectName() == QLatin1String("QSystemTrayIconSysWindow")) + if (m_trayIconWindow) return; // defer showing until XEMBED_EMBEDDED_NOTIFY xcb_map_window(xcb_connection(), m_window); @@ -1793,12 +1796,6 @@ void QXcbWindow::setWmWindowRole(const QByteArray &role) role.size(), role.constData()); } -void QXcbWindow::setParentRelativeBackPixmapStatic(QWindow *window) -{ - if (window->handle()) - static_cast(window->handle())->setParentRelativeBackPixmap(); -} - void QXcbWindow::setParentRelativeBackPixmap() { const quint32 mask = XCB_CW_BACK_PIXMAP; @@ -1806,14 +1803,7 @@ void QXcbWindow::setParentRelativeBackPixmap() xcb_change_window_attributes(xcb_connection(), m_window, mask, values); } -bool QXcbWindow::requestSystemTrayWindowDockStatic(const QWindow *window) -{ - if (window->handle()) - return static_cast(window->handle())->requestSystemTrayWindowDock(); - return false; -} - -bool QXcbWindow::requestSystemTrayWindowDock() const +bool QXcbWindow::requestSystemTrayWindowDock() { if (!connection()->systemTrayTracker()) return false; @@ -1821,20 +1811,6 @@ bool QXcbWindow::requestSystemTrayWindowDock() const return true; } -QRect QXcbWindow::systemTrayWindowGlobalGeometryStatic(const QWindow *window) -{ - if (window->handle()) - return static_cast(window->handle())->systemTrayWindowGlobalGeometry(); - return QRect(); -} - -QRect QXcbWindow::systemTrayWindowGlobalGeometry() const -{ - if (!connection()->systemTrayTracker()) - return QRect(); - return connection()->systemTrayTracker()->systemTrayWindowGlobalGeometry(m_window); -} - class ExposeCompressor { public: @@ -2094,7 +2070,7 @@ void QXcbWindow::handleButtonPressEvent(int event_x, int event_y, int root_x, in updateNetWmUserTime(timestamp); - if (m_embedded) { + if (m_embedded && !m_trayIconWindow) { if (window() != QGuiApplication::focusWindow()) { const QXcbWindow *container = static_cast(parent()); Q_ASSERT(container != 0); @@ -2554,7 +2530,7 @@ bool QXcbWindow::windowEvent(QEvent *event) { switch (event->type()) { case QEvent::FocusIn: - if (m_embedded && !event->spontaneous()) { + if (m_embedded && !m_trayIconWindow && !event->spontaneous()) { QFocusEvent *focusEvent = static_cast(event); switch (focusEvent->reason()) { case Qt::TabFocusReason: diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h index 93526685cf..c6bc915b6a 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.h +++ b/src/plugins/platforms/xcb/qxcbwindow.h @@ -159,14 +159,8 @@ public: static void setWindowIconTextStatic(QWindow *window, const QString &text); - static void setParentRelativeBackPixmapStatic(QWindow *window); void setParentRelativeBackPixmap(); - - static bool requestSystemTrayWindowDockStatic(const QWindow *window); - bool requestSystemTrayWindowDock() const; - - static QRect systemTrayWindowGlobalGeometryStatic(const QWindow *window); - QRect systemTrayWindowGlobalGeometry() const; + bool requestSystemTrayWindowDock(); uint visualId() const; bool needsSync() const; -- cgit v1.2.3