From: Paul Hänsch Date: Mon, 13 Jul 2026 22:44:19 +0000 (+0200) Subject: allow running instructions from child process X-Git-Url: https://git.plutz.net/?a=commitdiff_plain;h=31e7581d89e756f82348ebaf53ebc23494554240;p=gladerunner allow running instructions from child process --- diff --git a/glade1.c b/glade1.c index 0196d3b..5438e93 100644 --- a/glade1.c +++ b/glade1.c @@ -3,7 +3,8 @@ #include #include -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, >karg); + + 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;