diff --git a/redo/unix/child.c b/redo/unix/child.c index 23b793c7..be5766d5 100644 --- a/redo/unix/child.c +++ b/redo/unix/child.c @@ -59,6 +59,10 @@ struct child *newChildWithBox(uiControl *child, uiControl *parent, GtkContainer box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_widget_show(box); c = newChild(child, parent, GTK_CONTAINER(box)); + gtk_widget_set_hexpand(c->widget, TRUE); + gtk_widget_set_halign(c->widget, GTK_ALIGN_FILL); + gtk_widget_set_vexpand(c->widget, TRUE); + gtk_widget_set_valign(c->widget, GTK_ALIGN_FILL); c->box = box; gtk_container_add(parentContainer, c->box); childSetMargined(c, margined); diff --git a/redo/unix/tab.c b/redo/unix/tab.c index fae6aec3..b356c847 100644 --- a/redo/unix/tab.c +++ b/redo/unix/tab.c @@ -8,13 +8,7 @@ struct uiTab { GtkContainer *container; GtkNotebook *notebook; - GArray *pages; -}; - -struct tabPage { - GtkWidget *box; - uiControl *c; - int margined; + GArray *pages; // []*struct child }; static void onDestroy(uiTab *); @@ -28,15 +22,11 @@ uiUnixDefineControlWithOnDestroy( static void onDestroy(uiTab *t) { guint i; - struct tabPage *page; + struct child *page; - // the pages do not have a libui parent, so we can simply destroy them - // we need to remove them from the tab first; see below for (i = 0; i < t->pages->len; i++) { - page = &g_array_index(t->pages, struct tabPage, i); - uiControlSetParent(page->c, NULL); - uiControlDestroy(page->c); - gtk_widget_destroy(page->box); + page = g_array_index(t->pages, struct child *, i); + childDestroy(page); } g_array_free(t->pages, TRUE); } @@ -50,35 +40,24 @@ void uiTabAppend(uiTab *t, const char *name, uiControl *child) void uiTabInsertAt(uiTab *t, const char *name, uintmax_t n, uiControl *child) { - struct tabPage page; + struct child *page; - page.c = child; - page.box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - gtk_container_add(GTK_CONTAINER(page.box), - GTK_WIDGET(uiControlHandle(page.c))); - gtk_widget_show(page.box); + // this will create a tab, because of gtk_container_add() + page = newChildWithBox(child, uiControl(t), t->container, 0); - gtk_container_add(t->container, page.box); - gtk_notebook_set_tab_label_text(t->notebook, page.box, name); - gtk_notebook_reorder_child(t->notebook, page.box, n); + gtk_notebook_set_tab_label_text(t->notebook, childBox(page), name); + gtk_notebook_reorder_child(t->notebook, childBox(page), n); g_array_insert_val(t->pages, n, page); } void uiTabDelete(uiTab *t, uintmax_t n) { - struct tabPage *page; - - page = &g_array_index(t->pages, struct tabPage, n); - - // make sure the page's control isn't destroyed - uiControlSetParent(page->c, NULL); - gtk_container_remove(GTK_CONTAINER(page->box), - GTK_WIDGET(uiControlHandle(page->c))); - - // this will also remove the tab - gtk_widget_destroy(page->box); + struct child *page; + page = g_array_index(t->pages, struct child *, n); + // this will remove the tab, because gtk_widget_destroy() calls gtk_container_remove() + childRemove(page); g_array_remove_index(t->pages, n); } @@ -89,19 +68,19 @@ uintmax_t uiTabNumPages(uiTab *t) int uiTabMargined(uiTab *t, uintmax_t n) { - struct tabPage *page; + struct child *page; - page = &g_array_index(t->pages, struct tabPage, n); - return page->margined; + page = g_array_index(t->pages, struct child *, n); + return childFlag(page); } void uiTabSetMargined(uiTab *t, uintmax_t n, int margined) { - struct tabPage *page; + struct child *page; - page = &g_array_index(t->pages, struct tabPage, n); - page->margined = margined; - setMargined(GTK_CONTAINER(page->box), page->margined); + page = g_array_index(t->pages, struct child *, n); + childSetFlag(page, margined); + childSetMargined(page, childFlag(page)); } uiTab *uiNewTab(void) @@ -116,7 +95,7 @@ uiTab *uiNewTab(void) gtk_notebook_set_scrollable(t->notebook, TRUE); - t->pages = g_array_new(FALSE, TRUE, sizeof (struct tabPage)); + t->pages = g_array_new(FALSE, TRUE, sizeof (struct child *)); uiUnixFinishNewControl(t, uiTab); //TODO uiControl(t)->ContainerUpdateState = tabContainerUpdateState;