From ff705fa9023ce7663f516b8ce24ae860220d6ef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 24 Mar 2023 10:16:07 +0100 Subject: [PATCH] shell: Make singletons owned by ShellGlobal This means also means they will be cleaned up when disposing ShellGlobal, which will then mean signals tied to the GObject lifetime will be disconnected. Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6536 Part-of: --- src/shell-app-cache.c | 12 ++----- src/shell-app-system.c | 7 +--- src/shell-app-usage.c | 7 +--- src/shell-global-private.h | 4 +++ src/shell-global.c | 73 ++++++++++++++++++++++++++++++++++++++ src/shell-global.h | 10 ++++++ src/shell-window-tracker.c | 7 +--- 7 files changed, 93 insertions(+), 27 deletions(-) diff --git a/src/shell-app-cache.c b/src/shell-app-cache.c index 44fc8b0d7..ef1075451 100644 --- a/src/shell-app-cache.c +++ b/src/shell-app-cache.c @@ -4,6 +4,8 @@ #include "shell-app-cache-private.h" +#include "shell-global-private.h" + /** * SECTION:shell-app-cache * @title: ShellAppCache @@ -82,15 +84,7 @@ cache_state_new (void) ShellAppCache * shell_app_cache_get_default (void) { - static ShellAppCache *instance; - - if (instance == NULL) - { - instance = g_object_new (SHELL_TYPE_APP_CACHE, NULL); - g_object_add_weak_pointer (G_OBJECT (instance), (gpointer *)&instance); - } - - return instance; + return shell_global_get_app_cache (shell_global_get ()); } static void diff --git a/src/shell-app-system.c b/src/shell-app-system.c index a5b76362d..f9d74ed5c 100644 --- a/src/shell-app-system.c +++ b/src/shell-app-system.c @@ -308,12 +308,7 @@ shell_app_system_finalize (GObject *object) ShellAppSystem * shell_app_system_get_default (void) { - static ShellAppSystem *instance = NULL; - - if (instance == NULL) - instance = g_object_new (SHELL_TYPE_APP_SYSTEM, NULL); - - return instance; + return shell_global_get_app_system (shell_global_get ()); } /** diff --git a/src/shell-app-usage.c b/src/shell-app-usage.c index 8cbebed88..aaaabd989 100644 --- a/src/shell-app-usage.c +++ b/src/shell-app-usage.c @@ -763,10 +763,5 @@ on_enable_monitoring_key_changed (GSettings *settings, ShellAppUsage * shell_app_usage_get_default (void) { - static ShellAppUsage *instance; - - if (instance == NULL) - instance = g_object_new (SHELL_TYPE_APP_USAGE, NULL); - - return instance; + return shell_global_get_app_usage (shell_global_get ()); } diff --git a/src/shell-global-private.h b/src/shell-global-private.h index a0834af8e..613250060 100644 --- a/src/shell-global-private.h +++ b/src/shell-global-private.h @@ -6,6 +6,8 @@ #include +#include "shell-app-cache-private.h" + void _shell_global_init (const char *first_property_name, ...); void _shell_global_set_plugin (ShellGlobal *global, @@ -15,6 +17,8 @@ void _shell_global_destroy_gjs_context (ShellGlobal *global); GjsContext *_shell_global_get_gjs_context (ShellGlobal *global); +ShellAppCache * shell_global_get_app_cache (ShellGlobal *global); + gboolean _shell_global_check_xdnd_event (ShellGlobal *global, XEvent *xev); diff --git a/src/shell-global.c b/src/shell-global.c index 0f0589e27..aae9469ab 100644 --- a/src/shell-global.c +++ b/src/shell-global.c @@ -39,6 +39,8 @@ #include "shell-global-private.h" #include "shell-perf-log.h" #include "shell-window-tracker.h" +#include "shell-app-usage.h" +#include "shell-app-cache-private.h" #include "shell-wm.h" #include "shell-util.h" #include "st.h" @@ -72,6 +74,11 @@ struct _ShellGlobal { GFile *userdatadir_path; GFile *runtime_state_path; + ShellWindowTracker *window_tracker; + ShellAppSystem *app_system; + ShellAppCache *app_cache; + ShellAppUsage *app_usage; + StFocusManager *focus_manager; guint work_count; @@ -479,6 +486,11 @@ shell_global_finalize (GObject *object) g_clear_object (&global->js_context); g_object_unref (global->settings); + g_clear_object (&global->window_tracker); + g_clear_object (&global->app_system); + g_clear_object (&global->app_cache); + g_clear_object (&global->app_usage); + the_object = NULL; g_cancellable_cancel (global->switcheroo_cancellable); @@ -720,6 +732,7 @@ _shell_global_init (const char *first_property_name, ShellGlobal * shell_global_get (void) { + g_return_val_if_fail (the_object, NULL); return the_object; } @@ -1915,3 +1928,63 @@ _shell_global_notify_shutdown (ShellGlobal *global) { g_signal_emit (global, shell_global_signals[SHUTDOWN], 0); } + +/** + * shell_global_get_window_tracker: + * + * Gets window tracker. + * + * Return value: (transfer none): the window tracker + */ +ShellWindowTracker * +shell_global_get_window_tracker (ShellGlobal *global) +{ + if (!global->window_tracker) + global->window_tracker = g_object_new (SHELL_TYPE_WINDOW_TRACKER, NULL); + return global->window_tracker; +} + +/** + * shell_global_get_app_system: + * + * Gets app system. + * + * Return value: (transfer none): the app system + */ +ShellAppSystem * +shell_global_get_app_system (ShellGlobal *global) +{ + if (!global->app_system) + global->app_system = g_object_new (SHELL_TYPE_APP_SYSTEM, NULL); + return global->app_system; +} + +/** + * shell_global_get_app_cache: + * + * Gets app cache. + * + * Return value: (transfer none): the app cache + */ +ShellAppCache * +shell_global_get_app_cache (ShellGlobal *global) +{ + if (!global->app_cache) + global->app_cache = g_object_new (SHELL_TYPE_APP_CACHE, NULL); + return global->app_cache; +} + +/** + * shell_global_get_app_usage: + * + * Gets app usage. + * + * Return value: (transfer none): the app usage + */ +ShellAppUsage * +shell_global_get_app_usage (ShellGlobal *global) +{ + if (!global->app_usage) + global->app_usage = g_object_new (SHELL_TYPE_APP_USAGE, NULL); + return global->app_usage; +} diff --git a/src/shell-global.h b/src/shell-global.h index beeabdeff..839933023 100644 --- a/src/shell-global.h +++ b/src/shell-global.h @@ -9,6 +9,10 @@ G_BEGIN_DECLS +#include "shell-window-tracker.h" +#include "shell-app-system.h" +#include "shell-app-usage.h" + #define SHELL_TYPE_GLOBAL (shell_global_get_type ()) G_DECLARE_FINAL_TYPE (ShellGlobal, shell_global, SHELL, GLOBAL, GObject) @@ -89,6 +93,12 @@ GVariant * shell_global_get_persistent_state (ShellGlobal *global, const char *property_type, const char *property_name); +ShellWindowTracker * shell_global_get_window_tracker (ShellGlobal *global); + +ShellAppSystem * shell_global_get_app_system (ShellGlobal *global); + +ShellAppUsage * shell_global_get_app_usage (ShellGlobal *global); + G_END_DECLS #endif /* __SHELL_GLOBAL_H__ */ diff --git a/src/shell-window-tracker.c b/src/shell-window-tracker.c index 50ab8f1da..6a7240e47 100644 --- a/src/shell-window-tracker.c +++ b/src/shell-window-tracker.c @@ -824,10 +824,5 @@ shell_startup_sequence_get_app (MetaStartupSequence *sequence) ShellWindowTracker * shell_window_tracker_get_default (void) { - static ShellWindowTracker *instance; - - if (instance == NULL) - instance = g_object_new (SHELL_TYPE_WINDOW_TRACKER, NULL); - - return instance; + return shell_global_get_window_tracker (shell_global_get ()); }