summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms
diff options
context:
space:
mode:
authorJan Arne Petersen <jpetersen@openismus.com>2011-12-02 15:20:04 +0100
committerQt by Nokia <qt-info@nokia.com>2012-02-23 13:25:26 +0100
commit422b6ba9ecf0595da5772afec8c5a0a00983d95d (patch)
tree78857a6cb89c114c5a95bd44a356e0f3c18cc7b3 /src/plugins/platforms
parent8d10d9a444cbb3ad4535444272870c4c71279dba (diff)
Add WindowDoesNotAcceptFocus flag and use it in xcb
Add window flag to support windows which should not get the input focus. Sets the input field in the WM_HINTS structure of the window to false if the WindowDoesNotAcceptFocus flag is set on a window in xcb. Change-Id: Ifbc10695b83484c17dca0eb13ea826d74f174833 Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp24
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h1
2 files changed, 25 insertions, 0 deletions
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 43e4a6b7d9..067cb775c8 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -77,6 +77,7 @@
#define xcb_size_hints_set_win_gravity xcb_icccm_size_hints_set_win_gravity
#define xcb_wm_hints_set_iconic xcb_icccm_wm_hints_set_iconic
#define xcb_wm_hints_set_normal xcb_icccm_wm_hints_set_normal
+#define xcb_wm_hints_set_input xcb_icccm_wm_hints_set_input
#define xcb_wm_hints_t xcb_icccm_wm_hints_t
#define XCB_WM_STATE_ICONIC XCB_ICCCM_WM_STATE_ICONIC
#define XCB_WM_STATE_WITHDRAWN XCB_ICCCM_WM_STATE_WITHDRAWN
@@ -322,6 +323,8 @@ void QXcbWindow::create()
memset(&hints, 0, sizeof(hints));
xcb_wm_hints_set_normal(&hints);
+ xcb_wm_hints_set_input(&hints, !(window()->windowFlags() & Qt::WindowDoesNotAcceptFocus));
+
xcb_set_wm_hints(xcb_connection(), m_window, &hints);
xcb_window_t leader = m_screen->clientLeader();
@@ -509,6 +512,8 @@ void QXcbWindow::show()
else
xcb_wm_hints_set_normal(&hints);
+ xcb_wm_hints_set_input(&hints, !(window()->windowFlags() & Qt::WindowDoesNotAcceptFocus));
+
xcb_set_wm_hints(xcb_connection(), m_window, &hints);
// update WM_NORMAL_HINTS
@@ -730,6 +735,7 @@ Qt::WindowFlags QXcbWindow::setWindowFlags(Qt::WindowFlags flags)
setMotifWindowFlags(flags);
setTransparentForMouseEvents(flags & Qt::WindowTransparentForInput);
+ updateDoesNotAcceptFocus(flags & Qt::WindowDoesNotAcceptFocus);
return flags;
}
@@ -1062,6 +1068,24 @@ void QXcbWindow::setTransparentForMouseEvents(bool transparent)
m_transparent = transparent;
}
+void QXcbWindow::updateDoesNotAcceptFocus(bool doesNotAcceptFocus)
+{
+ xcb_get_property_cookie_t cookie = xcb_get_wm_hints(xcb_connection(), m_window);
+
+ xcb_generic_error_t *error;
+
+ xcb_wm_hints_t hints;
+ xcb_get_wm_hints_reply(xcb_connection(), cookie, &hints, &error);
+
+ if (error) {
+ connection()->handleXcbError(error);
+ free(error);
+ return;
+ }
+
+ xcb_wm_hints_set_input(&hints, !doesNotAcceptFocus);
+ xcb_set_wm_hints(xcb_connection(), m_window, &hints);
+}
WId QXcbWindow::winId() const
{
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index 365c8b0549..6ae55e77e6 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -132,6 +132,7 @@ private:
void updateNetWmStateBeforeMap();
void setTransparentForMouseEvents(bool transparent);
+ void updateDoesNotAcceptFocus(bool doesNotAcceptFocus);
void create();
void destroy();