]> git.plutz.net Git - gladerunner/commitdiff
stock dialogs for opening and saving files
authorPaul Hänsch <paul@plutz.net>
Mon, 10 Aug 2026 19:31:42 +0000 (21:31 +0200)
committerPaul Hänsch <paul@plutz.net>
Mon, 10 Aug 2026 19:31:42 +0000 (21:31 +0200)
glade2.glade
gladerunner.c

index 3c97b4b99e12d15cf4cc8c15eec1dd24db391f0d..65e383afeb37f3a5425707f27913c8fe7d948db5 100644 (file)
@@ -2,6 +2,39 @@
 <!-- Generated with glade 3.40.0 -->
 <interface>
   <requires lib="gtk+" version="3.24"/>
+  <object class="GtkFileChooserDialog" id="fopen">
+    <property name="can-focus">False</property>
+    <property name="type-hint">dialog</property>
+    <property name="do-overwrite-confirmation">True</property>
+    <property name="select-multiple">True</property>
+    <child internal-child="vbox">
+      <object class="GtkBox">
+        <property name="can-focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox">
+            <property name="can-focus">False</property>
+            <property name="layout-style">end</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
+      </object>
+    </child>
+  </object>
   <object class="GtkWindow" id="w">
     <property name="visible">True</property>
     <property name="can-focus">False</property>
@@ -34,7 +67,7 @@
                       </object>
                     </child>
                     <child>
-                      <object class="GtkImageMenuItem">
+                      <object class="GtkImageMenuItem" id="dopen">
                         <property name="label">gtk-open</property>
                         <property name="visible">True</property>
                         <property name="can-focus">False</property>
index 56783fdbac633c08349d8c6f7af100e5d2e2575f..6429cb253997eb76c479a67d8f5ec4c74b057e38 100644 (file)
@@ -7,6 +7,7 @@
 #include <pthread.h>     // 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);
   }
 }