From 80fa88173bbd33ecbe23da4f475622cc40659cf4 Mon Sep 17 00:00:00 2001
From: Mars-Wave <57585293+Mars-Wave@users.noreply.github.com>
Date: Wed, 4 Mar 2026 23:11:26 +0100
Subject: [PATCH] Add a menu toggle for saving to the kanshi config
---
resources/wdisplays.gschema.xml | 3 +++
src/main.c | 24 ++++++++++++++++++++++++
src/outputs.c | 4 +++-
src/wdisplays.h | 1 +
4 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/resources/wdisplays.gschema.xml b/resources/wdisplays.gschema.xml
index 176072c..540885b 100644
--- a/resources/wdisplays.gschema.xml
+++ b/resources/wdisplays.gschema.xml
@@ -10,5 +10,8 @@
true
+
+ false
+
diff --git a/src/main.c b/src/main.c
index 176731d..eaf8026 100644
--- a/src/main.c
+++ b/src/main.c
@@ -904,6 +904,17 @@ static void overlay_selected(GSimpleAction *action, GVariant *param, gpointer da
}
}
+#ifdef WITH_KANSHI
+static void save_kanshi_config_selected(GSimpleAction *action, GVariant *param, gpointer data) {
+ struct wd_state *state = data;
+ if (state->settings != NULL) {
+ g_settings_set_boolean(state->settings, "save-kanshi-config", g_variant_get_boolean(param));
+ }
+ state->save_kanshi_config = g_variant_get_boolean(param);
+ g_simple_action_set_state(action, param);
+}
+#endif
+
static void window_state_changed(GtkWidget *window, GdkEventWindowState *event,
gpointer data) {
struct wd_state *state = data;
@@ -1037,6 +1048,9 @@ static void activate(GtkApplication* app, gpointer user_data) {
state->autoapply = g_settings_get_boolean(state->settings, "auto-apply");
state->capture = g_settings_get_boolean(state->settings, "capture-screens");
state->show_overlay = g_settings_get_boolean(state->settings, "show-overlay");
+#ifdef WITH_KANSHI
+ state->save_kanshi_config = g_settings_get_boolean(state->settings, "save-kanshi-config");
+#endif
}
action = g_simple_action_new_stateful("auto-apply", NULL,
@@ -1054,10 +1068,20 @@ static void activate(GtkApplication* app, gpointer user_data) {
g_signal_connect(overlay_action, "change-state", G_CALLBACK(overlay_selected), state);
g_action_map_add_action(G_ACTION_MAP(main_actions), G_ACTION(overlay_action));
+#ifdef WITH_KANSHI
+ action = g_simple_action_new_stateful("save-kanshi-config", NULL,
+ g_variant_new_boolean(state->save_kanshi_config));
+ g_signal_connect(action, "change-state", G_CALLBACK(save_kanshi_config_selected), state);
+ g_action_map_add_action(G_ACTION_MAP(main_actions), G_ACTION(action));
+#endif
+
GMenu *main_menu = g_menu_new();
g_menu_append(main_menu, "_Automatically Apply Changes", "app.auto-apply");
g_menu_append(main_menu, "_Show Screen Contents", "app.capture-screens");
g_menu_append(main_menu, "_Overlay Screen Names", "app.show-overlay");
+#ifdef WITH_KANSHI
+ g_menu_append(main_menu, "Save to _kanshi Config", "app.save-kanshi-config");
+#endif
gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(state->menu_button), G_MENU_MODEL(main_menu));
gtk_menu_button_set_use_popover(GTK_MENU_BUTTON(state->menu_button), false);
diff --git a/src/outputs.c b/src/outputs.c
index b393feb..f41ee01 100644
--- a/src/outputs.c
+++ b/src/outputs.c
@@ -53,7 +53,9 @@ static void config_handle_succeeded(void *data,
zwlr_output_configuration_v1_destroy(config);
wd_ui_apply_done(pending->state, pending->outputs);
#ifdef WITH_KANSHI
- wd_store_config(pending->state, pending->outputs);
+ if (pending->state->save_kanshi_config) {
+ wd_store_config(pending->state, pending->outputs);
+ }
#endif
destroy_pending(pending);
}
diff --git a/src/wdisplays.h b/src/wdisplays.h
index de77538..83690a2 100644
--- a/src/wdisplays.h
+++ b/src/wdisplays.h
@@ -190,6 +190,7 @@ struct wd_state {
bool autoapply;
bool capture;
bool show_overlay;
+ bool save_kanshi_config;
double zoom;
unsigned int apply_idle;