From b7128d2252071bc461c648732b830f1ef83ed038 Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Thu, 19 Sep 2024 01:13:07 +0200 Subject: [PATCH 01/13] Introduce a style manager --- lib/Init.vala | 70 +----------------------- lib/StyleManager.vala | 121 ++++++++++++++++++++++++++++++++++++++++++ lib/meson.build | 1 + 3 files changed, 123 insertions(+), 69 deletions(-) create mode 100644 lib/StyleManager.vala diff --git a/lib/Init.vala b/lib/Init.vala index 98472c582..f32a87bad 100644 --- a/lib/Init.vala +++ b/lib/Init.vala @@ -23,78 +23,10 @@ namespace Granite { typeof (Granite.Settings).ensure (); - unowned var display_manager = Gdk.DisplayManager.@get (); - display_manager.display_opened.connect (register_display); - - foreach (unowned var display in display_manager.list_displays ()) { - register_display (display); - } + Granite.StyleManager.get_instance (); // Make sure everything is being set up there GLib.Intl.bindtextdomain (Granite.GETTEXT_PACKAGE, Granite.LOCALEDIR); GLib.Intl.bind_textdomain_codeset (Granite.GETTEXT_PACKAGE, "UTF-8"); initialized = true; } - - private static void register_display (Gdk.Display display) { - var gtk_settings = Gtk.Settings.get_for_display (display); - gtk_settings.notify["gtk-application-prefer-dark-theme"].connect (() => { - set_provider_for_display (display, gtk_settings.gtk_application_prefer_dark_theme); - }); - - set_provider_for_display (display, gtk_settings.gtk_application_prefer_dark_theme); - - var icon_theme = Gtk.IconTheme.get_for_display (display); - icon_theme.add_resource_path ("/io/elementary/granite"); - } - - private static void set_provider_for_display (Gdk.Display display, bool prefer_dark_style) { - if (app_provider == null) { - var base_path = Application.get_default ().resource_base_path; - if (base_path != null) { - var base_uri = "resource://" + base_path; - var base_file = File.new_for_uri (base_uri); - - app_provider = init_provider_from_file (base_file.get_child ("Application.css")); - } - - if (app_provider != null) { - Gtk.StyleContext.add_provider_for_display (display, app_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); - } - } - - if (prefer_dark_style) { - if (base_provider != null) { - Gtk.StyleContext.remove_provider_for_display (display, base_provider); - } - - if (dark_provider == null) { - dark_provider = new Gtk.CssProvider (); - dark_provider.load_from_resource ("/io/elementary/granite/Granite-dark.css"); - } - - Gtk.StyleContext.add_provider_for_display (display, dark_provider, Gtk.STYLE_PROVIDER_PRIORITY_THEME); - } else { - if (dark_provider != null) { - Gtk.StyleContext.remove_provider_for_display (display, dark_provider); - } - - if (base_provider == null) { - base_provider = new Gtk.CssProvider (); - base_provider.load_from_resource ("/io/elementary/granite/Granite.css"); - } - - Gtk.StyleContext.add_provider_for_display (display, base_provider, Gtk.STYLE_PROVIDER_PRIORITY_THEME); - } - } - - private static Gtk.CssProvider? init_provider_from_file (File file) { - if (file.query_exists ()) { - var provider = new Gtk.CssProvider (); - provider.load_from_file (file); - - return provider; - } - - return null; - } } diff --git a/lib/StyleManager.vala b/lib/StyleManager.vala new file mode 100644 index 000000000..a1c3d5bef --- /dev/null +++ b/lib/StyleManager.vala @@ -0,0 +1,121 @@ +/* + * Copyright 2024 elementary, Inc. (https://elementary.io) + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/** + * A class for managing the style of the application. This handles switching light and dark mode based + * based on system preference or application preferene (see {@link color_scheme_override}), etc. + */ +public class Granite.StyleManager : Object { + private static GLib.Once instance; + public static unowned Granite.StyleManager get_instance () { + return instance.once (() => { + return new Granite.StyleManager (); + }); + } + + /** + * If this is set to NO_PREFERENCE the systems preferred color scheme will be used. + * Otherwise the color scheme set here will be used. + */ + public Settings.ColorScheme color_scheme_override { get; set; default = NO_PREFERENCE; } + + private StyleManager () { } + + construct { + unowned var display_manager = Gdk.DisplayManager.@get (); + display_manager.display_opened.connect (register_display); + + foreach (unowned var display in display_manager.list_displays ()) { + register_display (display); + } + + Granite.Settings.get_default ().notify["prefers-color-scheme"].connect (update_color_scheme); + update_color_scheme (); + + notify["color-scheme-override"].connect (update_color_scheme); + } + + private void register_display (Gdk.Display display) { + var gtk_settings = Gtk.Settings.get_for_display (display); + gtk_settings.gtk_application_prefer_dark_theme = prefers_dark (); + gtk_settings.notify["gtk-application-prefer-dark-theme"].connect (() => { + set_provider_for_display (display, gtk_settings.gtk_application_prefer_dark_theme); + }); + + set_provider_for_display (display, gtk_settings.gtk_application_prefer_dark_theme); + + var icon_theme = Gtk.IconTheme.get_for_display (display); + icon_theme.add_resource_path ("/io/elementary/granite"); + } + + private void set_provider_for_display (Gdk.Display display, bool prefer_dark_style) { + if (app_provider == null) { + var base_path = Application.get_default ().resource_base_path; + if (base_path != null) { + var base_uri = "resource://" + base_path; + var base_file = File.new_for_uri (base_uri); + + app_provider = init_provider_from_file (base_file.get_child ("Application.css")); + } + + if (app_provider != null) { + Gtk.StyleContext.add_provider_for_display (display, app_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); + } + } + + if (prefer_dark_style) { + if (base_provider != null) { + Gtk.StyleContext.remove_provider_for_display (display, base_provider); + } + + if (dark_provider == null) { + dark_provider = new Gtk.CssProvider (); + dark_provider.load_from_resource ("/io/elementary/granite/Granite-dark.css"); + } + + Gtk.StyleContext.add_provider_for_display (display, dark_provider, Gtk.STYLE_PROVIDER_PRIORITY_THEME); + } else { + if (dark_provider != null) { + Gtk.StyleContext.remove_provider_for_display (display, dark_provider); + } + + if (base_provider == null) { + base_provider = new Gtk.CssProvider (); + base_provider.load_from_resource ("/io/elementary/granite/Granite.css"); + } + + Gtk.StyleContext.add_provider_for_display (display, base_provider, Gtk.STYLE_PROVIDER_PRIORITY_THEME); + } + } + + private Gtk.CssProvider? init_provider_from_file (File file) { + if (file.query_exists ()) { + var provider = new Gtk.CssProvider (); + provider.load_from_file (file); + + return provider; + } + + return null; + } + + private void update_color_scheme () { + var dark = prefers_dark (); + + foreach (var display in Gdk.DisplayManager.@get ().list_displays ()) { + var gtk_settings = Gtk.Settings.get_for_display (display); + gtk_settings.gtk_application_prefer_dark_theme = dark; + } + } + + private bool prefers_dark () { + if (color_scheme_override == NO_PREFERENCE) { + var granite_settings = Granite.Settings.get_default (); + return granite_settings.prefers_color_scheme == DARK; + } else { + return color_scheme_override == DARK; + } + } +} diff --git a/lib/meson.build b/lib/meson.build index 25d4a1337..8764cf860 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -5,6 +5,7 @@ libgranite_sources = files( 'DateTime.vala', 'Constants.vala', 'Init.vala', + 'StyleManager.vala', 'Services/Application.vala', 'Services/AsyncMutex.vala', From a6f3bcb578249bb5e9b5eb5c270a309f78953b93 Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Thu, 19 Sep 2024 01:14:09 +0200 Subject: [PATCH 02/13] Move providers --- lib/Init.vala | 3 --- lib/StyleManager.vala | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/Init.vala b/lib/Init.vala index f32a87bad..87ba836b9 100644 --- a/lib/Init.vala +++ b/lib/Init.vala @@ -5,9 +5,6 @@ namespace Granite { private static bool initialized = false; - private static Gtk.CssProvider? base_provider = null; - private static Gtk.CssProvider? dark_provider = null; - private static Gtk.CssProvider? app_provider = null; /** * Initializes Granite. diff --git a/lib/StyleManager.vala b/lib/StyleManager.vala index a1c3d5bef..f7ab88819 100644 --- a/lib/StyleManager.vala +++ b/lib/StyleManager.vala @@ -8,6 +8,10 @@ * based on system preference or application preferene (see {@link color_scheme_override}), etc. */ public class Granite.StyleManager : Object { + private static Gtk.CssProvider? base_provider = null; + private static Gtk.CssProvider? dark_provider = null; + private static Gtk.CssProvider? app_provider = null; + private static GLib.Once instance; public static unowned Granite.StyleManager get_instance () { return instance.once (() => { From ec800375ac38f011fde94a989524485c6448b43b Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Thu, 19 Sep 2024 01:33:17 +0200 Subject: [PATCH 03/13] Add demo --- demo/GraniteDemo.vala | 9 ++---- demo/Views/StyleManagerView.vala | 51 ++++++++++++++++++++++++++++++++ demo/meson.build | 1 + 3 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 demo/Views/StyleManagerView.vala diff --git a/demo/GraniteDemo.vala b/demo/GraniteDemo.vala index 9e4d8d305..71b63e0d8 100644 --- a/demo/GraniteDemo.vala +++ b/demo/GraniteDemo.vala @@ -26,6 +26,7 @@ public class Granite.Demo : Gtk.Application { var overlaybar_view = new OverlayBarView (); var toast_view = new ToastView (); var settings_uris_view = new SettingsUrisView (); + var style_manager_view = new StyleManagerView (); var utils_view = new UtilsView (); var placeholder = new WelcomeView (); var dialogs_view = new DialogsView (window); @@ -33,6 +34,7 @@ public class Granite.Demo : Gtk.Application { var main_stack = new Gtk.Stack (); main_stack.add_titled (placeholder, "placeholder", "Placeholder"); + main_stack.add_titled (style_manager_view, "style_manager", "StyleManager"); main_stack.add_titled (accel_label_view, "accel_label", "AccelLabel"); main_stack.add_titled (css_view, "css", "Style Classes"); main_stack.add_titled (date_time_picker_view, "pickers", "Date & Time"); @@ -94,9 +96,6 @@ public class Granite.Demo : Gtk.Application { shrink_start_child = false }; - var granite_settings = Granite.Settings.get_default (); - gtk_settings.gtk_application_prefer_dark_theme = granite_settings.prefers_color_scheme == Granite.Settings.ColorScheme.DARK; - window.child = paned; window.set_default_size (900, 600); window.set_size_request (750, 500); @@ -105,10 +104,6 @@ public class Granite.Demo : Gtk.Application { add_window (window); window.show (); - - granite_settings.notify["prefers-color-scheme"].connect (() => { - gtk_settings.gtk_application_prefer_dark_theme = granite_settings.prefers_color_scheme == Granite.Settings.ColorScheme.DARK; - }); } public static int main (string[] args) { diff --git a/demo/Views/StyleManagerView.vala b/demo/Views/StyleManagerView.vala new file mode 100644 index 000000000..b47b7edff --- /dev/null +++ b/demo/Views/StyleManagerView.vala @@ -0,0 +1,51 @@ +/* + * Copyright 2024 elementary, Inc. (https://elementary.io) + * SPDX-License-Identifier: LGPL-3.0-or-later + */ + +public class StyleManagerView : Gtk.Box { + construct { + var label = new Gtk.Label (_("Override the application theme:")); + + var dont_button = new Gtk.CheckButton.with_label (_("Use system theme")) { + active = true + }; + + var force_light = new Gtk.CheckButton.with_label (_("Force light theme")) { + group = dont_button + }; + + var force_dark = new Gtk.CheckButton.with_label (_("Force dark theme")) { + group = force_light + }; + + halign = CENTER; + valign = CENTER; + orientation = VERTICAL; + spacing = 6; + append (label); + append (dont_button); + append (force_light); + append (force_dark); + + var style_manager = Granite.StyleManager.get_instance (); + + dont_button.toggled.connect (() => { + if (dont_button.active) { + style_manager.color_scheme_override = NO_PREFERENCE; + } + }); + + force_light.toggled.connect (() => { + if (force_light.active) { + style_manager.color_scheme_override = LIGHT; + } + }); + + force_dark.toggled.connect (() => { + if (force_dark.active) { + style_manager.color_scheme_override = DARK; + } + }); + } +} diff --git a/demo/meson.build b/demo/meson.build index 744f89193..bc27e08f1 100644 --- a/demo/meson.build +++ b/demo/meson.build @@ -13,6 +13,7 @@ executable( 'Views/ModeButtonView.vala', 'Views/OverlayBarView.vala', 'Views/SettingsUrisView.vala', + 'Views/StyleManagerView.vala', 'Views/ToastView.vala', 'Views/UtilsView.vala', 'Views/WelcomeView.vala', From c9b3c4edcc62176c0be15a6eeb81af2c36a9e3c4 Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Thu, 19 Sep 2024 01:41:41 +0200 Subject: [PATCH 04/13] Fix typo --- lib/StyleManager.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/StyleManager.vala b/lib/StyleManager.vala index f7ab88819..b2fd5e4fd 100644 --- a/lib/StyleManager.vala +++ b/lib/StyleManager.vala @@ -5,7 +5,7 @@ /** * A class for managing the style of the application. This handles switching light and dark mode based - * based on system preference or application preferene (see {@link color_scheme_override}), etc. + * based on system preference or application preference (see {@link color_scheme_override}), etc. */ public class Granite.StyleManager : Object { private static Gtk.CssProvider? base_provider = null; From ba0ad702afe650bb5c1d588dfd58d5e542ea5d4d Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Thu, 19 Sep 2024 01:54:57 +0200 Subject: [PATCH 05/13] Rename to get_default --- demo/Views/StyleManagerView.vala | 2 +- lib/Init.vala | 2 +- lib/StyleManager.vala | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/demo/Views/StyleManagerView.vala b/demo/Views/StyleManagerView.vala index b47b7edff..610b396c4 100644 --- a/demo/Views/StyleManagerView.vala +++ b/demo/Views/StyleManagerView.vala @@ -28,7 +28,7 @@ public class StyleManagerView : Gtk.Box { append (force_light); append (force_dark); - var style_manager = Granite.StyleManager.get_instance (); + var style_manager = Granite.StyleManager.get_default (); dont_button.toggled.connect (() => { if (dont_button.active) { diff --git a/lib/Init.vala b/lib/Init.vala index 87ba836b9..06a1e35e0 100644 --- a/lib/Init.vala +++ b/lib/Init.vala @@ -20,7 +20,7 @@ namespace Granite { typeof (Granite.Settings).ensure (); - Granite.StyleManager.get_instance (); // Make sure everything is being set up there + Granite.StyleManager.get_default (); // Make sure everything is being set up there GLib.Intl.bindtextdomain (Granite.GETTEXT_PACKAGE, Granite.LOCALEDIR); GLib.Intl.bind_textdomain_codeset (Granite.GETTEXT_PACKAGE, "UTF-8"); diff --git a/lib/StyleManager.vala b/lib/StyleManager.vala index b2fd5e4fd..060929d63 100644 --- a/lib/StyleManager.vala +++ b/lib/StyleManager.vala @@ -13,7 +13,7 @@ public class Granite.StyleManager : Object { private static Gtk.CssProvider? app_provider = null; private static GLib.Once instance; - public static unowned Granite.StyleManager get_instance () { + public static unowned Granite.StyleManager get_default () { return instance.once (() => { return new Granite.StyleManager (); }); From 7ba37e4c53f7c6d322ad9a30c68e8a23dfa6458e Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Thu, 19 Sep 2024 01:58:50 +0200 Subject: [PATCH 06/13] Default to light --- lib/StyleManager.vala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/StyleManager.vala b/lib/StyleManager.vala index 060929d63..2fe77e2fb 100644 --- a/lib/StyleManager.vala +++ b/lib/StyleManager.vala @@ -22,8 +22,9 @@ public class Granite.StyleManager : Object { /** * If this is set to NO_PREFERENCE the systems preferred color scheme will be used. * Otherwise the color scheme set here will be used. + * Default is LIGHT. */ - public Settings.ColorScheme color_scheme_override { get; set; default = NO_PREFERENCE; } + public Settings.ColorScheme color_scheme_override { get; set; default = LIGHT; } private StyleManager () { } From 3768b730d165ea538a367952a8705cba309802e7 Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Thu, 19 Sep 2024 02:49:04 +0200 Subject: [PATCH 07/13] Switch to per display providers --- lib/Init.vala | 7 ++++- lib/StyleManager.vala | 61 ++++++++++++++++++++----------------------- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/lib/Init.vala b/lib/Init.vala index 06a1e35e0..ffc13197e 100644 --- a/lib/Init.vala +++ b/lib/Init.vala @@ -20,7 +20,12 @@ namespace Granite { typeof (Granite.Settings).ensure (); - Granite.StyleManager.get_default (); // Make sure everything is being set up there + unowned var display_manager = Gdk.DisplayManager.@get (); + display_manager.display_opened.connect (StyleManager.init_for_display); + + foreach (unowned var display in display_manager.list_displays ()) { + StyleManager.init_for_display (display); + } GLib.Intl.bindtextdomain (Granite.GETTEXT_PACKAGE, Granite.LOCALEDIR); GLib.Intl.bind_textdomain_codeset (Granite.GETTEXT_PACKAGE, "UTF-8"); diff --git a/lib/StyleManager.vala b/lib/StyleManager.vala index 2fe77e2fb..b0af3c68e 100644 --- a/lib/StyleManager.vala +++ b/lib/StyleManager.vala @@ -12,11 +12,18 @@ public class Granite.StyleManager : Object { private static Gtk.CssProvider? dark_provider = null; private static Gtk.CssProvider? app_provider = null; - private static GLib.Once instance; - public static unowned Granite.StyleManager get_default () { - return instance.once (() => { - return new Granite.StyleManager (); - }); + private static HashTable style_managers_by_displays = new HashTable (null, null); + + public static unowned StyleManager get_default () { + return style_managers_by_displays[Gdk.Display.get_default ()]; + } + + public static unowned StyleManager get_for_display (Gdk.Display display) { + return style_managers_by_displays[display]; + } + + internal static void init_for_display (Gdk.Display display) { + style_managers_by_displays[display] = new StyleManager (display); } /** @@ -26,36 +33,30 @@ public class Granite.StyleManager : Object { */ public Settings.ColorScheme color_scheme_override { get; set; default = LIGHT; } - private StyleManager () { } - - construct { - unowned var display_manager = Gdk.DisplayManager.@get (); - display_manager.display_opened.connect (register_display); - - foreach (unowned var display in display_manager.list_displays ()) { - register_display (display); - } - - Granite.Settings.get_default ().notify["prefers-color-scheme"].connect (update_color_scheme); - update_color_scheme (); + /** + * The Gdk.Display this StyleManager handles. + */ + public Gdk.Display display { get; construct; } - notify["color-scheme-override"].connect (update_color_scheme); + private StyleManager (Gdk.Display display) { + Object (display: display); } - private void register_display (Gdk.Display display) { + construct { var gtk_settings = Gtk.Settings.get_for_display (display); - gtk_settings.gtk_application_prefer_dark_theme = prefers_dark (); - gtk_settings.notify["gtk-application-prefer-dark-theme"].connect (() => { - set_provider_for_display (display, gtk_settings.gtk_application_prefer_dark_theme); - }); + gtk_settings.notify["gtk-application-prefer-dark-theme"].connect (set_provider_for_display); + set_provider_for_display (); - set_provider_for_display (display, gtk_settings.gtk_application_prefer_dark_theme); + var granite_settings = Granite.Settings.get_default (); + granite_settings.notify["prefers-color-scheme"].connect (update_color_scheme); + notify["color-scheme-override"].connect (update_color_scheme); + update_color_scheme (); var icon_theme = Gtk.IconTheme.get_for_display (display); icon_theme.add_resource_path ("/io/elementary/granite"); } - private void set_provider_for_display (Gdk.Display display, bool prefer_dark_style) { + private void set_provider_for_display () { if (app_provider == null) { var base_path = Application.get_default ().resource_base_path; if (base_path != null) { @@ -70,7 +71,7 @@ public class Granite.StyleManager : Object { } } - if (prefer_dark_style) { + if (Gtk.Settings.get_for_display (display).gtk_application_prefer_dark_theme) { if (base_provider != null) { Gtk.StyleContext.remove_provider_for_display (display, base_provider); } @@ -107,12 +108,8 @@ public class Granite.StyleManager : Object { } private void update_color_scheme () { - var dark = prefers_dark (); - - foreach (var display in Gdk.DisplayManager.@get ().list_displays ()) { - var gtk_settings = Gtk.Settings.get_for_display (display); - gtk_settings.gtk_application_prefer_dark_theme = dark; - } + var gtk_settings = Gtk.Settings.get_for_display (display); + gtk_settings.gtk_application_prefer_dark_theme = prefers_dark (); } private bool prefers_dark () { From 447e140da8de44829d53cc3beb4eb64ac45960ae Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Thu, 19 Sep 2024 02:53:15 +0200 Subject: [PATCH 08/13] Cleanup --- lib/StyleManager.vala | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/StyleManager.vala b/lib/StyleManager.vala index b0af3c68e..2a235d033 100644 --- a/lib/StyleManager.vala +++ b/lib/StyleManager.vala @@ -109,15 +109,11 @@ public class Granite.StyleManager : Object { private void update_color_scheme () { var gtk_settings = Gtk.Settings.get_for_display (display); - gtk_settings.gtk_application_prefer_dark_theme = prefers_dark (); - } - - private bool prefers_dark () { if (color_scheme_override == NO_PREFERENCE) { var granite_settings = Granite.Settings.get_default (); - return granite_settings.prefers_color_scheme == DARK; + gtk_settings.gtk_application_prefer_dark_theme = granite_settings.prefers_color_scheme == DARK; } else { - return color_scheme_override == DARK; + gtk_settings.gtk_application_prefer_dark_theme = color_scheme_override == DARK; } } } From 20e12e2cb2f00221b1455e732f6a42311c9c6413 Mon Sep 17 00:00:00 2001 From: Leonhard <106322251+leolost2605@users.noreply.github.com> Date: Thu, 19 Sep 2024 16:07:49 +0200 Subject: [PATCH 09/13] Set NO_PREFERENCE as default --- lib/StyleManager.vala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/StyleManager.vala b/lib/StyleManager.vala index 2a235d033..ccec748eb 100644 --- a/lib/StyleManager.vala +++ b/lib/StyleManager.vala @@ -29,9 +29,9 @@ public class Granite.StyleManager : Object { /** * If this is set to NO_PREFERENCE the systems preferred color scheme will be used. * Otherwise the color scheme set here will be used. - * Default is LIGHT. + * Default is NO_PREFERENCE. */ - public Settings.ColorScheme color_scheme_override { get; set; default = LIGHT; } + public Settings.ColorScheme color_scheme_override { get; set; default = NO_PREFERENCE; } /** * The Gdk.Display this StyleManager handles. From 27fa84f439931e3642c6751f982b40a5b67e2647 Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Thu, 19 Sep 2024 21:04:34 +0200 Subject: [PATCH 10/13] Fix hashtable being null --- lib/StyleManager.vala | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/StyleManager.vala b/lib/StyleManager.vala index ccec748eb..905c888da 100644 --- a/lib/StyleManager.vala +++ b/lib/StyleManager.vala @@ -12,7 +12,7 @@ public class Granite.StyleManager : Object { private static Gtk.CssProvider? dark_provider = null; private static Gtk.CssProvider? app_provider = null; - private static HashTable style_managers_by_displays = new HashTable (null, null); + private static HashTable? style_managers_by_displays; public static unowned StyleManager get_default () { return style_managers_by_displays[Gdk.Display.get_default ()]; @@ -23,6 +23,10 @@ public class Granite.StyleManager : Object { } internal static void init_for_display (Gdk.Display display) { + if (style_managers_by_displays == null) { + style_managers_by_displays = new HashTable (null, null); + } + style_managers_by_displays[display] = new StyleManager (display); } From 432866c6373e04152f5c3c611dbcfa1f97edc556 Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Thu, 19 Sep 2024 21:06:17 +0200 Subject: [PATCH 11/13] Remove switch --- demo/GraniteDemo.vala | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/demo/GraniteDemo.vala b/demo/GraniteDemo.vala index 71b63e0d8..ae1476b1e 100644 --- a/demo/GraniteDemo.vala +++ b/demo/GraniteDemo.vala @@ -48,24 +48,11 @@ public class Granite.Demo : Gtk.Application { main_stack.add_titled (dialogs_view, "dialogs", "Dialogs"); main_stack.add_titled (application_view, "application", "Application"); - var gtk_settings = Gtk.Settings.get_default (); - - var mode_switch = new Granite.ModeSwitch.from_icon_name ( - "display-brightness-symbolic", - "weather-clear-night-symbolic" - ) { - primary_icon_tooltip_text = ("Light background"), - secondary_icon_tooltip_text = ("Dark background"), - valign = CENTER - }; - mode_switch.bind_property ("active", gtk_settings, "gtk-application-prefer-dark-theme", BIDIRECTIONAL); - var end_header = new Gtk.HeaderBar () { show_title_buttons = false }; end_header.add_css_class (Granite.STYLE_CLASS_FLAT); end_header.pack_end (new Gtk.WindowControls (END)); - end_header.pack_end (mode_switch); var end_box = new Gtk.Box (VERTICAL, 0); end_box.append (end_header); From a42891490cf097143b3c8a3c30b7c38546f91168 Mon Sep 17 00:00:00 2001 From: Leonhard <106322251+leolost2605@users.noreply.github.com> Date: Fri, 20 Sep 2024 16:24:21 +0200 Subject: [PATCH 12/13] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Danielle Foré --- demo/Views/StyleManagerView.vala | 8 ++++---- lib/StyleManager.vala | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/demo/Views/StyleManagerView.vala b/demo/Views/StyleManagerView.vala index 610b396c4..d953af9f1 100644 --- a/demo/Views/StyleManagerView.vala +++ b/demo/Views/StyleManagerView.vala @@ -5,17 +5,17 @@ public class StyleManagerView : Gtk.Box { construct { - var label = new Gtk.Label (_("Override the application theme:")); + var label = new Granite.HeaderLabel ("Visual Style"); - var dont_button = new Gtk.CheckButton.with_label (_("Use system theme")) { + var dont_button = new Gtk.CheckButton.with_label ("Follow system setting") { active = true }; - var force_light = new Gtk.CheckButton.with_label (_("Force light theme")) { + var force_light = new Gtk.CheckButton.with_label ("Light") { group = dont_button }; - var force_dark = new Gtk.CheckButton.with_label (_("Force dark theme")) { + var force_dark = new Gtk.CheckButton.with_label ("Dark") { group = force_light }; diff --git a/lib/StyleManager.vala b/lib/StyleManager.vala index 905c888da..88dd25988 100644 --- a/lib/StyleManager.vala +++ b/lib/StyleManager.vala @@ -31,14 +31,14 @@ public class Granite.StyleManager : Object { } /** - * If this is set to NO_PREFERENCE the systems preferred color scheme will be used. - * Otherwise the color scheme set here will be used. - * Default is NO_PREFERENCE. + * The {@link Granite.Settings.ColorScheme} requested by the application + * Uses value from {@link Granite.Settings.prefers_color_scheme} when set to {@link Granite.Settings.ColorScheme.NO_PREFERENCE }. + * Default value is {@link Granite.Settings.ColorScheme.NO_PREFERENCE } */ public Settings.ColorScheme color_scheme_override { get; set; default = NO_PREFERENCE; } /** - * The Gdk.Display this StyleManager handles. + * The {@link Gdk.Display} handled by #this. */ public Gdk.Display display { get; construct; } From 567be91a4e028757e758377190cee30171043864 Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Fri, 20 Sep 2024 16:32:54 +0200 Subject: [PATCH 13/13] Reename color_scheme_override to color_scheme, update some documentation --- demo/Views/StyleManagerView.vala | 6 +++--- lib/StyleManager.vala | 17 ++++++++++++----- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/demo/Views/StyleManagerView.vala b/demo/Views/StyleManagerView.vala index d953af9f1..e00720044 100644 --- a/demo/Views/StyleManagerView.vala +++ b/demo/Views/StyleManagerView.vala @@ -32,19 +32,19 @@ public class StyleManagerView : Gtk.Box { dont_button.toggled.connect (() => { if (dont_button.active) { - style_manager.color_scheme_override = NO_PREFERENCE; + style_manager.color_scheme = NO_PREFERENCE; } }); force_light.toggled.connect (() => { if (force_light.active) { - style_manager.color_scheme_override = LIGHT; + style_manager.color_scheme = LIGHT; } }); force_dark.toggled.connect (() => { if (force_dark.active) { - style_manager.color_scheme_override = DARK; + style_manager.color_scheme = DARK; } }); } diff --git a/lib/StyleManager.vala b/lib/StyleManager.vala index 88dd25988..1b0cc92c3 100644 --- a/lib/StyleManager.vala +++ b/lib/StyleManager.vala @@ -5,7 +5,7 @@ /** * A class for managing the style of the application. This handles switching light and dark mode based - * based on system preference or application preference (see {@link color_scheme_override}), etc. + * based on system preference or application preference (see {@link color_scheme}), etc. */ public class Granite.StyleManager : Object { private static Gtk.CssProvider? base_provider = null; @@ -14,10 +14,17 @@ public class Granite.StyleManager : Object { private static HashTable? style_managers_by_displays; + /** + * Returns the {@link Granite.StyleManager} that handles the default display + * as gotten by {@link Gdk.Display.get_default ()}. + */ public static unowned StyleManager get_default () { return style_managers_by_displays[Gdk.Display.get_default ()]; } + /** + * Returns the {@link Granite.StyleManager} that handles the given {@link Gdk.Display}. + */ public static unowned StyleManager get_for_display (Gdk.Display display) { return style_managers_by_displays[display]; } @@ -35,7 +42,7 @@ public class Granite.StyleManager : Object { * Uses value from {@link Granite.Settings.prefers_color_scheme} when set to {@link Granite.Settings.ColorScheme.NO_PREFERENCE }. * Default value is {@link Granite.Settings.ColorScheme.NO_PREFERENCE } */ - public Settings.ColorScheme color_scheme_override { get; set; default = NO_PREFERENCE; } + public Settings.ColorScheme color_scheme { get; set; default = NO_PREFERENCE; } /** * The {@link Gdk.Display} handled by #this. @@ -53,7 +60,7 @@ public class Granite.StyleManager : Object { var granite_settings = Granite.Settings.get_default (); granite_settings.notify["prefers-color-scheme"].connect (update_color_scheme); - notify["color-scheme-override"].connect (update_color_scheme); + notify["color-scheme"].connect (update_color_scheme); update_color_scheme (); var icon_theme = Gtk.IconTheme.get_for_display (display); @@ -113,11 +120,11 @@ public class Granite.StyleManager : Object { private void update_color_scheme () { var gtk_settings = Gtk.Settings.get_for_display (display); - if (color_scheme_override == NO_PREFERENCE) { + if (color_scheme == NO_PREFERENCE) { var granite_settings = Granite.Settings.get_default (); gtk_settings.gtk_application_prefer_dark_theme = granite_settings.prefers_color_scheme == DARK; } else { - gtk_settings.gtk_application_prefer_dark_theme = color_scheme_override == DARK; + gtk_settings.gtk_application_prefer_dark_theme = color_scheme == DARK; } } }