From: Paul Hänsch Date: Sun, 26 Jul 2026 16:57:54 +0000 (+0200) Subject: action for loading additional .glade files X-Git-Url: https://git.plutz.net/?a=commitdiff_plain;h=402458e83eee0d3aef141f3064b0f371f6c2ee51;p=gladerunner action for loading additional .glade files --- diff --git a/gladerunner.c b/gladerunner.c index 3885279..16ff6cd 100644 --- a/gladerunner.c +++ b/gladerunner.c @@ -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;