]> git.plutz.net Git - gladerunner/commitdiff
action for loading additional .glade files
authorPaul Hänsch <paul@plutz.net>
Sun, 26 Jul 2026 16:57:54 +0000 (18:57 +0200)
committerPaul Hänsch <paul@plutz.net>
Sun, 26 Jul 2026 16:57:54 +0000 (18:57 +0200)
gladerunner.c

index 38852794174ca9777fccede5c612ff678d514afb..16ff6cd2b4c5e343c588000ed5f96f888e919491 100644 (file)
@@ -161,9 +161,9 @@ int a_text_view(GtkTextView *w, char *cmd, char *args) {
 }
 
 void a_listbox_add(GtkListBox *w, char *arg) {
-  char *label = malloc(strlen(arg));
+  char *label = malloc(strlen(arg) + 1);
   strcpy(label, arg);
-  GtkWidget *glabel = gtk_label_new(label);
+  GtkWidget *glabel = gtk_button_new_with_label(label);
   gtk_list_box_insert(w, glabel, -1);
   gtk_widget_set_visible(glabel, TRUE);
 }
@@ -174,25 +174,47 @@ int a_listbox(GtkListBox *w, char *cmd, char *args) {
   return 1;
 }
 
+void init_widgets(gpointer wp, gpointer data);
+
+void a_builder_load(char *file) {
+  GSList *widgets; GError *gerr = NULL;
+
+  if ( ! gtk_builder_add_from_file(builder, file, &gerr) ) {
+    dprintf(STDERR_FILENO, "%s\n", gerr->message);
+    free(gerr);
+  } else {
+    widgets = gtk_builder_get_objects(builder);
+    g_slist_foreach(widgets, *init_widgets, NULL);
+    g_slist_free(widgets);
+  }
+}
+
+int a_builder(char *cmd, char *args) {
+  if (!cmd || !cmd[0]) return 0;
+  else if (!strcmp(cmd, "load")) a_builder_load(args);
+  else return 0;
+  return 1;
+}
+
 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 ( !wid || !wid[0]
-    || !(wdg = GTK_WIDGET(gtk_builder_get_object(builder, wid)))
-  ) return 0;
+  if ( !wid || !wid[0] ) return 0;
+  else if ( wid[0] == ':' && !wid[1] ) return a_builder(cmd, args);
+  else if (!(wdg = GTK_WIDGET(gtk_builder_get_object(builder, wid)))) return 0;
   else if (0
   || (GTK_IS_TOGGLE_BUTTON(wdg)      &&       a_tb(GTK_TOGGLE_BUTTON(wdg), cmd, args))
   || (GTK_IS_CHECK_MENU_ITEM(wdg)    &&    a_cmi(GTK_CHECK_MENU_ITEM(wdg), cmd, args))
   || (GTK_IS_TOGGLE_TOOL_BUTTON(wdg) && a_ttb(GTK_TOGGLE_TOOL_BUTTON(wdg), cmd, args))
-  || (GTK_IS_ENTRY(wdg)     &&     a_entry(GTK_ENTRY(wdg),     cmd, args))
-  || (GTK_IS_LIST_BOX(wdg)  &&   a_listbox(GTK_LIST_BOX(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_BUTTON(wdg)    &&    a_button(GTK_BUTTON(wdg),    cmd, args))
-  || (GTK_IS_WIDGET(wdg)    &&    a_widget(GTK_WIDGET(wdg),    cmd, args))
+  || (GTK_IS_ENTRY(wdg)              &&            a_entry(GTK_ENTRY(wdg), cmd, args))
+  || (GTK_IS_LIST_BOX(wdg)           &&       a_listbox(GTK_LIST_BOX(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_BUTTON(wdg)             &&          a_button(GTK_BUTTON(wdg), cmd, args))
+  || (GTK_IS_WIDGET(wdg)             &&          a_widget(GTK_WIDGET(wdg), cmd, args))
   ) return 1;
   else return 0;
 }
@@ -246,8 +268,12 @@ void* thread_readline(void *d) {
 }
 
 void init_widgets(gpointer wp, gpointer data) {
+  static GSList *known = NULL;
   GtkWidget *wdg; const char *name;
 
+  if ( g_slist_find(known, wp) ) return;
+  else known = g_slist_prepend(known, wp);
+
   if (GTK_IS_BUILDABLE(wp)) { 
     wdg = GTK_WIDGET(wp);
     name = gtk_buildable_get_name(GTK_BUILDABLE(wp));
@@ -314,9 +340,9 @@ int main(int argc, char *argv[]) {
   g_slist_foreach(widgets, *init_widgets, NULL);
   g_slist_free(widgets);
 
-  // g_idle_add(idle_readline, builder);
-  pthread_t rl;
-  pthread_create(&rl, NULL, thread_readline, NULL);
+  g_idle_add(idle_readline, builder);
+  // pthread_t rl;
+  // pthread_create(&rl, NULL, thread_readline, NULL);
 
   gtk_main();
   return 0;