[mutter/gnome-3-32] window-x11: Focus a window in the active workspace as take-focus fallback



commit ed03ce53b28e7d08f888ac17d718db6bde12f7a7
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Wed Jul 17 01:13:48 2019 +0200

    window-x11: Focus a window in the active workspace as take-focus fallback
    
    Starting with commit 2db94e2e we try to focus a fallback default focus window
    if no take-focus window candidate gets the input focus when we request it and
    we limit the focus candidates to the current window's workspace.
    
    However, if the window is unmanaging, the workspace might be unset, and we could
    end up in deferencing a NULL pointer causing a crash.
    
    So, in case the window's workspace is unset, just use the currently active
    workspace for the display.
    
    Closes https://gitlab.gnome.org/GNOME/mutter/issues/687
    
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/688
    
    (cherry picked from commit 5ca0ef078d39548edda1a97e9066d44aa8f38108)

 src/x11/window-x11.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)
---
diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c
index 0ca651ba2..cf0692de6 100644
--- a/src/x11/window-x11.c
+++ b/src/x11/window-x11.c
@@ -886,15 +886,22 @@ meta_window_x11_maybe_focus_delayed (MetaWindow *window,
 }
 
 static void
-maybe_focus_default_window (MetaWorkspace *workspace,
-                            MetaWindow    *not_this_one,
-                            guint32        timestamp)
+maybe_focus_default_window (MetaDisplay *display,
+                            MetaWindow  *not_this_one,
+                            guint32      timestamp)
 {
+  MetaWorkspace *workspace;
+  MetaStack *stack = display->stack;
   MetaStack *stack = workspace->display->stack;
   g_autoptr (GList) focusable_windows = NULL;
   g_autoptr (GQueue) focus_candidates = NULL;
   GList *l;
 
+  if (not_this_one && not_this_one->workspace)
+    workspace = not_this_one->workspace;
+  else
+    workspace = display->workspace_manager->active_workspace;
+
    /* Go through all the focusable windows and try to focus them
     * in order, waiting for a delay. The first one that replies to
     * the request (in case of take focus windows) changing the display
@@ -991,7 +998,7 @@ meta_window_x11_focus (MetaWindow *window,
 
                   meta_x11_display_focus_the_no_focus_window (x11_display,
                                                               timestamp);
-                  maybe_focus_default_window (window->workspace, window,
+                  maybe_focus_default_window (window->display, window,
                                               timestamp);
                 }
             }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]