// 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)); }