From d7d2dd82860729c229ea0a545ada706ccb899fad Mon Sep 17 00:00:00 2001 From: Jon Turney Date: Mon, 17 Apr 2017 20:00:17 +0100 Subject: [PATCH] hw/xwin: Always set the X input focus to none when an X window loses focus In the multiwindow WM, we need to cancel the X input focus if the Windows input focus has gone to the desktop, or another application's window. We could maybe avoid some unneeded work by not doing this if the WM_KILLFOCUS wParam is another window owned by us, which is immediately going to be given the X input focus. Part-of: --- hw/xwin/winmultiwindowwm.c | 8 ++++++++ hw/xwin/winmultiwindowwndproc.c | 10 +++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/hw/xwin/winmultiwindowwm.c b/hw/xwin/winmultiwindowwm.c index 7c1868def..4745c7557 100644 --- a/hw/xwin/winmultiwindowwm.c +++ b/hw/xwin/winmultiwindowwm.c @@ -909,6 +909,7 @@ winMultiWindowWMProc(void *pArg) -- independently, the WM_TAKE_FOCUS protocol determines whether the WM should send a WM_TAKE_FOCUS ClientMessage. */ + if (pNode->msg.iWindow) { Bool neverFocus = FALSE; xcb_get_property_cookie_t cookie; @@ -932,6 +933,13 @@ winMultiWindowWMProc(void *pArg) pNode->msg.iWindow, pWMInfo->atmWmProtos, pWMInfo->atmWmTakeFocus); + } + else + /* Set the input focus to none */ + { + xcb_set_input_focus(pWMInfo->conn, XCB_INPUT_FOCUS_NONE, + XCB_NONE, XCB_CURRENT_TIME); + } break; diff --git a/hw/xwin/winmultiwindowwndproc.c b/hw/xwin/winmultiwindowwndproc.c index 2b64b724c..1ac43d37a 100644 --- a/hw/xwin/winmultiwindowwndproc.c +++ b/hw/xwin/winmultiwindowwndproc.c @@ -808,9 +808,13 @@ winTopLevelWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) /* Remove our keyboard hook if it is installed */ winRemoveKeyboardHookLL(); - /* Revert the X focus as well, but only if the Windows focus is going to another window */ - if (!wParam && pWin) - DeleteWindowFromAnyEvents(pWin, FALSE); + /* Revert the X focus as well */ + if (fWMMsgInitialized) + { + wmMsg.msg = WM_WM_ACTIVATE; + wmMsg.iWindow = 0; + winSendMessageToWM(s_pScreenPriv->pWMInfo, &wmMsg); + } return 0;