]> git.plutz.net Git - gladerunner/commitdiff
simplified command parsing, exit when stdin closes
authorPaul Hänsch <paul@plutz.net>
Mon, 13 Jul 2026 19:21:06 +0000 (21:21 +0200)
committerPaul Hänsch <paul@plutz.net>
Mon, 13 Jul 2026 19:21:06 +0000 (21:21 +0200)
glade1.c

index de2a1987330c5df59df62eb9bdf38f9fda77affb..0196d3b742473089ab9ff9d3c05ac7c81b9e2b28 100644 (file)
--- a/glade1.c
+++ b/glade1.c
@@ -83,39 +83,33 @@ int a_text_view(GtkTextView *w, char *cmd, char *args) {
   return 1;
 }
 
-int action(GtkWidget *wdg, char *cli) {
-  char *cmd = strtok(cli, "    \n");
+int action(char *cli) {
+  GtkWidget *wdg;
+  char *wid = strtok(cli, "    \n");  // Separator: Space, Tab, Newline
+  char *cmd = strtok(NULL, "   \n");
   char *args = strtok(NULL, "");
 
-  if (!wdg) return 0;
-  else if ( (GTK_IS_BUTTON(wdg)    &&    a_button(GTK_BUTTON(wdg),    cmd, args))
-         || (GTK_IS_ENTRY(wdg)     &&     a_entry(GTK_ENTRY(wdg),     cmd, args))
-         || (GTK_IS_WINDOW(wdg)    &&    a_window(GTK_WINDOW(wdg),    cmd, args))
-         || (GTK_IS_TEXT_VIEW(wdg) && a_text_view(GTK_TEXT_VIEW(wdg), cmd, args))
-         || (GTK_IS_EDITABLE(wdg)  &&  a_editable(GTK_EDITABLE(wdg),  cmd, args))
-         || (GTK_IS_WIDGET(wdg)    &&    a_widget(GTK_WIDGET(wdg),    cmd, args))
+  if ( !wid || !wid[0]
+    || !(wdg = GTK_WIDGET(gtk_builder_get_object(builder, wid)))
+  ) return 0;
+  else if (
+     (GTK_IS_BUTTON(wdg)    &&    a_button(GTK_BUTTON(wdg),    cmd, args))
+  || (GTK_IS_ENTRY(wdg)     &&     a_entry(GTK_ENTRY(wdg),     cmd, args))
+  || (GTK_IS_WINDOW(wdg)    &&    a_window(GTK_WINDOW(wdg),    cmd, args))
+  || (GTK_IS_TEXT_VIEW(wdg) && a_text_view(GTK_TEXT_VIEW(wdg), cmd, args))
+  || (GTK_IS_EDITABLE(wdg)  &&  a_editable(GTK_EDITABLE(wdg),  cmd, args))
+  || (GTK_IS_WIDGET(wdg)    &&    a_widget(GTK_WIDGET(wdg),    cmd, args))
   ) return 1;
   else return 0;
 }
 
-void a_command(char *cli) {
-  GtkWidget *wdg;
-  char *wid = strtok(cli, "    \n");  // Separator: Space, Tab
-
-  if ( wdg = GTK_WIDGET(gtk_builder_get_object(builder, wid)) ) {
-    action(wdg, strtok(NULL, ""));
-  }
-}
-
 gboolean idle_readline(gpointer d) {
-  // GtkBuilder *bld = GTK_BUILDER(d);
   static size_t s = 128;
   static char *buf = NULL;
   static int len = 0; int l;
   if (!buf) buf = malloc(s);
 
-  l = read(0, buf + len, s - len);
-  while ( l > 0 ) {
+  while ( (l = read(0, 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';
@@ -124,8 +118,10 @@ gboolean idle_readline(gpointer d) {
   }
   if ( l > 0 ) {
     buf[len - 1] = 0;
-    a_command(buf);
+    action(buf);
     len = 0;
+  } else if (l == 0) {
+    exit(0);
   }
   return 1;
 }