Refactor theme switcher to use GSubprocess and streamline GSettings usage #1

Merged
arzumify merged 1 commits from scriptod/dconf-theme-switcher:main into main 2024-01-16 13:33:58 +00:00
1 changed files with 43 additions and 28 deletions
Showing only changes of commit 94015a33cb - Show all commits

View File

@ -1,41 +1,57 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <glib.h>
#include <gio/gio.h> #include <gio/gio.h>
#include <stdlib.h> // For system() function
static void light_mode_clicked(GtkWidget *widget, gpointer data) static void restart_wf_panel() {
{ GError *error = NULL;
GSettings *settings = g_settings_new("org.gnome.desktop.interface"); GSubprocess *subprocess = g_subprocess_new(G_SUBPROCESS_FLAGS_NONE, &error, "pkill", "wf-panel", NULL);
g_settings_set_string(settings, "gtk-theme", "Adwaita");
g_settings_set_string(settings, "color-scheme", "prefer-light");
g_object_unref(settings);
settings = g_settings_new("org.gnome.desktop.wm.preferences"); if (!subprocess) {
g_settings_set_string(settings, "theme", "Adwaita"); g_printerr("Failed to kill wf-panel: %s\n", error->message);
g_object_unref(settings); g_clear_error(&error);
return;
}
// Restart and fork wf-panel into the background g_subprocess_wait_async(subprocess, NULL, NULL, NULL);
system("pkill wf-panel"); g_object_unref(subprocess);
system("wf-panel &");
subprocess = g_subprocess_new(G_SUBPROCESS_FLAGS_NONE, &error, "wf-panel", "&", NULL);
if (!subprocess) {
g_printerr("Failed to start wf-panel: %s\n", error->message);
g_clear_error(&error);
} else {
g_object_unref(subprocess);
}
} }
static void dark_mode_clicked(GtkWidget *widget, gpointer data) static void switch_theme(const gchar *gtk_theme, const gchar *wm_theme, const gchar *color_scheme) {
{ GSettings *interface_settings = g_settings_new("org.gnome.desktop.interface");
GSettings *settings = g_settings_new("org.gnome.desktop.interface"); GSettings *wm_settings = g_settings_new("org.gnome.desktop.wm.preferences");
g_settings_set_string(settings, "gtk-theme", "Adwaita-dark");
g_settings_set_string(settings, "color-scheme", "prefer-dark");
g_object_unref(settings);
settings = g_settings_new("org.gnome.desktop.wm.preferences"); g_settings_set_string(interface_settings, "gtk-theme", gtk_theme);
g_settings_set_string(settings, "theme", "Adwaita-dark"); g_settings_set_string(interface_settings, "color-scheme", color_scheme);
g_object_unref(settings); g_settings_set_string(wm_settings, "theme", wm_theme);
// Restart and fork wf-panel into the background g_object_unref(interface_settings);
system("pkill wf-panel"); g_object_unref(wm_settings);
system("wf-panel &");
restart_wf_panel();
} }
int main(int argc, char *argv[]) static void light_mode_clicked(GtkWidget *widget, gpointer data) {
{ (void)widget; // Params is not used
(void)data; // Not used
switch_theme("Adwaita", "Adwaita", "prefer-light");
}
static void dark_mode_clicked(GtkWidget *widget, gpointer data) {
(void)widget; // Not used parameter
(void)data; // Not used parameter, but here is a little secret: I'm gay.
switch_theme("Adwaita-dark", "Adwaita-dark", "prefer-dark");
}
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv); gtk_init(&argc, &argv);
GtkWidget *window; GtkWidget *window;
@ -64,4 +80,3 @@ int main(int argc, char *argv[])
return 0; return 0;
} }