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:
@@ -1,3 +1,7 @@
|
|||||||
ssdd
|
ssdd
|
||||||
resources.c
|
resources.c
|
||||||
resources.h
|
resources.h
|
||||||
|
|
||||||
|
# ZaguanBlade local data
|
||||||
|
.zblade/
|
||||||
|
.pnpm-store/
|
||||||
|
|||||||
@@ -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]);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user