BackgroundSource: Keep a reference to the monitor manager (#1767)

This commit is contained in:
Corentin Noël 2023-09-29 10:56:57 +02:00 committed by GitHub
parent 5f3245ead8
commit f771b2a4ff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -35,18 +35,19 @@ namespace Gala {
internal int use_count { get; set; default = 0; } internal int use_count { get; set; default = 0; }
private Gee.HashMap<int,Background> backgrounds; private GLib.HashTable<int, Background> backgrounds;
private uint[] hash_cache; private uint[] hash_cache;
private Meta.MonitorManager? monitor_manager;
public BackgroundSource (Meta.Display display, string settings_schema) { public BackgroundSource (Meta.Display display, string settings_schema) {
Object (display: display, settings: new Settings (settings_schema)); Object (display: display, settings: new Settings (settings_schema));
} }
construct { construct {
backgrounds = new Gee.HashMap<int,Background> (); backgrounds = new GLib.HashTable<int, Background> (GLib.direct_hash, GLib.direct_equal);
hash_cache = new uint[OPTIONS.length]; 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); monitor_manager.monitors_changed.connect (monitors_changed);
// unfortunately the settings sometimes tend to fire random changes even though // unfortunately the settings sometimes tend to fire random changes even though
@ -77,17 +78,16 @@ namespace Gala {
var n = display.get_n_monitors (); var n = display.get_n_monitors ();
var i = 0; var i = 0;
foreach (var background in backgrounds.values) { backgrounds.foreach_remove ((hash, background) => {
if (i++ < n) { if (i++ < n) {
background.update_resolution (); 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) { public Background get_background (int monitor_index) {
@ -105,13 +105,14 @@ namespace Gala {
if (filename == null || !filename.has_suffix (".xml")) if (filename == null || !filename.has_suffix (".xml"))
monitor_index = 0; monitor_index = 0;
if (!backgrounds.has_key (monitor_index)) { var background = backgrounds.lookup (monitor_index);
var background = new Background (display, monitor_index, filename, this, (GDesktop.BackgroundStyle) style); if (background == null) {
background = new Background (display, monitor_index, filename, this, (GDesktop.BackgroundStyle) style);
background.changed.connect (background_changed); 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 () { private string get_background_path () {
@ -135,17 +136,18 @@ namespace Gala {
private void background_changed (Background background) { private void background_changed (Background background) {
background.changed.disconnect (background_changed); background.changed.disconnect (background_changed);
background.destroy (); background.destroy ();
backgrounds.unset (background.monitor_index); backgrounds.remove (background.monitor_index);
} }
public void destroy () { public void destroy () {
unowned var monitor_manager = display.get_context ().get_backend ().get_monitor_manager ();
monitor_manager.monitors_changed.disconnect (monitors_changed); 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.changed.disconnect (background_changed);
background.destroy (); background.destroy ();
} return true;
});
} }
} }
} }