From 15276f20feb156f9b719bee3d102a4800764c8dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stig-=C3=98rjan=20Smelror?= Date: Sat, 8 Aug 2026 22:59:52 +0200 Subject: [PATCH] Modernize ssdd and bump version to 2.2 --- .gitignore | 3 + Makefile | 24 +- ssdd.c | 907 +++++++++++++++++++++++-------------------------- ssdd.gresource | Bin 0 -> 58568 bytes 4 files changed, 439 insertions(+), 495 deletions(-) create mode 100644 ssdd.gresource diff --git a/.gitignore b/.gitignore index 8925d99..99e952c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ ssdd resources.c resources.h + +# Atlas Scout local data +.atlas/ diff --git a/Makefile b/Makefile index 0c9bcab..acc39c2 100644 --- a/Makefile +++ b/Makefile @@ -2,11 +2,13 @@ CC = gcc # Compiler and optimization flags -CFLAGS ?= -Wall -O2 -CFLAGS += $(shell pkg-config --cflags gtk4) -CFLAGS += -DGDK_VERSION_MAX_ALLOWED=GDK_VERSION_4_0 -DGDK_VERSION_MIN_REQUIRED=GDK_VERSION_4_0 -LDFLAGS ?= -LDFLAGS += $(shell pkg-config --libs gtk4) +CFLAGS ?= -O2 -Wall -Wextra +GTK_CFLAGS := $(shell pkg-config --cflags gtk4) +GTK_LIBS := $(shell pkg-config --libs gtk4) +VERSION_FLAGS = -DGTK_VERSION_MAX_ALLOWED=GTK_VERSION_4_0 \ + -DGTK_VERSION_MIN_REQUIRED=GTK_VERSION_4_0 \ + -DGDK_VERSION_MAX_ALLOWED=GDK_VERSION_4_0 \ + -DGDK_VERSION_MIN_REQUIRED=GDK_VERSION_4_0 # Source files SRC = ssdd.c resources.c @@ -17,7 +19,7 @@ TARGET = ssdd # Resource files RESOURCE_XML = resources.gresource.xml RESOURCE_C = resources.c -RESOURCE_H = resources.h +RESOURCE_FILES = ssdd-icon.png # Installation directories PREFIX ?= /usr/local @@ -28,13 +30,13 @@ DATADIR = $(PREFIX)/share/ssdd all: $(TARGET) # Build the target -$(TARGET): $(RESOURCE_C) $(SRC) - $(CC) $(CFLAGS) -o $(TARGET) $(SRC) $(LDFLAGS) +$(TARGET): $(SRC) + $(CC) $(CPPFLAGS) $(CFLAGS) $(GTK_CFLAGS) $(VERSION_FLAGS) \ + -o $(TARGET) $(SRC) $(LDFLAGS) $(GTK_LIBS) # Compile resources -$(RESOURCE_C) $(RESOURCE_H): $(RESOURCE_XML) +$(RESOURCE_C): $(RESOURCE_XML) $(RESOURCE_FILES) glib-compile-resources $(RESOURCE_XML) --generate-source --target=$(RESOURCE_C) - glib-compile-resources $(RESOURCE_XML) --generate-header --target=$(RESOURCE_H) # Install target install: $(TARGET) @@ -50,6 +52,6 @@ uninstall: # Clean target clean: - rm -f $(TARGET) $(RESOURCE_C) $(RESOURCE_H) + rm -f $(TARGET) $(RESOURCE_C) .PHONY: all clean install uninstall diff --git a/ssdd.c b/ssdd.c index 4585107..bcda8e9 100644 --- a/ssdd.c +++ b/ssdd.c @@ -1,528 +1,467 @@ -#include +#include + #include -#include -#include -#include "resources.h" // Assuming this header declares resources_get_resource() +#include -// Function declarations +#define CONFIG_DIR_NAME "ssdd" +#define CONFIG_FILE_NAME "config" +#define CONFIG_GROUP "Commands" +#define APP_VERSION "2.2" + +typedef enum { + ACTION_LOGOUT, + ACTION_REBOOT, + ACTION_SHUTDOWN, + ACTION_SWITCH_USER, + ACTION_SUSPEND, + ACTION_HIBERNATE, + N_CONFIG_ACTIONS, + ACTION_SETTINGS = N_CONFIG_ACTIONS, + ACTION_EXIT, + N_ACTIONS +} ActionId; + +typedef struct { + const gchar *label; + const gchar *icon_name; + const gchar *config_key; + const gchar *default_command; +} ActionSpec; + +typedef struct { + gchar *commands[N_CONFIG_ACTIONS]; +} AppState; + +typedef struct { + AppState *state; + GtkWidget *entries[N_CONFIG_ACTIONS]; +} SettingsData; + +static const ActionSpec actions[N_ACTIONS] = { + [ACTION_LOGOUT] = {"Logout", "system-log-out-symbolic", "LOGOUT_COMMAND", + "openbox --exit"}, + [ACTION_REBOOT] = {"Reboot", "system-reboot-symbolic", "REBOOT_COMMAND", + "systemctl reboot"}, + [ACTION_SHUTDOWN] = {"Shutdown", "system-shutdown-symbolic", + "SHUTDOWN_COMMAND", "systemctl poweroff"}, + [ACTION_SWITCH_USER] = {"Switch User", "system-users-symbolic", + "SWITCH_USER_COMMAND", "dm-tool switch-to-greeter"}, + [ACTION_SUSPEND] = {"Suspend", "media-playback-pause-symbolic", + "SUSPEND_COMMAND", "systemctl suspend"}, + [ACTION_HIBERNATE] = {"Hibernate", "document-save-symbolic", + "HIBERNATE_COMMAND", "systemctl hibernate"}, + [ACTION_SETTINGS] = {"Settings", "preferences-system-symbolic", NULL, NULL}, + [ACTION_EXIT] = {"Exit", "window-close-symbolic", NULL, NULL}}; + +G_STATIC_ASSERT(G_N_ELEMENTS(actions) == N_ACTIONS); + +static void activate(GtkApplication *app, gpointer user_data); +static void app_state_free(gpointer data); +static void button_clicked(GtkButton *button, gpointer user_data); +static void create_button(GtkWidget *grid, ActionId action_id); static void execute_command(const gchar *command, GtkWindow *parent); -static void show_settings_dialog(GtkWindow *parent); -static void show_about_tab(GtkWidget *box); -static void show_settings_tab(GtkWidget *box); -static void button_clicked(GtkWidget *widget, gpointer data); // data is unused now, could be NULL -static gboolean on_key_pressed(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer user_data); -static void show_confirmation_dialog(GtkWindow *parent_window, const gchar *label, const gchar *command); -static void create_button(GtkWidget *grid, GtkApplication *app, const gchar *label_text, const gchar *icon_name, const gchar *command, int pos); -static void save_configuration(const gchar *commands[]); -static void load_configuration(gchar *commands[]); -static gchar *get_config_path(void); -static gchar *get_config_dir(void); +static gchar *get_config_path(GError **error); +static void load_configuration(AppState *state); +static gboolean on_key_pressed(GtkEventControllerKey *controller, guint keyval, + guint keycode, GdkModifierType state, + gpointer user_data); +static void on_confirmation_response(GtkDialog *dialog, gint response_id, + gpointer user_data); static void on_save_button_clicked(GtkButton *button, gpointer user_data); -static void on_confirmation_response(GtkDialog *dialog, gint response_id, gpointer user_data); +static gboolean save_configuration(const gchar *const commands[], + GError **error); +static void show_about_tab(GtkWidget *box); +static void show_confirmation_dialog(GtkWindow *parent, const gchar *label, + const gchar *command); +static void show_message_dialog(GtkWindow *parent, GtkMessageType type, + GtkButtonsType buttons, const gchar *title, + const gchar *message); +static void show_settings_dialog(GtkWindow *parent, AppState *state); +static void show_settings_tab(GtkWidget *box, AppState *state); -// Gets the configuration directory path (~/.config/ssdd) -static gchar *get_config_dir(void) { - return g_build_filename(g_get_user_config_dir(), "ssdd", NULL); +static void app_state_free(gpointer data) { + AppState *state = data; + + for (guint i = 0; i < N_CONFIG_ACTIONS; i++) + g_free(state->commands[i]); + + g_free(state); } -// Gets the full configuration file path (~/.config/ssdd/config) -// Ensures the directory exists. -static gchar *get_config_path(void) { - gchar *config_dir = get_config_dir(); - // Create the directory if it doesn't exist - g_mkdir_with_parents(config_dir, 0755); - gchar *config_path = g_build_filename(config_dir, "config", NULL); - g_free(config_dir); // Free the dir path returned by get_config_dir - return config_path; +static void app_state_set_command(AppState *state, guint index, + const gchar *command) { + g_return_if_fail(index < N_CONFIG_ACTIONS); + + g_free(state->commands[index]); + state->commands[index] = g_strdup(command); +} + +static gchar *get_config_path(GError **error) { + g_autofree gchar *config_dir = + g_build_filename(g_get_user_config_dir(), CONFIG_DIR_NAME, NULL); + + if (g_mkdir_with_parents(config_dir, 0755) == -1) { + gint saved_errno = errno; + + g_set_error(error, G_FILE_ERROR, g_file_error_from_errno(saved_errno), + "Could not create configuration directory '%s': %s", config_dir, + g_strerror(saved_errno)); + return NULL; + } + + return g_build_filename(config_dir, CONFIG_FILE_NAME, NULL); +} + +static gboolean save_configuration(const gchar *const commands[], + GError **error) { + g_autofree gchar *config_path = get_config_path(error); + g_autoptr(GKeyFile) key_file = NULL; + + if (config_path == NULL) + return FALSE; + + key_file = g_key_file_new(); + + for (guint i = 0; i < N_CONFIG_ACTIONS; i++) { + g_key_file_set_string(key_file, CONFIG_GROUP, actions[i].config_key, + commands[i] != NULL ? commands[i] : ""); + } + + return g_key_file_save_to_file(key_file, config_path, error); +} + +static void load_configuration(AppState *state) { + g_autoptr(GError) error = NULL; + g_autofree gchar *config_path = get_config_path(&error); + g_autoptr(GKeyFile) key_file = g_key_file_new(); + gboolean needs_save = FALSE; + + if (config_path == NULL || + !g_key_file_load_from_file( + key_file, config_path, + G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &error)) { + g_warning("Could not load configuration%s%s. Using defaults.", + error != NULL ? ": " : "", error != NULL ? error->message : ""); + + for (guint i = 0; i < N_CONFIG_ACTIONS; i++) + app_state_set_command(state, i, actions[i].default_command); + + if (config_path != NULL) { + const gchar *commands[N_CONFIG_ACTIONS]; + g_autoptr(GError) save_error = NULL; + + for (guint i = 0; i < N_CONFIG_ACTIONS; i++) + commands[i] = state->commands[i]; + + if (!save_configuration(commands, &save_error)) + g_warning("Could not save default configuration: %s", + save_error->message); + } + return; + } + + for (guint i = 0; i < N_CONFIG_ACTIONS; i++) { + g_autofree gchar *command = g_key_file_get_string( + key_file, CONFIG_GROUP, actions[i].config_key, NULL); + + if (command == NULL || *command == '\0') { + g_warning( + "Configuration key '%s' is missing or empty; using default '%s'", + actions[i].config_key, actions[i].default_command); + app_state_set_command(state, i, actions[i].default_command); + needs_save = TRUE; + } else { + app_state_set_command(state, i, command); + } + } + + if (needs_save) { + const gchar *commands[N_CONFIG_ACTIONS]; + g_autoptr(GError) save_error = NULL; + + for (guint i = 0; i < N_CONFIG_ACTIONS; i++) + commands[i] = state->commands[i]; + + if (!save_configuration(commands, &save_error)) + g_warning("Could not repair configuration: %s", save_error->message); + } +} + +static void show_message_dialog(GtkWindow *parent, GtkMessageType type, + GtkButtonsType buttons, const gchar *title, + const gchar *message) { + GtkWidget *dialog = gtk_message_dialog_new( + parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, type, buttons, + "%s", message); + + gtk_window_set_title(GTK_WINDOW(dialog), title); + g_signal_connect(dialog, "response", G_CALLBACK(gtk_window_destroy), NULL); + gtk_window_present(GTK_WINDOW(dialog)); } -// Executes a shell command asynchronously static void execute_command(const gchar *command, GtkWindow *parent) { - GError *error = NULL; - // Use g_spawn_command_line_async for non-blocking execution - gboolean ret = g_spawn_command_line_async(command, &error); - if (!ret) { - // Format an error message if spawning failed - gchar *error_message = g_strdup_printf("Error executing command:\n'%s'\n\nReason: %s", command, error ? error->message : "Unknown error"); + g_autoptr(GError) error = NULL; - // Show an error dialog - GtkWidget *dialog = gtk_message_dialog_new(parent, - GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - "%s", error_message); - g_signal_connect(dialog, "response", G_CALLBACK(gtk_window_destroy), NULL); - gtk_window_present(GTK_WINDOW(dialog)); + if (!g_spawn_command_line_async(command, &error)) { + g_autofree gchar *message = g_strdup_printf( + "Could not execute:\n'%s'\n\nReason: %s", command, error->message); - g_free(error_message); - if (error) { - g_error_free(error); - } - } + show_message_dialog(parent, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, + "Error Executing Command", message); + } } -// Shows the settings dialog with multiple tabs -static void show_settings_dialog(GtkWindow *parent) { - GtkWidget *dialog; - GtkWidget *content_area; - GtkWidget *notebook; - GtkWidget *settings_tab; - GtkWidget *about_tab; - - // Create the dialog window - dialog = gtk_dialog_new(); - gtk_window_set_title(GTK_WINDOW(dialog), "Settings"); - gtk_window_set_transient_for(GTK_WINDOW(dialog), parent); // Set parent window - gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); // Make dialog modal - gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); // Destroy with parent - - // Get the content area of the dialog (GTK4 uses gtk_window_set_child) - content_area = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_window_set_child(GTK_WINDOW(dialog), content_area); - - // Create a notebook for tabs - notebook = gtk_notebook_new(); - gtk_box_append(GTK_BOX(content_area), notebook); - - // Create and add Settings Tab - settings_tab = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10); // Box for settings content - gtk_widget_set_margin_top(settings_tab, 10); - gtk_widget_set_margin_bottom(settings_tab, 10); - gtk_widget_set_margin_start(settings_tab, 10); - gtk_widget_set_margin_end(settings_tab, 10); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), settings_tab, gtk_label_new("Settings")); - show_settings_tab(settings_tab); // Populate the settings tab - - // Create and add About Tab - about_tab = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10); // Box for about content - gtk_widget_set_margin_top(about_tab, 10); - gtk_widget_set_margin_bottom(about_tab, 10); - gtk_widget_set_margin_start(about_tab, 10); - gtk_widget_set_margin_end(about_tab, 10); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), about_tab, gtk_label_new("About")); - show_about_tab(about_tab); // Populate the about tab - - // Add a standard "Close" button to the dialog's action area - gtk_dialog_add_button(GTK_DIALOG(dialog), "_Close", GTK_RESPONSE_CLOSE); - // Connect the response signal to destroy the dialog - g_signal_connect(dialog, "response", G_CALLBACK(gtk_window_destroy), NULL); - - // Show the dialog - gtk_window_present(GTK_WINDOW(dialog)); -} - -// Populates the "Settings" tab with command entries -static void show_settings_tab(GtkWidget *box) { - const gchar *labels[] = { - "Logout Command:", - "Reboot Command:", - "Shutdown Command:", - "Switch User Command:", - "Suspend Command:", - "Hibernate Command:" - }; - - gchar *commands[6] = { NULL }; // Initialize command array to NULL - load_configuration(commands); // Load commands from config file - - // Create a grid layout for labels and entries - GtkWidget *grid = gtk_grid_new(); - gtk_grid_set_row_spacing(GTK_GRID(grid), 10); - gtk_grid_set_column_spacing(GTK_GRID(grid), 10); - gtk_box_append(GTK_BOX(box), grid); - - // Array to hold the GtkEntry widgets - GtkWidget **entries = g_new(GtkWidget*, 6); - - // Create label and entry for each command - for (int i = 0; i < 6; i++) { - GtkWidget *label = gtk_label_new(labels[i]); - GtkWidget *entry = gtk_entry_new(); - // Set entry text (handle potential NULL from load_configuration) - gtk_editable_set_text(GTK_EDITABLE(entry), commands[i] ? commands[i] : ""); - gtk_widget_set_hexpand(entry, TRUE); // Make entry expand horizontally - gtk_widget_set_halign(label, GTK_ALIGN_END); // Align label to the right - - // Attach label and entry to the grid - gtk_grid_attach(GTK_GRID(grid), label, 0, i, 1, 1); - gtk_grid_attach(GTK_GRID(grid), entry, 1, i, 1, 1); - - entries[i] = entry; // Store entry widget - g_free(commands[i]); // Free the command string loaded earlier - } - - // Create the "Save" button - GtkWidget *save_button = gtk_button_new_with_label("Save"); - gtk_widget_set_halign(save_button, GTK_ALIGN_END); // Align button to the right - gtk_widget_set_margin_top(save_button, 10); - // Store the entries array with the button, ensuring it's freed when button is destroyed - g_object_set_data_full(G_OBJECT(save_button), "entries", entries, (GDestroyNotify)g_free); - // Connect the save button's clicked signal - g_signal_connect(save_button, "clicked", G_CALLBACK(on_save_button_clicked), NULL); - gtk_box_append(GTK_BOX(box), save_button); // Add button to the tab's box -} - -// Callback function for the "Save" button in settings -static void on_save_button_clicked(GtkButton *button, gpointer user_data) { - // Retrieve the GtkEntry widgets array stored with the button - GtkWidget **entries = g_object_get_data(G_OBJECT(button), "entries"); - const gchar *commands_to_save[6]; // Array to hold command strings from entries - - // Get text from each entry - for (int i = 0; i < 6; i++) { - // This pointer is owned by the GtkEditable, do not free it here. - commands_to_save[i] = gtk_editable_get_text(GTK_EDITABLE(entries[i])); - } - - // Save the retrieved commands to the configuration file - save_configuration(commands_to_save); - - // Show an information dialog confirming the save - GtkWindow *parent_window = GTK_WINDOW(gtk_widget_get_root(GTK_WIDGET(button))); - GtkWidget *info_dialog = gtk_message_dialog_new(parent_window, - GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_INFO, - GTK_BUTTONS_OK, - "Settings saved successfully."); - g_signal_connect(info_dialog, "response", G_CALLBACK(gtk_window_destroy), NULL); - gtk_window_present(GTK_WINDOW(info_dialog)); -} - -// Populates the "About" tab static void show_about_tab(GtkWidget *box) { - GtkWidget *label; - GtkWidget *image; - const gchar *about_text = - "\nSimple ShutDown Dialog\n\n" - "Version: 2.1\n" - "Author: kekePower\n" - "URL: https://git.kekepower.com/kekePower/ssdd\n" - "Description: A Simple ShutDown Dialog for session management.\n"; + static const gchar about_text[] = + "\nSimple ShutDown Dialog\n\n" + "Version: " APP_VERSION "\n" + "Author: kekePower\n" + "URL: " + "https://git.kekepower.com/kekePower/ssdd\n" + "Description: A Simple ShutDown Dialog for session management.\n"; + GtkWidget *image = gtk_image_new_from_resource("/org/gtk/ssdd/ssdd-icon.png"); + GtkWidget *label = gtk_label_new(NULL); - // Load icon from GResource - image = gtk_image_new_from_resource("/org/gtk/ssdd/ssdd-icon.png"); - gtk_image_set_pixel_size(GTK_IMAGE(image), 128); // Set icon size - gtk_widget_set_halign(image, GTK_ALIGN_CENTER); // Center align image - gtk_widget_set_margin_bottom(image, 10); - gtk_box_append(GTK_BOX(box), image); + gtk_image_set_pixel_size(GTK_IMAGE(image), 128); + gtk_widget_set_halign(image, GTK_ALIGN_CENTER); + gtk_widget_set_margin_bottom(image, 10); + gtk_box_append(GTK_BOX(box), image); - // Create and configure the about text label - label = gtk_label_new(NULL); - gtk_label_set_markup(GTK_LABEL(label), about_text); // Use markup for formatting - gtk_label_set_selectable(GTK_LABEL(label), TRUE); // Allow text selection - gtk_label_set_wrap(GTK_LABEL(label), TRUE); // Wrap text if needed - gtk_widget_set_halign(label, GTK_ALIGN_CENTER); // Center align text - gtk_widget_set_valign(label, GTK_ALIGN_START); - gtk_box_append(GTK_BOX(box), label); + gtk_label_set_markup(GTK_LABEL(label), about_text); + gtk_label_set_selectable(GTK_LABEL(label), TRUE); + gtk_label_set_wrap(GTK_LABEL(label), TRUE); + gtk_widget_set_halign(label, GTK_ALIGN_CENTER); + gtk_widget_set_valign(label, GTK_ALIGN_START); + gtk_box_append(GTK_BOX(box), label); } -// Callback function for main window button clicks -static void button_clicked(GtkWidget *widget, gpointer data) { - // Retrieve data stored with the button - const gchar *command = g_object_get_data(G_OBJECT(widget), "command"); - const gchar *label = g_object_get_data(G_OBJECT(widget), "label"); - GtkApplication *app = g_object_get_data(G_OBJECT(widget), "app"); - GtkWindow *parent_window = GTK_WINDOW(gtk_widget_get_root(widget)); +static void show_settings_tab(GtkWidget *box, AppState *state) { + GtkWidget *grid = gtk_grid_new(); + GtkWidget *save_button = gtk_button_new_with_label("Save"); + SettingsData *settings = g_new0(SettingsData, 1); - // Safety check for command data - if (!command) { - g_warning("Command data not found for button '%s'", label ? label : "(unknown)"); - return; - } + settings->state = state; - // Handle special commands: "exit" and "settings" - if (g_strcmp0(command, "exit") == 0) { - g_application_quit(G_APPLICATION(app)); // Quit the application - return; - } + gtk_grid_set_row_spacing(GTK_GRID(grid), 10); + gtk_grid_set_column_spacing(GTK_GRID(grid), 10); + gtk_box_append(GTK_BOX(box), grid); - if (g_strcmp0(command, "settings") == 0) { - show_settings_dialog(parent_window); // Show the settings dialog - } else { - // For other commands, show a confirmation dialog - show_confirmation_dialog(parent_window, label, command); - } + for (guint i = 0; i < N_CONFIG_ACTIONS; i++) { + g_autofree gchar *label_text = + g_strdup_printf("%s Command:", actions[i].label); + GtkWidget *label = gtk_label_new(label_text); + GtkWidget *entry = gtk_entry_new(); + + gtk_editable_set_text(GTK_EDITABLE(entry), state->commands[i]); + gtk_widget_set_hexpand(entry, TRUE); + gtk_widget_set_halign(label, GTK_ALIGN_END); + gtk_grid_attach(GTK_GRID(grid), label, 0, (gint)i, 1, 1); + gtk_grid_attach(GTK_GRID(grid), entry, 1, (gint)i, 1, 1); + settings->entries[i] = entry; + } + + gtk_widget_set_halign(save_button, GTK_ALIGN_END); + gtk_widget_set_margin_top(save_button, 10); + g_object_set_data_full(G_OBJECT(save_button), "settings", settings, g_free); + g_signal_connect(save_button, "clicked", G_CALLBACK(on_save_button_clicked), + NULL); + gtk_box_append(GTK_BOX(box), save_button); } -// Callback function for key press events on the main window -static gboolean on_key_pressed(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer user_data) { - // Check if the Escape key was pressed - if (keyval == GDK_KEY_Escape) { - GtkApplication *app = GTK_APPLICATION(user_data); - g_application_quit(G_APPLICATION(app)); // Quit the application - return TRUE; // Event handled - } - return FALSE; // Event not handled +static void show_settings_dialog(GtkWindow *parent, AppState *state) { + GtkWidget *dialog = gtk_dialog_new(); + GtkWidget *content = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + GtkWidget *notebook = gtk_notebook_new(); + GtkWidget *settings_tab = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10); + GtkWidget *about_tab = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10); + + gtk_window_set_title(GTK_WINDOW(dialog), "Settings"); + gtk_window_set_transient_for(GTK_WINDOW(dialog), parent); + gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); + gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); + gtk_window_set_child(GTK_WINDOW(dialog), content); + gtk_box_append(GTK_BOX(content), notebook); + + gtk_widget_set_margin_top(settings_tab, 10); + gtk_widget_set_margin_bottom(settings_tab, 10); + gtk_widget_set_margin_start(settings_tab, 10); + gtk_widget_set_margin_end(settings_tab, 10); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), settings_tab, + gtk_label_new("Settings")); + show_settings_tab(settings_tab, state); + + gtk_widget_set_margin_top(about_tab, 10); + gtk_widget_set_margin_bottom(about_tab, 10); + gtk_widget_set_margin_start(about_tab, 10); + gtk_widget_set_margin_end(about_tab, 10); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), about_tab, + gtk_label_new("About")); + show_about_tab(about_tab); + + gtk_dialog_add_button(GTK_DIALOG(dialog), "_Close", GTK_RESPONSE_CLOSE); + g_signal_connect(dialog, "response", G_CALLBACK(gtk_window_destroy), NULL); + gtk_window_present(GTK_WINDOW(dialog)); } -// Shows a confirmation dialog before executing a command -static void show_confirmation_dialog(GtkWindow *parent_window, const gchar *label, const gchar *command) { - GtkWidget *dialog; - // Create the confirmation message string - gchar *message = g_strdup_printf("Are you sure you want to %s?", label ? label : "perform this action"); +static void on_save_button_clicked(GtkButton *button, + gpointer user_data G_GNUC_UNUSED) { + SettingsData *settings = g_object_get_data(G_OBJECT(button), "settings"); + const gchar *commands[N_CONFIG_ACTIONS]; + g_autoptr(GError) error = NULL; + GtkWindow *parent = GTK_WINDOW(gtk_widget_get_root(GTK_WIDGET(button))); - // Create the message dialog - dialog = gtk_message_dialog_new(parent_window, - GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_QUESTION, // Question icon - GTK_BUTTONS_YES_NO, // Yes/No buttons - "%s", message); - gtk_window_set_title(GTK_WINDOW(dialog), "Confirmation"); + for (guint i = 0; i < N_CONFIG_ACTIONS; i++) { + GtkEditable *entry = GTK_EDITABLE(settings->entries[i]); + const gchar *command = gtk_editable_get_text(entry); - // Store a copy of the command with the dialog, freed on destroy - g_object_set_data_full(G_OBJECT(dialog), "command", g_strdup(command), g_free); - - // Connect the response signal - g_signal_connect(dialog, "response", G_CALLBACK(on_confirmation_response), NULL); - - gtk_window_present(GTK_WINDOW(dialog)); - g_free(message); // Free the message string -} - -// Callback function for confirmation dialog responses -static void on_confirmation_response(GtkDialog *dialog, gint response_id, gpointer user_data) { - // Check if the "Yes" button was clicked - if (response_id == GTK_RESPONSE_YES) { - // Retrieve the command stored with the dialog - const gchar *command = g_object_get_data(G_OBJECT(dialog), "command"); - // Get the parent window - GtkWindow *parent = GTK_WINDOW(gtk_window_get_transient_for(GTK_WINDOW(dialog))); - // Execute the command if valid - if(command && parent) { - execute_command(command, parent); - } else if (!command) { - g_warning("Command data missing in confirmation dialog response."); - } - } - // Destroy the dialog regardless of the response - gtk_window_destroy(GTK_WINDOW(dialog)); -} - -// Creates a button with an icon and label, and sets up its signal -static void create_button(GtkWidget *grid, GtkApplication *app, const gchar *label_text, - const gchar *icon_name, const gchar *command, int pos) { - GtkWidget *button; - GtkWidget *box; - GtkWidget *image; - GtkWidget *label; - - // Create the button - button = gtk_button_new(); - gtk_widget_set_hexpand(button, TRUE); // Allow horizontal expansion - gtk_widget_set_vexpand(button, TRUE); // Allow vertical expansion - - // Create a vertical box for the icon and label inside the button - box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); // 5px spacing - gtk_widget_set_valign(box, GTK_ALIGN_CENTER); - gtk_widget_set_halign(box, GTK_ALIGN_CENTER); - gtk_button_set_child(GTK_BUTTON(button), box); - - // Create and add the icon - image = gtk_image_new_from_icon_name(icon_name); - gtk_image_set_icon_size(GTK_IMAGE(image), GTK_ICON_SIZE_LARGE); // Use a standard large icon size - gtk_box_append(GTK_BOX(box), image); - - // Create and add the label - label = gtk_label_new(label_text); - gtk_box_append(GTK_BOX(box), label); - - // Store necessary data with the button widget - g_object_set_data(G_OBJECT(button), "app", app); // Store app pointer - // Store copies of label and command, freed automatically when button is destroyed - g_object_set_data_full(G_OBJECT(button), "label", g_strdup(label_text), g_free); - g_object_set_data_full(G_OBJECT(button), "command", g_strdup(command), g_free); - - // Connect the button's clicked signal to the callback function - g_signal_connect(button, "clicked", G_CALLBACK(button_clicked), NULL); // Pass NULL as data - - // Attach the button to the main grid layout - gtk_grid_attach(GTK_GRID(grid), button, pos % 4, pos / 4, 1, 1); // 4 columns grid -} - -// Saves the current command configuration to the file using GKeyFile -static void save_configuration(const gchar *commands[]) { - GError *error = NULL; - gchar *config_path = get_config_path(); // Get config file path (ensures dir exists) - - // Use GKeyFile for robust configuration handling - GKeyFile *key_file = g_key_file_new(); - - // Set command strings in the key file under the [Commands] group - g_key_file_set_string(key_file, "Commands", "LOGOUT_COMMAND", commands[0] ? commands[0] : ""); - g_key_file_set_string(key_file, "Commands", "REBOOT_COMMAND", commands[1] ? commands[1] : ""); - g_key_file_set_string(key_file, "Commands", "SHUTDOWN_COMMAND", commands[2] ? commands[2] : ""); - g_key_file_set_string(key_file, "Commands", "SWITCH_USER_COMMAND", commands[3] ? commands[3] : ""); - g_key_file_set_string(key_file, "Commands", "SUSPEND_COMMAND", commands[4] ? commands[4] : ""); - g_key_file_set_string(key_file, "Commands", "HIBERNATE_COMMAND", commands[5] ? commands[5] : ""); - - // Convert key file data to string format - gchar *config_data = g_key_file_to_data(key_file, NULL, &error); - - if (error) { - g_warning("Failed to generate configuration data: %s", error->message); - g_error_free(error); - g_key_file_free(key_file); - g_free(config_path); - return; + if (*command == '\0') { + gtk_editable_set_text(entry, actions[i].default_command); + command = gtk_editable_get_text(entry); } - // Save the configuration string data to the file - if (!g_file_set_contents(config_path, config_data, -1, &error)) { - g_warning("Failed to save configuration to '%s': %s", config_path, error->message); - g_error_free(error); - } + commands[i] = command; + } - // Clean up allocated memory - g_free(config_data); - g_key_file_free(key_file); - g_free(config_path); + if (!save_configuration(commands, &error)) { + g_autofree gchar *message = g_strdup_printf( + "Could not save the settings.\n\nReason: %s", error->message); + show_message_dialog(parent, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, + "Error Saving Settings", message); + return; + } + + for (guint i = 0; i < N_CONFIG_ACTIONS; i++) + app_state_set_command(settings->state, i, commands[i]); + + show_message_dialog(parent, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, + "Settings Saved", "Settings saved successfully."); } -// Loads command configuration from the file using GKeyFile -// Populates the `commands` array (caller must free elements). -// Uses defaults if file/keys are missing or invalid. -static void load_configuration(gchar *commands[]) { - GError *error = NULL; - gchar *config_path = get_config_path(); // Get config file path (ensures dir exists) +static void show_confirmation_dialog(GtkWindow *parent, const gchar *label, + const gchar *command) { + g_autofree gchar *message = + g_strdup_printf("Are you sure you want to %s?", label); + GtkWidget *dialog = gtk_message_dialog_new( + parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s", message); - // Default commands used if config is missing or invalid - const gchar *default_commands[] = { - "openbox --exit", // Default Logout - "systemctl reboot", // Default Reboot - "systemctl poweroff", // Default Shutdown - "dm-tool switch-to-greeter",// Default Switch User - "systemctl suspend", // Default Suspend - "systemctl hibernate" // Default Hibernate - }; - - GKeyFile *key_file = g_key_file_new(); - - // Attempt to load the configuration file - if (!g_key_file_load_from_file(key_file, config_path, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &error)) { - // If loading fails (file not found, invalid format, etc.) - g_warning("Configuration file '%s' not found or invalid (%s). Using defaults.", config_path, error ? error->message : "unknown error"); - if (error) g_error_free(error); - error = NULL; // Reset error status - - // Save a default configuration file for next time - save_configuration(default_commands); - - // Load default commands directly into the output array - for (int i = 0; i < 6; i++) { - commands[i] = g_strdup(default_commands[i]); // Duplicate default strings - } - } else { - // File loaded successfully, read values - commands[0] = g_key_file_get_string(key_file, "Commands", "LOGOUT_COMMAND", NULL); - commands[1] = g_key_file_get_string(key_file, "Commands", "REBOOT_COMMAND", NULL); - commands[2] = g_key_file_get_string(key_file, "Commands", "SHUTDOWN_COMMAND", NULL); - commands[3] = g_key_file_get_string(key_file, "Commands", "SWITCH_USER_COMMAND", NULL); - commands[4] = g_key_file_get_string(key_file, "Commands", "SUSPEND_COMMAND", NULL); - commands[5] = g_key_file_get_string(key_file, "Commands", "HIBERNATE_COMMAND", NULL); - - // Replace NULL (missing keys) or empty strings with defaults - for (int i = 0; i < 6; i++) { - if (commands[i] == NULL || g_strcmp0(commands[i], "") == 0) { - g_free(commands[i]); // Free if empty string was returned or NULL - commands[i] = g_strdup(default_commands[i]); // Use default - g_warning("Configuration key missing or empty for index %d, using default: '%s'", i, default_commands[i]); - } - } - } - - // Clean up - g_key_file_free(key_file); - g_free(config_path); + gtk_window_set_title(GTK_WINDOW(dialog), "Confirmation"); + g_object_set_data_full(G_OBJECT(dialog), "command", g_strdup(command), + g_free); + g_signal_connect(dialog, "response", G_CALLBACK(on_confirmation_response), + NULL); + gtk_window_present(GTK_WINDOW(dialog)); } -// Activation function called when the application starts -static void activate(GtkApplication *app, gpointer user_data) { - GtkWidget *window; - GtkWidget *grid; - gchar *commands[6] = { NULL }; // Array to hold loaded commands - load_configuration(commands); // Load commands from config file +static void on_confirmation_response(GtkDialog *dialog, gint response_id, + gpointer user_data G_GNUC_UNUSED) { + if (response_id == GTK_RESPONSE_YES) { + const gchar *command = g_object_get_data(G_OBJECT(dialog), "command"); + GtkWindow *parent = gtk_window_get_transient_for(GTK_WINDOW(dialog)); - // Icon names (using symbolic for better theme integration) - const gchar *icons[] = { - "system-log-out-symbolic", - "system-reboot-symbolic", - "system-shutdown-symbolic", - "system-users-symbolic", - "media-playback-pause-symbolic", // Consider alternatives if needed - "document-save-symbolic", // Hibernate icon choice - "preferences-system-symbolic", // Settings icon - "window-close-symbolic" // Exit icon - }; - // Button labels - const gchar *labels[] = { - "Logout", "Reboot", "Shutdown", "Switch User", - "Suspend", "Hibernate", "Settings", "Exit" - }; - // Special command identifiers for settings and exit - const gchar *special_commands[] = { - "settings", "exit" - }; + if (command != NULL && parent != NULL) + execute_command(command, parent); + else + g_warning("Confirmation dialog is missing its command or parent"); + } - // Create the main application window - window = gtk_application_window_new(app); - gtk_window_set_title(GTK_WINDOW(window), "Simple ShutDown Dialog"); - gtk_window_set_resizable(GTK_WINDOW(window), FALSE); // Disable resizing - - // --- Obsolete GTK3 calls removed --- - // gtk_window_set_position(...) removed - Handled by WM - // gtk_window_set_icon(...) removed - Handled by .desktop file - - // Create the main grid layout - grid = gtk_grid_new(); - gtk_grid_set_row_spacing(GTK_GRID(grid), 5); - gtk_grid_set_column_spacing(GTK_GRID(grid), 5); - gtk_widget_set_margin_top(grid, 15); - gtk_widget_set_margin_bottom(grid, 15); - gtk_widget_set_margin_start(grid, 15); - gtk_widget_set_margin_end(grid, 15); - gtk_window_set_child(GTK_WINDOW(window), grid); // Set grid as child of window - - // Create buttons for the 6 main actions (Logout, Reboot, etc.) - for (int i = 0; i < 6; i++) { - // Pass the loaded command; create_button makes a copy. Handle NULL. - create_button(grid, app, labels[i], icons[i], commands[i] ? commands[i] : "", i); - g_free(commands[i]); // Free the original string from load_configuration - } - - // Create Settings and Exit buttons - create_button(grid, app, labels[6], icons[6], special_commands[0], 6); // "settings" - create_button(grid, app, labels[7], icons[7], special_commands[1], 7); // "exit" - - // Add key event controller to handle Escape key press - GtkEventController *key_controller = gtk_event_controller_key_new(); - gtk_widget_add_controller(window, key_controller); - g_signal_connect(key_controller, "key-pressed", G_CALLBACK(on_key_pressed), app); - - // Show the main window - gtk_window_present(GTK_WINDOW(window)); + gtk_window_destroy(GTK_WINDOW(dialog)); +} + +static void button_clicked(GtkButton *button, + gpointer user_data G_GNUC_UNUSED) { + ActionId action_id = (ActionId)(GPOINTER_TO_UINT(g_object_get_data( + G_OBJECT(button), "action-id")) - + 1); + GtkWindow *window = GTK_WINDOW(gtk_widget_get_root(GTK_WIDGET(button))); + GtkApplication *app = gtk_window_get_application(window); + AppState *state = g_object_get_data(G_OBJECT(app), "app-state"); + + g_return_if_fail(action_id >= 0 && action_id < N_ACTIONS); + + if (action_id == ACTION_EXIT) { + g_application_quit(G_APPLICATION(app)); + } else if (action_id == ACTION_SETTINGS) { + show_settings_dialog(window, state); + } else { + show_confirmation_dialog(window, actions[action_id].label, + state->commands[action_id]); + } +} + +static gboolean on_key_pressed(GtkEventControllerKey *controller G_GNUC_UNUSED, + guint keyval, guint keycode G_GNUC_UNUSED, + GdkModifierType state G_GNUC_UNUSED, + gpointer user_data) { + if (keyval != GDK_KEY_Escape) + return FALSE; + + g_application_quit(G_APPLICATION(user_data)); + return TRUE; +} + +static void create_button(GtkWidget *grid, ActionId action_id) { + const ActionSpec *action = &actions[action_id]; + GtkWidget *button = gtk_button_new(); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); + GtkWidget *image = gtk_image_new_from_icon_name(action->icon_name); + GtkWidget *label = gtk_label_new(action->label); + + gtk_widget_set_hexpand(button, TRUE); + gtk_widget_set_vexpand(button, TRUE); + gtk_widget_set_valign(box, GTK_ALIGN_CENTER); + gtk_widget_set_halign(box, GTK_ALIGN_CENTER); + gtk_button_set_child(GTK_BUTTON(button), box); + gtk_image_set_icon_size(GTK_IMAGE(image), GTK_ICON_SIZE_LARGE); + gtk_box_append(GTK_BOX(box), image); + gtk_box_append(GTK_BOX(box), label); + + g_object_set_data(G_OBJECT(button), "action-id", + GUINT_TO_POINTER((guint)action_id + 1)); + g_signal_connect(button, "clicked", G_CALLBACK(button_clicked), NULL); + gtk_grid_attach(GTK_GRID(grid), button, (gint)action_id % 4, + (gint)action_id / 4, 1, 1); +} + +static void activate(GtkApplication *app, gpointer user_data G_GNUC_UNUSED) { + GtkWindow *existing_window = gtk_application_get_active_window(app); + + if (existing_window != NULL) { + gtk_window_present(existing_window); + return; + } + + GtkWidget *window = gtk_application_window_new(app); + GtkWidget *grid = gtk_grid_new(); + + gtk_window_set_title(GTK_WINDOW(window), "Simple ShutDown Dialog"); + gtk_window_set_resizable(GTK_WINDOW(window), FALSE); + gtk_grid_set_row_spacing(GTK_GRID(grid), 5); + gtk_grid_set_column_spacing(GTK_GRID(grid), 5); + gtk_widget_set_margin_top(grid, 15); + gtk_widget_set_margin_bottom(grid, 15); + gtk_widget_set_margin_start(grid, 15); + gtk_widget_set_margin_end(grid, 15); + gtk_window_set_child(GTK_WINDOW(window), grid); + + for (guint i = 0; i < N_ACTIONS; i++) + create_button(grid, (ActionId)i); + + GtkEventController *key_controller = gtk_event_controller_key_new(); + gtk_widget_add_controller(window, key_controller); + g_signal_connect(key_controller, "key-pressed", G_CALLBACK(on_key_pressed), + app); + gtk_window_present(GTK_WINDOW(window)); } -// Main function int main(int argc, char **argv) { - GtkApplication *app; - int status; + g_autoptr(GtkApplication) app = + gtk_application_new("com.kekepower.ssdd", G_APPLICATION_DEFAULT_FLAGS); + AppState *state = g_new0(AppState, 1); - // Register GResources (ensure resources.c/h are compiled and linked) - // Verify 'resources_get_resource()' matches the function in generated resources.c - g_resources_register(resources_get_resource()); + load_configuration(state); + g_object_set_data_full(G_OBJECT(app), "app-state", state, app_state_free); + g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); - // Create the GTK application instance - // Use reverse DNS notation for the application ID - app = gtk_application_new("com.kekepower.ssdd", G_APPLICATION_DEFAULT_FLAGS); - // Connect the activate signal to the activate function - g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); - // Run the application - status = g_application_run(G_APPLICATION(app), argc, argv); - // Clean up the application object - g_object_unref(app); - - // Optional: Unregister resources (usually handled automatically on exit) - // g_resources_unregister(resources_get_resource()); - - return status; // Return the application exit status + return g_application_run(G_APPLICATION(app), argc, argv); } diff --git a/ssdd.gresource b/ssdd.gresource new file mode 100644 index 0000000000000000000000000000000000000000..b951f6600d0154e2cb01effc2893492abd1cda39 GIT binary patch literal 58568 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 jMNUMnLSTXb04Q~JVR