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>
bb10
Jan Arne Petersen 2011-12-02 15:20:04 +01:00 committed by Qt by Nokia
parent 8d10d9a444
commit 422b6ba9ec
4 changed files with 29 additions and 0 deletions

View File

@ -293,6 +293,7 @@ public:
WindowStaysOnTopHint = 0x00040000,
WindowTransparentForInput = 0x00080000,
WindowOverridesSystemGestures = 0x00100000,
WindowDoesNotAcceptFocus = 0x00200000,
CustomizeWindowHint = 0x02000000,
WindowStaysOnBottomHint = 0x04000000,

View File

@ -2112,6 +2112,9 @@
implements its own set of gestures and that system level gestures, like for
instance three-finger desktop switching, should be disabled.
\value WindowDoesNotAcceptFocus Informs the window system that this window should
not receive the input focus.
\value WindowType_Mask A mask for extracting the window type
part of the window flags.

View File

@ -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
{

View File

@ -132,6 +132,7 @@ private:
void updateNetWmStateBeforeMap();
void setTransparentForMouseEvents(bool transparent);
void updateDoesNotAcceptFocus(bool doesNotAcceptFocus);
void create();
void destroy();