diff --git a/data/dev.sinty.leafs.gschema.xml b/data/dev.sinty.leafs.gschema.xml
index 8c8d47a..86f4fa2 100644
--- a/data/dev.sinty.leafs.gschema.xml
+++ b/data/dev.sinty.leafs.gschema.xml
@@ -36,15 +36,5 @@
Saved blooms (JSON)
List of registered bloom commands as JSON strings (label, command).
-
-
-
-
-
-
- "system"
- Appearance
- Window appearance when running outside the Singularity desktop: follow the system, or force light or dark.
-
diff --git a/meson.build b/meson.build
index 5c62fec..f2e308d 100644
--- a/meson.build
+++ b/meson.build
@@ -58,7 +58,8 @@ executable('singularity-leafs',
dependencies: [gtk_dep, gee_dep, vte_dep, json_dep, libsingularity_dep,
meson.get_compiler('c').find_library('m', required: true)],
vala_args: ['--pkg=posix'] + develop_vala_args,
- install: true
+ install: true,
+ install_rpath: get_option('prefix') / get_option('libdir')
)
desktop_conf = configuration_data()
diff --git a/src/app.vala b/src/app.vala
index 5bce1c1..20760bd 100644
--- a/src/app.vala
+++ b/src/app.vala
@@ -121,9 +121,11 @@ namespace Singularity.Apps {
// React to font/theme changes live
settings.changed["font-size"].connect ((_k) => apply_settings_to_all ());
settings.changed["font-family"].connect ((_k) => apply_settings_to_all ());
- settings.changed["color-scheme"].connect ((_k) => apply_settings_to_all ());
+ settings.changed["color-scheme"].connect ((_k) => {
+ sync_window_chrome ();
+ apply_settings_to_all ();
+ });
settings.changed["scrollback-lines"].connect ((_k) => apply_settings_to_all ());
- settings.changed["appearance"].connect ((_k) => set_app_appearance (settings.get_string ("appearance")));
// When "auto" theme is active, re-apply whenever system accent or dark-mode changes
desktop_settings = Singularity.Core.safe_settings ("dev.sinty.desktop");
@@ -138,6 +140,7 @@ namespace Singularity.Apps {
});
}
Singularity.Style.ThemeMode.get_default ().changed.connect (() => {
+ sync_window_chrome ();
if (settings.get_string ("color-scheme") == "auto")
apply_settings_to_all ();
});
@@ -146,7 +149,7 @@ namespace Singularity.Apps {
apply_settings_to_all ();
});
- set_app_appearance (settings.get_string ("appearance"));
+ sync_window_chrome ();
}
protected override void activate () {
@@ -433,6 +436,7 @@ namespace Singularity.Apps {
var popover = new Gtk.Popover ();
popover.set_parent (anchor);
popover.has_arrow = true;
+ popover.add_css_class ("context-menu");
var root_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
root_box.set_size_request (290, -1);
@@ -638,15 +642,25 @@ namespace Singularity.Apps {
if (prefs_win != null) { prefs_win.present (); return; }
var page = new Singularity.Widgets.PreferencesPage ();
- var group = new Singularity.Widgets.PreferencesGroup (_("Appearance"));
+ var group = new Singularity.Widgets.PreferencesGroup (_("Terminal"));
+
+ var themes = Singularity.Core.TerminalThemes.get_all ();
+ string[] names = {};
+ foreach (var t in themes) names += t.name;
+ string current = settings.get_string ("color-scheme");
+ string current_name = "";
+ foreach (var t in themes)
+ if (t.id == current) current_name = t.name;
- var theme_row = new Singularity.Widgets.SelectionRow (_("Theme"),
- { _("System"), _("Light"), _("Dark") },
- appearance_label (settings.get_string ("appearance")));
+ var theme_row = new Singularity.Widgets.SelectionRow (_("Theme"), names, current_name);
theme_row.selected.connect ((item) => {
- string tok = appearance_token (item);
- if (settings.get_string ("appearance") != tok)
- settings.set_string ("appearance", tok);
+ foreach (var t in themes) {
+ if (t.name == item) {
+ if (settings.get_string ("color-scheme") != t.id)
+ settings.set_string ("color-scheme", t.id);
+ break;
+ }
+ }
});
group.add_row (theme_row);
page.append_group (group);
@@ -656,18 +670,16 @@ namespace Singularity.Apps {
prefs_win.present ();
}
- private string appearance_label (string tok) {
- switch (tok) {
- case "light": return _("Light");
- case "dark": return _("Dark");
- default: return _("System");
- }
- }
- private string appearance_token (string label) {
- if (label == _("Light")) return "light";
- if (label == _("Dark")) return "dark";
- return "system";
+ private void sync_window_chrome () {
+ string scheme = settings.get_string ("color-scheme");
+ bool dark = scheme == "auto"
+ ? Singularity.Style.ThemeMode.get_default ().app_dark ()
+ : Singularity.Core.TerminalThemes.is_dark_background (
+ (Singularity.Core.TerminalThemes.get_by_id (scheme)
+ ?? Singularity.Core.TerminalThemes.get_by_id ("onedark")).background);
+ Gtk.Settings.get_default ().gtk_application_prefer_dark_theme = dark;
+ Singularity.Style.StyleManager.get_default ().apply_color_scheme (dark);
}
private void apply_settings_to_all () {
@@ -768,6 +780,7 @@ namespace Singularity.Apps {
var popover = new Gtk.Popover ();
popover.set_parent (anchor);
popover.has_arrow = true;
+ popover.add_css_class ("context-menu");
var root_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
root_box.set_size_request (290, -1);
@@ -888,7 +901,7 @@ namespace Singularity.Apps {
provider.load_from_data (LEAFS_CSS.data);
Gtk.StyleContext.add_provider_for_display (
Gdk.Display.get_default (), provider,
- Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
+ Gtk.STYLE_PROVIDER_PRIORITY_USER + 1);
}
private const string LEAFS_CSS = """
@@ -1009,7 +1022,15 @@ namespace Singularity.Apps {
.bloom-terminal {
padding: 30px 12px 8px 12px;
}
- """;
+ /* Hover buttons force a white icon/label color (library CSS); stop
+ it from inheriting into popovers anchored on them (GTK4 popovers
+ are style-tree children of their anchor). */
+ .leafs-window popover.context-menu,
+ .leafs-window popover.context-menu > contents,
+ .leafs-window popover.context-menu * {
+ color: @text_color;
+ }
+ """;
}
}
diff --git a/src/leaf_pane.vala b/src/leaf_pane.vala
index cb2e77e..72a97db 100644
--- a/src/leaf_pane.vala
+++ b/src/leaf_pane.vala
@@ -160,6 +160,7 @@ namespace Singularity.Apps {
hover_controls.add_control (grip_btn);
var add_btn = new Button.from_icon_name ("list-add-symbolic");
+ add_btn.add_css_class ("flat");
add_btn.tooltip_text = _("New leaf / bug");
add_btn.clicked.connect (() => {
_add_menu = new Singularity.Widgets.ContextMenu (add_btn);
@@ -177,19 +178,23 @@ namespace Singularity.Apps {
hover_controls.add_control (add_btn);
ssh_btn = new Button.from_icon_name ("network-server-symbolic");
+ ssh_btn.add_css_class ("flat");
ssh_btn.tooltip_text = _("SSH Sessions");
hover_controls.add_control (ssh_btn);
bloom_btn = new Button.from_icon_name ("window-restore-symbolic");
+ bloom_btn.add_css_class ("flat");
bloom_btn.tooltip_text = _("Blooms");
hover_controls.add_control (bloom_btn);
var settings_btn = new Button.from_icon_name ("emblem-system-symbolic");
+ settings_btn.add_css_class ("flat");
settings_btn.tooltip_text = _("Settings");
settings_btn.clicked.connect (() => settings_requested ());
hover_controls.add_control (settings_btn);
var close_btn = new Button.from_icon_name ("window-close-symbolic");
+ close_btn.add_css_class ("flat");
close_btn.tooltip_text = _("Close");
close_btn.clicked.connect (() => {
_close_menu = new Singularity.Widgets.ContextMenu (close_btn);
@@ -327,7 +332,11 @@ namespace Singularity.Apps {
vte.set_font (font_desc);
vte.set_scrollback_lines (s.get_int ("scrollback-lines"));
- var theme = Singularity.Core.TerminalThemes.get_by_id (s.get_string ("color-scheme"));
+ string scheme = s.get_string ("color-scheme");
+ var theme = (scheme == "auto")
+ ? Singularity.Core.TerminalThemes.make_auto_theme (
+ Singularity.Style.ThemeMode.get_default ().app_dark ())
+ : Singularity.Core.TerminalThemes.get_by_id (scheme);
if (theme == null)
theme = Singularity.Core.TerminalThemes.get_by_id ("onedark");
if (theme != null) {
diff --git a/src/window.vala b/src/window.vala
index 728efe8..fdc351e 100644
--- a/src/window.vala
+++ b/src/window.vala
@@ -15,6 +15,7 @@ namespace Singularity.Apps {
public LeafsWindow (Gtk.Application app) {
Object (application: app);
+ add_css_class ("leafs-window");
#if DEVEL
set_title (_("Leafs (Devel)"));
#else