- commit
- 27a1f753035ec6cf3247ce6765782dbe543a14df
- parent
- cf2b783759464e9667f4a3f8273420563ced7843
- Author
- Tobias Bengfort <tobias.bengfort@posteo.de>
- Date
- 2025-10-23 05:12
workaround: always use portal for color-scheme
Diffstat
| M | portal.h | 71 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| M | xiterm.c | 11 | ----------- |
2 files changed, 71 insertions, 11 deletions
diff --git a/portal.h b/portal.h
@@ -3,7 +3,10 @@ 3 3 #include <string.h> 4 4 #include <gio/gio.h> 5 5 -1 6 #define PREFER_DARK 1 -1 7 6 8 static GDBusProxy *openuri_portal; -1 9 static GDBusProxy *settings_portal; 7 10 8 11 static GDBusProxy *get_portal(const char *iface) { 9 12 GError *error = NULL; @@ -28,14 +31,82 @@ static GDBusProxy *get_portal(const char *iface) { 28 31 return proxy; 29 32 } 30 33 -1 34 static void set_color_scheme(GVariant *scheme) { -1 35 unsigned int value = -1; -1 36 -1 37 g_variant_get(scheme, "u", &value); -1 38 g_object_set( -1 39 gtk_settings_get_default(), -1 40 "gtk-application-prefer-dark-theme", -1 41 value == PREFER_DARK, -1 42 NULL -1 43 ); -1 44 } -1 45 -1 46 static void on_settings_portal( -1 47 GDBusProxy *proxy, -1 48 const char *sender_name, -1 49 const char *signal_name, -1 50 GVariant *parameters, -1 51 GdkScreen *screen -1 52 ) { -1 53 const char *ns; -1 54 const char *key; -1 55 GVariant *value; -1 56 -1 57 if (strcmp(signal_name, "SettingChanged") == 0) { -1 58 g_variant_get(parameters, "(&s&sv)", &ns, &key, &value); -1 59 if (!strcmp(ns, "org.freedesktop.appearance") && !strcmp(key, "color-scheme")) { -1 60 set_color_scheme(value); -1 61 } -1 62 g_variant_unref(value); -1 63 } -1 64 } -1 65 -1 66 static void setup_color_scheme(void) { -1 67 GVariant *raw, *scheme; -1 68 -1 69 if (settings_portal) { -1 70 g_signal_connect( -1 71 settings_portal, -1 72 "g-signal", -1 73 G_CALLBACK(on_settings_portal), -1 74 NULL -1 75 ); -1 76 -1 77 raw = g_dbus_proxy_call_sync( -1 78 settings_portal, -1 79 "ReadOne", -1 80 g_variant_new("(ss)", "org.freedesktop.appearance", "color-scheme"), -1 81 G_DBUS_CALL_FLAGS_NONE, -1 82 -1, -1 83 NULL, -1 84 NULL -1 85 ); -1 86 if (raw) { -1 87 g_variant_get(raw, "(v)", &scheme); -1 88 if (scheme) { -1 89 set_color_scheme(scheme); -1 90 g_variant_unref(scheme); -1 91 } -1 92 g_variant_unref(raw); -1 93 } -1 94 } -1 95 } -1 96 31 97 void portal_setup(void) { 32 98 openuri_portal = get_portal("org.freedesktop.portal.OpenURI"); -1 99 settings_portal = get_portal("org.freedesktop.portal.Settings"); -1 100 setup_color_scheme(); 33 101 } 34 102 35 103 void portal_finalize(void) { 36 104 if (openuri_portal) { 37 105 g_clear_object(&openuri_portal); 38 106 } -1 107 if (settings_portal) { -1 108 g_clear_object(&settings_portal); -1 109 } 39 110 } 40 111 41 112 void open_uri(const char *uri) {
diff --git a/xiterm.c b/xiterm.c
@@ -78,12 +78,6 @@ void on_term_exit(VteTerminal *term, int status, gpointer user_data) {
78 78 }
79 79 }
80 80
81 -1 void on_color_scheme_changed(GSettings *settings, gchar *key, gpointer user_data) {
82 -1 gchar *value = g_settings_get_string(settings, key);
83 -1 int prefer_dark = strcmp(value, "prefer-dark") == 0;
84 -1 g_object_set(gtk_settings_get_default(), "gtk-application-prefer-dark-theme", prefer_dark, NULL);
85 -1 }
86 -1
87 81 VteTerminal *get_current_term(void) {
88 82 int page_num;
89 83
@@ -201,7 +195,6 @@ int main(int argc, char **argv) {
201 195 char command[128] = "";
202 196 GError *err = NULL;
203 197 GtkWidget *widget;
204 -1 GSettings *settings;
205 198
206 199 if (argc > 1) {
207 200 if (strcmp(argv[1], "-e") != 0) {
@@ -235,10 +228,6 @@ int main(int argc, char **argv) {
235 228 g_signal_connect(GTK_WIDGET(window), "key-press-event", G_CALLBACK(on_key), NULL);
236 229 g_signal_connect(GTK_WIDGET(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
237 230
238 -1 settings = g_settings_new("org.gnome.desktop.interface");
239 -1 g_signal_connect(settings, "changed::color-scheme", G_CALLBACK(on_color_scheme_changed), NULL);
240 -1 on_color_scheme_changed(settings, "color-scheme", NULL);
241 -1
242 231 portal_setup();
243 232
244 233 widget = gtk_notebook_new();