[gnome-shell] shell/app: Re-order running-state cleanup



commit 331454a757bf48cd7eb597bf5e8d1f2d190708e5
Author: Florian Müllner <fmuellner gnome org>
Date:   Wed Dec 22 01:53:17 2021 +0100

    shell/app: Re-order running-state cleanup
    
    Since commit 1807be1, we clear the fallback icon when a window is
    removed, and notify the icon change. The notify call currently
    happens after removing the window from the running state, but
    before syncing the state (and possibly clear the running state
    altogether).
    
    That state is inconsistent and results in an assertion hit when
    some code tries to re-fetch the icon in response to the notify
    call.
    
    Address this by updating the state before clearing the fallback
    icon, so that the app will be in the correct STOPPED state after
    removing the last window.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4888
    
    Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2073>

 src/shell-app.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)
---
diff --git a/src/shell-app.c b/src/shell-app.c
index 28e819a05a..587b4a4edb 100644
--- a/src/shell-app.c
+++ b/src/shell-app.c
@@ -1140,6 +1140,13 @@ _shell_app_remove_window (ShellApp   *app,
 
   app->running_state->windows = g_slist_remove (app->running_state->windows, window);
 
+  if (!meta_window_is_skip_taskbar (window))
+    app->running_state->interesting_windows--;
+  shell_app_sync_running_state (app);
+
+  if (app->running_state->windows == NULL)
+    g_clear_pointer (&app->running_state, unref_running_state);
+
   g_signal_handlers_disconnect_by_func (window, G_CALLBACK(shell_app_on_user_time_changed), app);
   g_signal_handlers_disconnect_by_func (window, G_CALLBACK(shell_app_on_skip_taskbar_changed), app);
   if (window == app->fallback_icon_window)
@@ -1152,15 +1159,8 @@ _shell_app_remove_window (ShellApp   *app,
       g_object_notify (G_OBJECT (app), "icon");
     }
 
-  if (!meta_window_is_skip_taskbar (window))
-    app->running_state->interesting_windows--;
-  shell_app_sync_running_state (app);
-
   g_object_unref (window);
 
-  if (app->running_state->windows == NULL)
-    g_clear_pointer (&app->running_state, unref_running_state);
-
   g_signal_emit (app, shell_app_signals[WINDOWS_CHANGED], 0);
 }
 


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