Set up a new system for destroying controls on GTK+. Will migrate controls now.

This commit is contained in:
Pietro Gagliardi 2015-04-18 12:30:25 -04:00
parent dc2a6230c8
commit f0055e948b
2 changed files with 10 additions and 2 deletions

View File

@ -10,8 +10,9 @@ This file assumes that you have included <gtk/gtk.h> and "ui.h" beforehand. It p
// uiUnixNewControl() creates a new uiControl with the given GTK+ control inside, storing it in the uiControl at c.
// The second parameter is the type of the control, as passed to the first argument of g_object_new().
// The two scrolledWindow parameters allow placing scrollbars on the new control.
// The destroy parameter is for a function that should be called when destroying the widget.
// The firstProperty parameter and beyond allow passing construct properties to the new control, as with g_object_new(); end this list with NULL.
extern void uiUnixNewControl(uiControl *c, GType type, gboolean inScrolledWindow, gboolean scrolledWindowHasBorder, const char *firstProperty, ...);
extern void uiUnixNewControl(uiControl *c, GType type, gboolean inScrolledWindow, gboolean scrolledWindowHasBorder, void (*onDestroy)(uiControl *), const char *firstProperty, ...);
struct uiSizingSys {
// this structure currently left blank

View File

@ -13,6 +13,8 @@ struct singleWidget {
gboolean userDisabled;
gboolean containerDisabled;
gboolean canDestroy;
void (*onDestroy)(uiControl *);
uiControl *onDestroyControl;
};
static void singleDestroy(uiControl *c)
@ -166,10 +168,11 @@ static void onDestroy(GtkWidget *widget, gpointer data)
if (!s->canDestroy)
// TODO switch to complain()
g_error("trying to destroy control with singleWidget at %p before uiControlDestroy()", s);
(*(s->onDestroy))(s->onDestroyControl);
uiFree(s);
}
void uiUnixNewControl(uiControl *c, GType type, gboolean inScrolledWindow, gboolean scrolledWindowHasBorder, const char *firstProperty, ...)
void uiUnixNewControl(uiControl *c, GType type, gboolean inScrolledWindow, gboolean scrolledWindowHasBorder, void (*onDestroy)(uiControl *), const char *firstProperty, ...)
{
singleWidget *s;
va_list ap;
@ -201,8 +204,12 @@ void uiUnixNewControl(uiControl *c, GType type, gboolean inScrolledWindow, gbool
// - end user call works (shoudn't be in any container)
// - call in uiContainer works (both refs freed)
// this also ensures singleRemoveParent() works properly
// TODO double-check this for new parenting rules
g_object_ref_sink(s->immediate);
s->onDestroy = onDestroy;
s->onDestroyControl = c;
// assign s later; we still need it for one more thing
c->Destroy = singleDestroy;
c->Handle = singleHandle;