From 7161b315ec62d9ff25aedd44faee81211ac244a9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Mon, 10 Aug 2026 21:31:42 +0200 Subject: [PATCH] stock dialogs for opening and saving files --- glade2.glade | 35 +++++++++++++++++++++++++++- gladerunner.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 94 insertions(+), 4 deletions(-) diff --git a/glade2.glade b/glade2.glade index 3c97b4b..65e383a 100644 --- a/glade2.glade +++ b/glade2.glade @@ -2,6 +2,39 @@ + + False + dialog + True + True + + + False + vertical + 2 + + + False + end + + + + + + + + + False + False + 0 + + + + + + + + True False @@ -34,7 +67,7 @@ - + gtk-open True False diff --git a/gladerunner.c b/gladerunner.c index 56783fd..6429cb2 100644 --- a/gladerunner.c +++ b/gladerunner.c @@ -7,6 +7,7 @@ #include // only for thread based variant static GtkBuilder *builder = NULL; +GtkFileChooserNative *gtkfopen = NULL, *gtkfsave = NULL, *gtkdopen = NULL; static int chldin[2], chldout[2]; // pre declaration @@ -99,6 +100,28 @@ void e_entry_changed(GtkWidget *wdg, gpointer user_data) { ); } +void e_filechooser_activate(GtkWidget *wdg, gpointer user_data) { + GtkFileChooser *e = GTK_FILE_CHOOSER(wdg); + GSList *name, *names = gtk_file_chooser_get_filenames(e); + printf( + "ACTIVATE %s\n", + gtk_buildable_get_name(GTK_BUILDABLE(wdg)) + ); + for (name = names; name; name = name->next) { + printf("FILE %i\n%s\n", strlen(name->data), name->data); + free(name->data); + } + printf("FILE END\n"); + g_slist_free(names); +} + +void e_filechooser_response(GtkNativeDialog *wdg, gint id, gpointer user_data) { + GtkFileChooser *e = GTK_FILE_CHOOSER(wdg); + char *file = gtk_file_chooser_get_filename(e); + printf("%s %i\n%s\n", user_data, strlen(file), file); + free(file); +} + gboolean s_switch_state_set(GtkWidget *wdg, gboolean state, gpointer d) { GtkSwitch *s = GTK_SWITCH(wdg); printf( @@ -166,6 +189,36 @@ void a_builder_add(char *xml) { } } +void a_builder_fopen(char *args) { + if (!gtkfopen) { + gtkfopen = gtk_file_chooser_native_new( + NULL, NULL, GTK_FILE_CHOOSER_ACTION_OPEN, NULL, NULL + ); + //g_signal_connect(gtkfopen, "file_activated", G_CALLBACK(e_filechooser_activate), NULL); + g_signal_connect(gtkfopen, "response", G_CALLBACK(e_filechooser_response), "FOPEN"); + } + gtk_native_dialog_show(GTK_NATIVE_DIALOG(gtkfopen)); +} +void a_builder_fsave(char *args) { + if (!gtkfsave) { + gtkfsave = gtk_file_chooser_native_new( + NULL, NULL, GTK_FILE_CHOOSER_ACTION_SAVE, NULL, NULL + ); + // g_signal_connect(gtkfsave, "file_activated", G_CALLBACK(e_filechooser_activate), NULL); + g_signal_connect(gtkfsave, "response", G_CALLBACK(e_filechooser_response), "FSAVE"); + } + gtk_native_dialog_show(GTK_NATIVE_DIALOG(gtkfsave)); +} +void a_builder_dopen(char *args) { + if (!gtkdopen) { + gtkdopen = gtk_file_chooser_native_new( + NULL, NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, NULL, NULL + ); + // g_signal_connect(gtkdopen, "file_activated", G_CALLBACK(e_filechooser_activate), NULL); + g_signal_connect(gtkdopen, "response", G_CALLBACK(e_filechooser_response), "DOPEN"); + } + gtk_native_dialog_show(GTK_NATIVE_DIALOG(gtkdopen)); +} // ====== CLI ACTIONS PARSING ====== @@ -243,8 +296,11 @@ int a_listbox(GtkListBox *w, char *cmd, char *args) { int a_builder(char *cmd, char *args) { if (!cmd || !cmd[0]) return 0; - else if (!strcmp(cmd, "load")) a_builder_load(args); - else if (!strcmp(cmd, "add")) a_builder_add(args); + else if (!strcmp(cmd, "load")) a_builder_load(args); + else if (!strcmp(cmd, "add")) a_builder_add(args); + else if (!strcmp(cmd, "fopen")) a_builder_fopen(args); + else if (!strcmp(cmd, "fsave")) a_builder_fsave(args); + else if (!strcmp(cmd, "dopen")) a_builder_dopen(args); else return 0; return 1; } @@ -342,6 +398,7 @@ void init_widget(gpointer wp, gpointer data) { g_signal_connect(wdg, "activate", G_CALLBACK(e_entry_activate), NULL);} else if (GTK_IS_TOOL_BUTTON(wdg)) g_signal_connect(wdg, "clicked", G_CALLBACK(e_widget_clicked), NULL); else if (GTK_IS_BUTTON(wdg)) g_signal_connect(wdg, "clicked", G_CALLBACK(e_widget_clicked), NULL); + else if (GTK_IS_FILE_CHOOSER(wdg)) g_signal_connect(wdg, "file_activated", G_CALLBACK(e_filechooser_activate), NULL); else if (GTK_IS_WINDOW(wdg)) g_signal_connect(wdg, "delete-event", G_CALLBACK(e_window_close), NULL); else { printf("INIT %s unknown\n", name); return; } @@ -366,7 +423,7 @@ void chldopen(char *argv[]) { close(chldout[0]); dup2(chldin[0], STDIN_FILENO); dup2(chldout[1], STDOUT_FILENO); - execvp(argv[0], &argv[1]); + execvp(argv[0], argv); } } -- 2.47.3