From f771b2a4ff83fa6839255cef755720de35f12978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Corentin=20No=C3=ABl?= Date: Fri, 29 Sep 2023 10:56:57 +0200 Subject: [PATCH] BackgroundSource: Keep a reference to the monitor manager (#1767) --- src/Background/BackgroundSource.vala | 40 +++++++++++++++------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/Background/BackgroundSource.vala b/src/Background/BackgroundSource.vala index 7a1945df..46f16577 100644 --- a/src/Background/BackgroundSource.vala +++ b/src/Background/BackgroundSource.vala @@ -35,18 +35,19 @@ namespace Gala { internal int use_count { get; set; default = 0; } - private Gee.HashMap backgrounds; + private GLib.HashTable backgrounds; private uint[] hash_cache; + private Meta.MonitorManager? monitor_manager; public BackgroundSource (Meta.Display display, string settings_schema) { Object (display: display, settings: new Settings (settings_schema)); } construct { - backgrounds = new Gee.HashMap (); + backgrounds = new GLib.HashTable (GLib.direct_hash, GLib.direct_equal); hash_cache = new uint[OPTIONS.length]; - unowned var monitor_manager = display.get_context ().get_backend ().get_monitor_manager (); + monitor_manager = display.get_context ().get_backend ().get_monitor_manager (); monitor_manager.monitors_changed.connect (monitors_changed); // unfortunately the settings sometimes tend to fire random changes even though @@ -77,17 +78,16 @@ namespace Gala { var n = display.get_n_monitors (); var i = 0; - foreach (var background in backgrounds.values) { + backgrounds.foreach_remove ((hash, background) => { if (i++ < n) { background.update_resolution (); - continue; + return false; + } else { + background.changed.disconnect (background_changed); + background.destroy (); + return true; } - - background.changed.disconnect (background_changed); - background.destroy (); - // TODO can we remove from a list while iterating? - backgrounds.unset (i); - } + }); } public Background get_background (int monitor_index) { @@ -105,13 +105,14 @@ namespace Gala { if (filename == null || !filename.has_suffix (".xml")) monitor_index = 0; - if (!backgrounds.has_key (monitor_index)) { - var background = new Background (display, monitor_index, filename, this, (GDesktop.BackgroundStyle) style); + var background = backgrounds.lookup (monitor_index); + if (background == null) { + background = new Background (display, monitor_index, filename, this, (GDesktop.BackgroundStyle) style); background.changed.connect (background_changed); - backgrounds[monitor_index] = background; + backgrounds.insert (monitor_index, background); } - return backgrounds[monitor_index]; + return background; } private string get_background_path () { @@ -135,17 +136,18 @@ namespace Gala { private void background_changed (Background background) { background.changed.disconnect (background_changed); background.destroy (); - backgrounds.unset (background.monitor_index); + backgrounds.remove (background.monitor_index); } public void destroy () { - unowned var monitor_manager = display.get_context ().get_backend ().get_monitor_manager (); monitor_manager.monitors_changed.disconnect (monitors_changed); + monitor_manager = null; - foreach (var background in backgrounds.values) { + backgrounds.foreach_remove ((hash, background) => { background.changed.disconnect (background_changed); background.destroy (); - } + return true; + }); } } }