]> git.plutz.net Git - gladerunner/commitdiff
allow running instructions from child process
authorPaul Hänsch <paul@plutz.net>
Mon, 13 Jul 2026 22:44:19 +0000 (00:44 +0200)
committerPaul Hänsch <paul@plutz.net>
Mon, 13 Jul 2026 22:44:19 +0000 (00:44 +0200)
glade1.c

index 0196d3b742473089ab9ff9d3c05ac7c81b9e2b28..5438e93316e63eb42b372ddb7f2361aab0f71e66 100644 (file)
--- a/glade1.c
+++ b/glade1.c
@@ -3,7 +3,8 @@
 #include <unistd.h>
 #include <fcntl.h>
 
-static GtkBuilder *builder;
+static GtkBuilder *builder = NULL;
+static int chldin[2], chldout[2];
 
 // typedef struct wdg_command {
 //   GType wdg;
@@ -109,7 +110,7 @@ gboolean idle_readline(gpointer d) {
   static int len = 0; int l;
   if (!buf) buf = malloc(s);
 
-  while ( (l = read(0, buf + len, s - len)) > 0) {
+  while ( (l = read(STDIN_FILENO, buf + len, s - len)) > 0) {
     len += l;
     if ( buf[len - 1] == '\n' && (len < 2 || buf[len - 2] != '\\') ) break;
     else if (len >= 2) buf[--len - 1] = '\n';
@@ -143,18 +144,56 @@ void init_widgets(gpointer wp, gpointer data) {
   }
 }
 
+void chldopen(char *argv[]) {
+  pipe(chldin); pipe(chldout);
+
+  if ( fork() ) {
+    close(chldin[0]);
+    close(chldout[1]);
+    dup2(chldin[1], STDOUT_FILENO);
+    dup2(chldout[0], STDIN_FILENO);
+  } else {
+    close(chldin[1]);
+    close(chldout[0]);
+    dup2(chldin[0], STDIN_FILENO);
+    dup2(chldout[1], STDOUT_FILENO);
+    execvp(argv[0], &argv[1]);
+  }
+}
+
 int main(int argc, char *argv[]) {
   GSList *widgets;
-
-  gtk_init(&argc, &argv);
-  builder = gtk_builder_new_from_file("glade1.glade");
+  int arg = argc, testfd;
+
+  // gtk_init modifies the parameter array, affecting options after --
+  // so we rather give it a copy of the parameter array
+  char **gtkarg = malloc(sizeof(char*) * argc);
+  memcpy(gtkarg, argv, sizeof(char*) * argc);
+  gtk_init(&arg, &gtkarg);
+
+  for (arg = 1; arg < argc; arg++) {
+    if (strcmp(argv[arg], "--") == 0) {
+      printf("chldopen\n");
+      chldopen(&argv[arg + 1]);
+      break;
+    } else if ( (testfd = open(argv[arg], O_RDONLY)) > 0 ) {
+      close(testfd);
+      builder = gtk_builder_new_from_file(argv[arg]);
+    } else {
+      dprintf(STDERR_FILENO, "Unknown argument: %s\n", argv[arg]);
+      exit(1);
+    }
+  }
+  if (! builder) {
+    dprintf(STDERR_FILENO, "No .glade file given\n");
+    exit(1);
+  }
   widgets = gtk_builder_get_objects(builder);
   g_slist_foreach(widgets, *init_widgets, NULL);
   g_slist_free(widgets);
 
-  fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
+  fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) | O_NONBLOCK);
   g_idle_add(idle_readline, builder);
-  // gtk_builder_connect_signals(builder, NULL);
 
   gtk_main();
   return 0;