libui/redo/unix/control.c

113 lines
2.8 KiB
C

// 11 june 2015
#include "uipriv_unix.h"
#define WIDGET(c) (GTK_WIDGET(uiControlHandle((c))))
static void singleWidgetCommitDestroy(uiControl *c)
{
g_object_unref(WIDGET(c));
}
static void singleWidgetCommitSetParent(uiControl *c, uiControl *parent)
{
GtkWidget *newParent;
GtkWidget *oldParent;
if (parent == NULL) {
oldParent = WIDGET(uiControlParent(c));
gtk_container_remove(GTK_CONTAINER(oldParent), WIDGET(c));
return;
}
newParent = WIDGET(parent);
gtk_container_add(GTK_CONTAINER(newParent), WIDGET(c));
}
static void singleWidgetPreferredSize(uiControl *c, uiSizing *d, intmax_t *width, intmax_t *height)
{
// use the natural height; it makes more sense
GtkRequisition natural;
gtk_widget_get_preferred_size(WIDGET(c), NULL, &natural);
*width = (intmax_t) (natural.width);
*height = (intmax_t) (natural.height);
}
static void singleWidgetResize(uiControl *c, intmax_t x, intmax_t y, intmax_t width, intmax_t height, uiSizing *d)
{
GtkAllocation a;
a.x = x;
a.y = y;
a.width = width;
a.height = height;
gtk_widget_size_allocate(WIDGET(c), &a);
}
static uiSizing *singleWidgetSizing(uiControl *c)
{
return uiUnixNewSizing();
}
static void singleWidgetCommitShow(uiControl *c)
{
gtk_widget_show(WIDGET(c));
}
static void singleWidgetCommitHide(uiControl *c)
{
gtk_widget_hide(WIDGET(c));
}
static void singleWidgetCommitEnable(uiControl *c)
{
gtk_widget_set_sensitive(WIDGET(c), TRUE);
}
static void singleWidgetCommitDisable(uiControl *c)
{
gtk_widget_set_sensitive(WIDGET(c), FALSE);
}
static uintptr_t singleWidgetStartZOrder(uiControl *c)
{
// we don't need to do anything; GTK+ does it for us
return 0;
}
static uintptr_t singleWidgetSetZOrder(uiControl *c, uintptr_t insertAfter)
{
// we don't need to do anything; GTK+ does it for us
return 0;
}
static int singleWidgetHasTabStops(uiControl *c)
{
complain("singleWidgetHasTabStops() meaningless on GTK+");
return 0; // keep compiler happy
}
// called after creating the control's widget
void uiUnixMakeSingleWidgetControl(uiControl *c, GtkWidget *widget)
{
// we have to sink the widget so we can reparent it
g_object_ref_sink(widget);
uiControl(c)->CommitDestroy = singleWidgetCommitDestroy;
uiControl(c)->CommitSetParent = singleWidgetCommitSetParent;
uiControl(c)->PreferredSize = singleWidgetPreferredSize;
uiControl(c)->Resize = singleWidgetResize;
uiControl(c)->Sizing = singleWidgetSizing;
uiControl(c)->CommitShow = singleWidgetCommitShow;
uiControl(c)->CommitHide = singleWidgetCommitHide;
uiControl(c)->CommitEnable = singleWidgetCommitEnable;
uiControl(c)->CommitDisable = singleWidgetCommitDisable;
uiControl(c)->StartZOrder = singleWidgetStartZOrder;
uiControl(c)->SetZOrder = singleWidgetSetZOrder;
uiControl(c)->HasTabStops = singleWidgetHasTabStops;
}
void queueResize(uiControl *c)
{
gtk_widget_queue_resize(WIDGET(c));
}