From 4237d3d2bb8c57ec797593e3a25df38dc2c57a6e Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Thu, 20 Jan 2022 06:14:54 +0000 Subject: [PATCH] steamcompmgr: Fallback to whatever is best for local focus if focus control appid is not present inside of xwayland context Allows us to run with multiple xwayland contexts and still have proper focus if the game launches into the first xwayland context --- src/steamcompmgr.cpp | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp index 56b7407..1067f09 100644 --- a/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp @@ -178,7 +178,6 @@ uint32_t currentOutputWidth, currentOutputHeight; bool hasFocusWindow; std::vector< uint32_t > vecFocuscontrolAppIDs; -std::vector< uint32_t > vecFocuscontrolAppIDsEmpty; bool gameFocused; @@ -1806,11 +1805,13 @@ static bool is_good_override_candidate( win *override, win* focus ) } static bool -pick_primary_focus_and_override(focus_t *out, Window focusControlWindow, const std::vector& vecPossibleFocusWindows, const std::vector& ctxFocusControlAppIDs) +pick_primary_focus_and_override(focus_t *out, Window focusControlWindow, const std::vector& vecPossibleFocusWindows, bool globalFocus, const std::vector& ctxFocusControlAppIDs) { bool localGameFocused = false; win *focus = NULL, *override_focus = NULL; - if ( focusControlWindow != None || ctxFocusControlAppIDs.size() > 0 ) + + bool controlledFocus = focusControlWindow != None || ctxFocusControlAppIDs.size() > 0; + if ( controlledFocus ) { if ( focusControlWindow != None ) { @@ -1819,6 +1820,7 @@ pick_primary_focus_and_override(focus_t *out, Window focusControlWindow, const s if ( focusable_window->id == focusControlWindow ) { focus = focusable_window; + localGameFocused = true; goto found; } } @@ -1831,17 +1833,22 @@ pick_primary_focus_and_override(focus_t *out, Window focusControlWindow, const s if ( focusable_window->appID == focusable_appid ) { focus = focusable_window; + localGameFocused = true; goto found; } } } -found: - localGameFocused = true; + +found:; } - else if ( vecPossibleFocusWindows.size() > 0 ) + + if ( !focus && ( !globalFocus || !controlledFocus ) ) { - focus = vecPossibleFocusWindows[ 0 ]; - localGameFocused = focus->appID != 0; + if ( vecPossibleFocusWindows.size() > 0 ) + { + focus = vecPossibleFocusWindows[ 0 ]; + localGameFocused = focus->appID != 0; + } } auto resolveTransientOverrides = [&]() @@ -1869,7 +1876,7 @@ found: } }; - if ( localGameFocused && focus ) + if ( focus ) { // Do some searches through game windows to follow transient links if needed while ( true ) @@ -1989,7 +1996,7 @@ determine_and_apply_focus(xwayland_ctx_t *ctx, std::vector& vecGlobalPossi vecGlobalPossibleFocusWindows.insert(vecGlobalPossibleFocusWindows.end(), vecPossibleFocusWindows.begin(), vecPossibleFocusWindows.end()); - pick_primary_focus_and_override( &ctx->focus, ctx->focusControlWindow, vecPossibleFocusWindows, g_nXWaylandCount == 1 ? vecFocuscontrolAppIDs : vecFocuscontrolAppIDsEmpty ); + pick_primary_focus_and_override( &ctx->focus, ctx->focusControlWindow, vecPossibleFocusWindows, false, vecFocuscontrolAppIDs ); if ( inputFocus == NULL ) { @@ -2159,7 +2166,7 @@ determine_and_apply_focus() std::stable_sort( vecPossibleFocusWindows.begin(), vecPossibleFocusWindows.end(), is_focus_priority_greater ); - gameFocused = pick_primary_focus_and_override(&global_focus, root_ctx->focusControlWindow, vecPossibleFocusWindows, vecFocuscontrolAppIDs); + gameFocused = pick_primary_focus_and_override(&global_focus, root_ctx->focusControlWindow, vecPossibleFocusWindows, true, vecFocuscontrolAppIDs); // Pick overlay/notifications from root ctx global_focus.overlayWindow = root_ctx->focus.overlayWindow;