refactor: extract constants, deduplicate defaults, improve config loading

- Define NUM_COMMANDS and DEFAULT_COMMANDS to eliminate repeated arrays
- Initialize commands to NULL and fall back to defaults on config read errors
- Skip empty lines and handle malformed entries gracefully in load_configuration
- Show a "Configuration saved." toast on successful settings save
- Fix window parent lookup via gtk_application_get_active_window
This commit is contained in:
2026-05-20 22:46:10 +02:00
parent c24db4dcbd
commit 13c06c274d
2 changed files with 50 additions and 41 deletions
+4
View File
@@ -1,3 +1,7 @@
ssdd ssdd
resources.c resources.c
resources.h resources.h
# ZaguanBlade local data
.zblade/
.pnpm-store/
+46 -41
View File
@@ -4,6 +4,17 @@
#include <string.h> #include <string.h>
#include "resources.h" #include "resources.h"
#define NUM_COMMANDS 6
static const gchar *DEFAULT_COMMANDS[] = {
"openbox --exit",
"systemctl reboot",
"systemctl poweroff",
"dm-tool switch-to-greeter",
"systemctl suspend",
"systemctl hibernate"
};
// Function declarations // Function declarations
static void execute_command(const gchar *command, GtkWindow *parent); static void execute_command(const gchar *command, GtkWindow *parent);
static void show_settings_dialog(GtkWindow *parent); static void show_settings_dialog(GtkWindow *parent);
@@ -100,7 +111,7 @@ static void show_settings_tab(GtkWidget *box) {
"Hibernate Command" "Hibernate Command"
}; };
gchar *commands[6]; gchar *commands[NUM_COMMANDS];
load_configuration(commands); load_configuration(commands);
GtkWidget *grid = gtk_grid_new(); GtkWidget *grid = gtk_grid_new();
@@ -108,9 +119,9 @@ static void show_settings_tab(GtkWidget *box) {
gtk_grid_set_column_spacing(GTK_GRID(grid), 10); gtk_grid_set_column_spacing(GTK_GRID(grid), 10);
gtk_box_append(GTK_BOX(box), grid); gtk_box_append(GTK_BOX(box), grid);
GtkWidget **entries = g_new(GtkWidget*, 6); GtkWidget **entries = g_new(GtkWidget*, NUM_COMMANDS);
for (int i = 0; i < 6; i++) { for (int i = 0; i < NUM_COMMANDS; i++) {
GtkWidget *label = gtk_label_new(labels[i]); GtkWidget *label = gtk_label_new(labels[i]);
GtkWidget *entry = gtk_entry_new(); GtkWidget *entry = gtk_entry_new();
gtk_editable_set_text(GTK_EDITABLE(entry), commands[i]); gtk_editable_set_text(GTK_EDITABLE(entry), commands[i]);
@@ -128,20 +139,25 @@ static void show_settings_tab(GtkWidget *box) {
g_signal_connect(save_button, "clicked", G_CALLBACK(on_save_button_clicked), NULL); g_signal_connect(save_button, "clicked", G_CALLBACK(on_save_button_clicked), NULL);
gtk_box_append(GTK_BOX(box), save_button); gtk_box_append(GTK_BOX(box), save_button);
for (int i = 0; i < 6; i++) { for (int i = 0; i < NUM_COMMANDS; i++) {
g_free(commands[i]); g_free(commands[i]);
} }
} }
static void on_save_button_clicked(GtkButton *button, gpointer user_data) { static void on_save_button_clicked(GtkButton *button, gpointer user_data) {
GtkWidget **entries = g_object_get_data(G_OBJECT(button), "entries"); GtkWidget **entries = g_object_get_data(G_OBJECT(button), "entries");
const gchar *commands[6]; const gchar *commands[NUM_COMMANDS];
for (int i = 0; i < 6; i++) { for (int i = 0; i < NUM_COMMANDS; i++) {
commands[i] = gtk_editable_get_text(GTK_EDITABLE(entries[i])); commands[i] = gtk_editable_get_text(GTK_EDITABLE(entries[i]));
} }
save_configuration(commands); save_configuration(commands);
GtkWidget *toast = gtk_label_new("Configuration saved.");
gtk_widget_set_halign(toast, GTK_ALIGN_CENTER);
GtkWidget *box = gtk_widget_get_parent(GTK_WIDGET(button));
gtk_box_append(GTK_BOX(box), toast);
} }
static void show_about_tab(GtkWidget *box) { static void show_about_tab(GtkWidget *box) {
@@ -155,7 +171,7 @@ static void show_about_tab(GtkWidget *box) {
"<b>Description:</b> A Simple ShutDown Dialog for Openbox.\n"; "<b>Description:</b> A Simple ShutDown Dialog for Openbox.\n";
image = gtk_image_new_from_resource("/org/gtk/ssdd/ssdd-icon.png"); image = gtk_image_new_from_resource("/org/gtk/ssdd/ssdd-icon.png");
gtk_image_set_pixel_size(GTK_IMAGE(image), 250); gtk_image_set_pixel_size(GTK_IMAGE(image), 128);
gtk_box_append(GTK_BOX(box), image); gtk_box_append(GTK_BOX(box), image);
label = gtk_label_new(NULL); label = gtk_label_new(NULL);
@@ -170,7 +186,7 @@ static void button_clicked(GtkWidget *widget, gpointer data) {
const gchar *command = (const gchar *)data; const gchar *command = (const gchar *)data;
const gchar *label = g_object_get_data(G_OBJECT(widget), "label"); const gchar *label = g_object_get_data(G_OBJECT(widget), "label");
GtkApplication *app = g_object_get_data(G_OBJECT(widget), "app"); GtkApplication *app = g_object_get_data(G_OBJECT(widget), "app");
GtkWindow *parent_window = GTK_WINDOW(gtk_widget_get_root(widget)); GtkWindow *parent_window = GTK_WINDOW(gtk_application_get_active_window(app));
if (g_strcmp0(command, "exit") == 0) { if (g_strcmp0(command, "exit") == 0) {
g_application_quit(G_APPLICATION(app)); g_application_quit(G_APPLICATION(app));
@@ -289,44 +305,40 @@ static void load_configuration(gchar *commands[]) {
gchar *config_dir = get_config_dir(); gchar *config_dir = get_config_dir();
gchar *config_path = get_config_path(); gchar *config_path = get_config_path();
// Initialize all commands to NULL before anything else
for (int i = 0; i < NUM_COMMANDS; i++) {
commands[i] = NULL;
}
g_mkdir_with_parents(config_dir, 0755); g_mkdir_with_parents(config_dir, 0755);
if (!g_file_test(config_path, G_FILE_TEST_EXISTS)) { if (!g_file_test(config_path, G_FILE_TEST_EXISTS)) {
g_warning("Configuration file not found. Generating a default configuration."); g_warning("Configuration file not found. Generating a default configuration.");
const gchar *default_commands[] = { save_configuration(DEFAULT_COMMANDS);
"openbox --exit",
"systemctl reboot",
"systemctl poweroff",
"dm-tool switch-to-greeter",
"systemctl suspend",
"systemctl hibernate"
};
save_configuration(default_commands);
} }
if (!g_file_get_contents(config_path, &config_data, NULL, &error)) { if (!g_file_get_contents(config_path, &config_data, NULL, &error)) {
g_warning("Failed to load configuration: %s", error->message); g_warning("Failed to load configuration: %s", error->message);
g_error_free(error); g_error_free(error);
// Fall back to defaults after read failure
for (int i = 0; i < NUM_COMMANDS; i++) {
commands[i] = g_strdup(DEFAULT_COMMANDS[i]);
}
g_free(config_dir); g_free(config_dir);
g_free(config_path); g_free(config_path);
return; return;
} }
gchar **lines = g_strsplit(config_data, "\n", -1); gchar **lines = g_strsplit(config_data, "\n", -1);
for (int i = 0; i < 6; i++) { for (int i = 0; lines[i] != NULL; i++) {
if (g_strcmp0(lines[i], "") == 0) {
continue;
}
gchar **key_value = g_strsplit(lines[i], "=", 2); gchar **key_value = g_strsplit(lines[i], "=", 2);
if (!key_value[0] || !key_value[1]) { if (!key_value[0] || !key_value[1]) {
g_warning("Invalid entry in configuration file at line %d. Using default command.", i + 1); g_warning("Invalid entry in configuration file at line %d.", i + 1);
const gchar *default_commands[] = {
"openbox --exit",
"systemctl reboot",
"systemctl poweroff",
"dm-tool switch-to-greeter",
"systemctl suspend",
"systemctl hibernate"
};
commands[i] = g_strdup(default_commands[i]);
g_strfreev(key_value); g_strfreev(key_value);
continue; continue;
} }
@@ -350,18 +362,11 @@ static void load_configuration(gchar *commands[]) {
g_strfreev(key_value); g_strfreev(key_value);
} }
for (int i = 0; i < 6; i++) { // Fill any remaining NULL entries with defaults
for (int i = 0; i < NUM_COMMANDS; i++) {
if (commands[i] == NULL || g_strcmp0(commands[i], "") == 0) { if (commands[i] == NULL || g_strcmp0(commands[i], "") == 0) {
g_warning("Command at index %d is invalid. Assigning default value.", i); g_free(commands[i]);
const gchar *default_commands[] = { commands[i] = g_strdup(DEFAULT_COMMANDS[i]);
"openbox --exit",
"systemctl reboot",
"systemctl poweroff",
"dm-tool switch-to-greeter",
"systemctl suspend",
"systemctl hibernate"
};
commands[i] = g_strdup(default_commands[i]);
} }
} }
@@ -374,7 +379,7 @@ static void load_configuration(gchar *commands[]) {
static void activate(GtkApplication *app, gpointer user_data) { static void activate(GtkApplication *app, gpointer user_data) {
GtkWidget *window; GtkWidget *window;
GtkWidget *grid; GtkWidget *grid;
gchar *commands[6]; gchar *commands[NUM_COMMANDS];
load_configuration(commands); load_configuration(commands);
const gchar *icons[] = { const gchar *icons[] = {
@@ -411,7 +416,7 @@ static void activate(GtkApplication *app, gpointer user_data) {
gtk_widget_set_margin_end(grid, 10); gtk_widget_set_margin_end(grid, 10);
gtk_window_set_child(GTK_WINDOW(window), grid); gtk_window_set_child(GTK_WINDOW(window), grid);
for (int i = 0; i < 6; i++) { for (int i = 0; i < NUM_COMMANDS; i++) {
create_button(grid, app, labels[i], icons[i], commands[i], i); create_button(grid, app, labels[i], icons[i], commands[i], i);
g_free(commands[i]); g_free(commands[i]);
} }