summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/xcb/qxcbconnection.cpp
diff options
context:
space:
mode:
authorStefan Becker <chemobejk@gmail.com>2015-05-25 17:46:49 +0300
committerAlexander Volkov <a.volkov@rusbitech.ru>2015-07-08 13:35:51 +0000
commit61a0656eb4149fe793854d703521bf2df48f8f7a (patch)
tree9e4ee7abc066d2841629447069f3e2b7bc599f21 /src/plugins/platforms/xcb/qxcbconnection.cpp
parent27bf6df294b30d0335c6e63ca84461f09ea32ac6 (diff)
xcb: set SM_CLIENT_ID property
SM_CLIENT_ID is required by kwin for proper session management. - move client leader initialization from screen to connection - add SM_CLIENT_ID property to client leader Change-Id: I19fb0d098811c865f6f13d5bc3e59a173c596a65 Task-number: QTBUG-46310 Reviewed-by: Alexander Volkov <a.volkov@rusbitech.ru> Reviewed-by: Uli Schlachter <psychon@znc.in> Reviewed-by: Shawn Rutledge <shawn.rutledge@theqtcompany.com>
Diffstat (limited to 'src/plugins/platforms/xcb/qxcbconnection.cpp')
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 4e558f9447..74f48b0136 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -454,6 +454,7 @@ QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, bool canGra
, has_xkb(false)
, m_buttons(0)
, m_focusWindow(0)
+ , m_clientLeader(0)
, m_systemTrayTracker(0)
, m_glIntegration(Q_NULLPTR)
, m_xiGrab(false)
@@ -1336,6 +1337,58 @@ xcb_window_t QXcbConnection::rootWindow()
return s ? s->root() : 0;
}
+xcb_window_t QXcbConnection::clientLeader()
+{
+ if (m_clientLeader == 0) {
+ m_clientLeader = xcb_generate_id(xcb_connection());
+ QXcbScreen *screen = primaryScreen();
+ Q_XCB_CALL(xcb_create_window(xcb_connection(),
+ XCB_COPY_FROM_PARENT,
+ m_clientLeader,
+ screen->root(),
+ 0, 0, 1, 1,
+ 0,
+ XCB_WINDOW_CLASS_INPUT_OUTPUT,
+ screen->screen()->root_visual,
+ 0, 0));
+#ifndef QT_NO_DEBUG
+ QByteArray ba("Qt client leader window");
+ Q_XCB_CALL(xcb_change_property(xcb_connection(),
+ XCB_PROP_MODE_REPLACE,
+ m_clientLeader,
+ atom(QXcbAtom::_NET_WM_NAME),
+ atom(QXcbAtom::UTF8_STRING),
+ 8,
+ ba.length(),
+ ba.constData()));
+#endif
+ Q_XCB_CALL(xcb_change_property(xcb_connection(),
+ XCB_PROP_MODE_REPLACE,
+ m_clientLeader,
+ atom(QXcbAtom::WM_CLIENT_LEADER),
+ XCB_ATOM_WINDOW,
+ 32,
+ 1,
+ &m_clientLeader));
+
+#if !defined(QT_NO_SESSIONMANAGER) && defined(XCB_USE_SM)
+ // If we are session managed, inform the window manager about it
+ QByteArray session = qGuiApp->sessionId().toLatin1();
+ if (!session.isEmpty()) {
+ Q_XCB_CALL(xcb_change_property(xcb_connection(),
+ XCB_PROP_MODE_REPLACE,
+ m_clientLeader,
+ atom(QXcbAtom::SM_CLIENT_ID),
+ XCB_ATOM_STRING,
+ 8,
+ session.length(),
+ session.constData()));
+ }
+#endif
+ }
+ return m_clientLeader;
+}
+
#ifdef XCB_USE_XLIB
void *QXcbConnection::xlib_display() const
{