diff --git a/src/Background/BackgroundSource.vala b/src/Background/BackgroundSource.vala index 095340567..3c7a69838 100644 --- a/src/Background/BackgroundSource.vala +++ b/src/Background/BackgroundSource.vala @@ -1,166 +1,153 @@ -// -// Copyright (C) 2014 Tom Beckmann -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// - -namespace Gala { - public class BackgroundSource : Object { - // list of keys that are actually relevant for us - private const string[] OPTIONS = { - "color-shading-type", - "picture-options", - "picture-uri", - "picture-uri-dark", - "primary-color", - "secondary-color" - }; - - public signal void changed (); - - public Meta.Display display { get; construct; } - public GLib.Settings gnome_background_settings { get; private set; } - - internal int use_count { get; set; default = 0; } - - private GLib.HashTable backgrounds; - private uint[] hash_cache; - private Meta.MonitorManager? monitor_manager; - private GLib.Settings gala_background_settings; - - public bool should_dim { - get { - return ( - Drawing.StyleManager.get_instance ().prefers_color_scheme == DARK && - gala_background_settings.get_boolean ("dim-wallpaper-in-dark-style") - ); - } - } - - public BackgroundSource (Meta.Display display) { - Object (display: display); +/* + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2014 Tom Beckmann + * 2025 elementary, Inc. (https://elementary.io) + */ + +public class Gala.BackgroundSource : Object { + // list of keys that are actually relevant for us + private const string[] OPTIONS = { + "color-shading-type", + "picture-options", + "picture-uri", + "picture-uri-dark", + "primary-color", + "secondary-color" + }; + + public signal void changed (); + + public Meta.Display display { get; construct; } + public GLib.Settings gnome_background_settings { get; private set; } + + internal int use_count { get; set; default = 0; } + + private GLib.HashTable backgrounds; + private uint[] hash_cache; + private Meta.MonitorManager? monitor_manager; + private GLib.Settings gala_background_settings; + + public bool should_dim { + get { + return ( + Drawing.StyleManager.get_instance ().prefers_color_scheme == DARK && + gala_background_settings.get_boolean ("dim-wallpaper-in-dark-style") + ); } + } - construct { - backgrounds = new GLib.HashTable (GLib.direct_hash, GLib.direct_equal); - hash_cache = new uint[OPTIONS.length]; + public BackgroundSource (Meta.Display display) { + Object (display: display); + } - monitor_manager = display.get_context ().get_backend ().get_monitor_manager (); - monitor_manager.monitors_changed.connect (monitors_changed); + construct { + backgrounds = new GLib.HashTable (GLib.direct_hash, GLib.direct_equal); + hash_cache = new uint[OPTIONS.length]; - gala_background_settings = new GLib.Settings ("io.elementary.desktop.background"); - gala_background_settings.changed["dim-wallpaper-in-dark-style"].connect (() => changed ()); + monitor_manager = display.get_context ().get_backend ().get_monitor_manager (); + monitor_manager.monitors_changed.connect (monitors_changed); - Drawing.StyleManager.get_instance ().notify["prefers-color-scheme"].connect (() => changed ()); + gala_background_settings = new GLib.Settings ("io.elementary.desktop.background"); + gala_background_settings.changed["dim-wallpaper-in-dark-style"].connect (() => changed ()); - gnome_background_settings = new GLib.Settings ("org.gnome.desktop.background"); + Drawing.StyleManager.get_instance ().notify["prefers-color-scheme"].connect (() => changed ()); - // unfortunately the settings sometimes tend to fire random changes even though - // nothing actually happened. The code below is used to prevent us from spamming - // new actors all the time, which lead to some problems in other areas of the code - for (int i = 0; i < OPTIONS.length; i++) { - hash_cache[i] = gnome_background_settings.get_value (OPTIONS[i]).hash (); - } + gnome_background_settings = new GLib.Settings ("org.gnome.desktop.background"); - gnome_background_settings.changed.connect ((key) => { - for (int i = 0; i < OPTIONS.length; i++) { - if (key == OPTIONS[i]) { - uint new_hash = gnome_background_settings.get_value (key).hash (); - if (hash_cache[i] != new_hash) { - hash_cache[i] = new_hash; - changed (); - break; - } - } - } - }); + // unfortunately the settings sometimes tend to fire random changes even though + // nothing actually happened. The code below is used to prevent us from spamming + // new actors all the time, which lead to some problems in other areas of the code + for (int i = 0; i < OPTIONS.length; i++) { + hash_cache[i] = gnome_background_settings.get_value (OPTIONS[i]).hash (); } - private void monitors_changed () { - var n = display.get_n_monitors (); - var i = 0; - - backgrounds.foreach_remove ((hash, background) => { - if (i++ < n) { - background.update_resolution (); - return false; - } else { - background.changed.disconnect (background_changed); - background.destroy (); - return true; + gnome_background_settings.changed.connect ((key) => { + for (int i = 0; i < OPTIONS.length; i++) { + if (key == OPTIONS[i]) { + uint new_hash = gnome_background_settings.get_value (key).hash (); + if (hash_cache[i] != new_hash) { + hash_cache[i] = new_hash; + changed (); + break; + } } - }); - } + } + }); + } - public Background get_background (int monitor_index) { - string? filename = null; + private void monitors_changed () { + var n = display.get_n_monitors (); + var i = 0; - var style = gnome_background_settings.get_enum ("picture-options"); - if (style != GDesktop.BackgroundStyle.NONE) { - filename = get_background_path (); + backgrounds.foreach_remove ((hash, background) => { + if (i++ < n) { + background.update_resolution (); + return false; + } else { + background.changed.disconnect (background_changed); + background.destroy (); + return true; } + }); + } - // Animated backgrounds are (potentially) per-monitor, since - // they can have variants that depend on the aspect ratio and - // size of the monitor; for other backgrounds we can use the - // same background object for all monitors. - if (filename == null || !filename.has_suffix (".xml")) - monitor_index = 0; - - 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.insert (monitor_index, background); - } + public Background get_background (int monitor_index) { + string? filename = null; - return background; + var style = gnome_background_settings.get_enum ("picture-options"); + if (style != GDesktop.BackgroundStyle.NONE) { + filename = get_background_path (); } - private string get_background_path () { - if (Drawing.StyleManager.get_instance ().prefers_color_scheme == DARK) { - var uri = gnome_background_settings.get_string ("picture-uri-dark"); - var path = File.new_for_uri (uri).get_path (); - if (FileUtils.test (path, EXISTS)) { - return path; - } - } + // Animated backgrounds are (potentially) per-monitor, since + // they can have variants that depend on the aspect ratio and + // size of the monitor; for other backgrounds we can use the + // same background object for all monitors. + if (filename == null || !filename.has_suffix (".xml")) + monitor_index = 0; + + 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.insert (monitor_index, background); + } + + return background; + } - var uri = gnome_background_settings.get_string ("picture-uri"); + private string get_background_path () { + if (Drawing.StyleManager.get_instance ().prefers_color_scheme == DARK) { + var uri = gnome_background_settings.get_string ("picture-uri-dark"); var path = File.new_for_uri (uri).get_path (); if (FileUtils.test (path, EXISTS)) { return path; } - - return uri; } - private void background_changed (Background background) { - background.changed.disconnect (background_changed); - background.destroy (); - backgrounds.remove (background.monitor_index); + var uri = gnome_background_settings.get_string ("picture-uri"); + var path = File.new_for_uri (uri).get_path (); + if (FileUtils.test (path, EXISTS)) { + return path; } - public void destroy () { - monitor_manager.monitors_changed.disconnect (monitors_changed); - monitor_manager = null; + return uri; + } + + private void background_changed (Background background) { + background.changed.disconnect (background_changed); + background.destroy (); + backgrounds.remove (background.monitor_index); + } - backgrounds.foreach_remove ((hash, background) => { - background.changed.disconnect (background_changed); - background.destroy (); - return true; - }); - } + public void destroy () { + monitor_manager.monitors_changed.disconnect (monitors_changed); + monitor_manager = null; + + backgrounds.foreach_remove ((hash, background) => { + background.changed.disconnect (background_changed); + background.destroy (); + return true; + }); } }