From e29d76ef44d4aded62fd743d3c016eaee4a10ac5 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Fri, 7 Jan 2022 09:59:07 +0000 Subject: [PATCH] steamcompmgr: Fix stale keybaord focus bug When the focus changes but the input focus does not (ie. overlay -> steam) the keyboard focus can be left behind on the game, which is not what we want. Track this more ganularly. --- src/steamcompmgr.cpp | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp index 8b1776f..9bc7b7b 100644 --- a/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp @@ -175,6 +175,7 @@ struct global_focus_t win *currentNotificationWindow; win *currentOverrideWindow; win *currentFadeWindow; + win *currentKeyboardFocusWindow; MouseCursor *cursor; } global_focus; @@ -1987,19 +1988,22 @@ found: ctx->currentFocusWindow = focus; - if ( ctx->currentInputFocusWindow != inputFocus || - ctx->currentInputFocusMode != inputFocus->inputFocusMode ) - { - win *keyboardFocusWin = inputFocus; + win *keyboardFocusWin = inputFocus; + if ( inputFocus && inputFocus->inputFocusMode ) + keyboardFocusWin = override_focus ? override_focus : focus; + + Window keyboardFocusWindow = keyboardFocusWin ? keyboardFocusWin->id : None; + + if ( ctx->currentInputFocusWindow != inputFocus || + ctx->currentInputFocusMode != inputFocus->inputFocusMode || + ctx->currentKeyboardFocusWindow != keyboardFocusWindow ) + { if ( debugFocus == true ) { xwm_log.debugf( "determine_and_apply_focus inputFocus %lu", inputFocus->id ); } - if ( inputFocus->inputFocusMode ) - keyboardFocusWin = override_focus ? override_focus : focus; - if ( !override_focus || override_focus != keyboardFocusWin ) XSetInputFocus(ctx->dpy, keyboardFocusWin->id, RevertToNone, CurrentTime); @@ -2171,19 +2175,19 @@ found: if (global_focus.currentInputFocusWindow) global_focus.currentInputFocusMode = global_focus.currentInputFocusWindow->inputFocusMode; - win *keyboardFocusWin = global_focus.currentInputFocusWindow; + global_focus.currentKeyboardFocusWindow = global_focus.currentInputFocusWindow; if ( global_focus.currentInputFocusMode ) { - keyboardFocusWin = global_focus.currentOverrideWindow + global_focus.currentKeyboardFocusWindow = global_focus.currentOverrideWindow ? global_focus.currentOverrideWindow : global_focus.currentFocusWindow; } - if ( global_focus.currentInputFocusWindow != previous_focus.currentInputFocusWindow || - global_focus.currentInputFocusMode != previous_focus.currentInputFocusMode ) + if ( global_focus.currentInputFocusWindow != previous_focus.currentInputFocusWindow || + global_focus.currentKeyboardFocusWindow != previous_focus.currentKeyboardFocusWindow ) { if ( (global_focus.currentInputFocusWindow && global_focus.currentInputFocusWindow->surface.wlr != nullptr) || - (keyboardFocusWin && keyboardFocusWin->surface.wlr != nullptr) ) + (global_focus.currentKeyboardFocusWindow && global_focus.currentKeyboardFocusWindow->surface.wlr != nullptr) ) { wlserver_lock(); if ( global_focus.currentInputFocusWindow && global_focus.currentInputFocusWindow->surface.wlr != nullptr ) @@ -2195,8 +2199,8 @@ found: wlserver_mousefocus( global_focus.currentInputFocusWindow->surface.wlr, global_focus.cursor->x(), global_focus.cursor->y() ); } - if ( keyboardFocusWin && keyboardFocusWin->surface.wlr != nullptr ) - wlserver_keyboardfocus( keyboardFocusWin->surface.wlr ); + if ( global_focus.currentKeyboardFocusWindow && global_focus.currentKeyboardFocusWindow->surface.wlr != nullptr ) + wlserver_keyboardfocus( global_focus.currentKeyboardFocusWindow->surface.wlr ); wlserver_unlock(); } } @@ -2230,9 +2234,9 @@ found: focused_mouse_display = global_focus.currentInputFocusWindow->ctx->xwayland_server->get_nested_display_name(); } - if ( keyboardFocusWin ) + if ( global_focus.currentKeyboardFocusWindow ) { - focused_keyboard_display = keyboardFocusWin->ctx->xwayland_server->get_nested_display_name(); + focused_keyboard_display = global_focus.currentKeyboardFocusWindow->ctx->xwayland_server->get_nested_display_name(); } XChangeProperty( root_ctx->dpy, root_ctx->root, root_ctx->atoms.gamescopeFocusedAppAtom, XA_CARDINAL, 32, PropModeReplace,