From 7c2a32fec6774f07fa4149526b0e10e87e52f456 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Wed, 8 Apr 2015 18:58:59 -0400 Subject: [PATCH] Implemented the parent updating logic on GTK+. --- new/container_unix.c | 6 ++++++ new/newcontrol_unix.c | 13 ++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/new/container_unix.c b/new/container_unix.c index e3f8da3..d9d6996 100644 --- a/new/container_unix.c +++ b/new/container_unix.c @@ -102,3 +102,9 @@ GtkWidget *newContainer(void) { return GTK_WIDGET(g_object_new(uiContainerType, NULL)); } + +void updateParent(uintptr_t parent) +{ + if (parent != 0) + gtk_widget_queue_resize(GTK_WIDGET(parent)); +} diff --git a/new/newcontrol_unix.c b/new/newcontrol_unix.c index c883a5a..0f050be 100644 --- a/new/newcontrol_unix.c +++ b/new/newcontrol_unix.c @@ -9,6 +9,7 @@ struct uiSingleWidgetControl { GtkWidget *scrolledWindow; GtkWidget *immediate; // the widget that is added to the parent container; either widget or scrolledWindow void *data; + uintptr_t parent; }; #define S(c) ((uiSingleWidgetControl *) (c)) @@ -25,7 +26,16 @@ static uintptr_t singleHandle(uiControl *c) static void singleSetParent(uiControl *c, uintptr_t parent) { - gtk_container_add(GTK_CONTAINER(parent), S(c)->immediate); + uiSingleWidgetControl *s = S(c); + uintptr_t oldparent; + + oldparent = s->parent; + s->parent = parent; + if (oldparent != 0) + gtk_container_remove(GTK_CONTAINER(oldparent), s->immediate); + gtk_container_add(GTK_CONTAINER(s->parent), s->immediate); + updateParent(oldparent); + updateParent(s->parent); } static uiSize singlePreferredSize(uiControl *c, uiSizing *d) @@ -91,6 +101,7 @@ uiControl *uiUnixNewControl(GType type, gboolean inScrolledWindow, gboolean scro // with this: // - end user call works (shoudn't be in any container) // - call in uiContainer works (both refs freed) + // this also ensures singleSetParent() works properly when changing parents g_object_ref_sink(c->immediate); // and let's free the uiSingleWidgetControl with it g_signal_connect(c->immediate, "destroy", G_CALLBACK(onDestroy), c);