From 0adc6ff90f25b659c291f063e13d11790cebe3ae Mon Sep 17 00:00:00 2001 From: Jon Turney Date: Sun, 15 Mar 2026 13:45:56 +0200 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 f507785b7d..b218a0d79d 100644 --- a/hw/xwin/winmultiwindowwm.c +++ b/hw/xwin/winmultiwindowwm.c @@ -905,6 +905,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; @@ -928,6 +929,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 166d8fcdc1..4679ca58fd 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;