[gnome-shell] shell/app: Avoid adding windows with a startup workspace twice



commit f9f936e71a35dd9a383ba26763cf69c696d08ed4
Author: Sebastian Keller <skeller gnome org>
Date:   Sun Mar 7 16:57:44 2021 +0100

    shell/app: Avoid adding windows with a startup workspace twice
    
    Changing the workspace of a window causes the window tracker to remove
    and add it to the app again. If this happens from within
    _shell_app_add_window() before the window has been added to the windows
    list, this will cause the check that is supposed to prevent adding the
    same window multiple times to fail and the window to be added twice.
    The app will then be considered still running after the last window has
    been closed. Then when clicking on the corresponding app icon, the shell
    would attempt to switch to a NULL workspace for the closed window
    instead of starting a new instance, resulting in a crash.
    
    Changing the workspace also needs to happen after increasing the
    interesting window count, because otherwise removal of the window by
    the window tracker would trigger a uint underflow leading the app to be
    considered running with UINT_MAX interesting windows, despite having no
    windows, leading to crashes right after launching the app.
    
    Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3833
    
    Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1745>

 src/shell-app.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
---
diff --git a/src/shell-app.c b/src/shell-app.c
index 7d7b5510d6..17b179cbab 100644
--- a/src/shell-app.c
+++ b/src/shell-app.c
@@ -1081,10 +1081,6 @@ _shell_app_add_window (ShellApp        *app,
   if (!app->running_state)
       create_running_state (app);
 
-  if (app->started_on_workspace >= 0)
-    meta_window_change_workspace_by_index (window, app->started_on_workspace, FALSE);
-  app->started_on_workspace = -1;
-
   app->running_state->window_sort_stale = TRUE;
   app->running_state->windows = g_slist_prepend (app->running_state->windows, g_object_ref (window));
   g_signal_connect_object (window, "unmanaged", G_CALLBACK(shell_app_on_unmanaged), app, 0);
@@ -1098,6 +1094,10 @@ _shell_app_add_window (ShellApp        *app,
     app->running_state->interesting_windows++;
   shell_app_sync_running_state (app);
 
+  if (app->started_on_workspace >= 0)
+    meta_window_change_workspace_by_index (window, app->started_on_workspace, FALSE);
+  app->started_on_workspace = -1;
+
   g_object_thaw_notify (G_OBJECT (app));
 
   g_signal_emit (app, shell_app_signals[WINDOWS_CHANGED], 0);


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