xiterm

simple vte terminal emulator
git clone https://git.ce9e.org/xiterm.git

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();