diff options
author | brummer10 <brummer-@web.de> | 2018-12-12 13:37:54 +0100 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2019-02-19 08:42:28 +0100 |
commit | db07a21d4848455580d6c58ce32128266dd4f47f (patch) | |
tree | 39dcf06ea39513e7921cf59e077d03e90a036b59 /src/x11_in_gtk3.c | |
parent | 7983a5aae615290d04fd43cbc2752f8cf4a46d10 (diff) | |
download | suil-db07a21d4848455580d6c58ce32128266dd4f47f.tar.gz suil-db07a21d4848455580d6c58ce32128266dd4f47f.tar.bz2 suil-db07a21d4848455580d6c58ce32128266dd4f47f.zip |
Add support for min_size and base_size in XSizeHints
This allows a plugin UI to be shown with a default size but be resizable to a
smaller size, within limits, afterwards.
Diffstat (limited to 'src/x11_in_gtk3.c')
-rw-r--r-- | src/x11_in_gtk3.c | 72 |
1 files changed, 66 insertions, 6 deletions
diff --git a/src/x11_in_gtk3.c b/src/x11_in_gtk3.c index 0c016c9..a55eb4c 100644 --- a/src/x11_in_gtk3.c +++ b/src/x11_in_gtk3.c @@ -39,6 +39,8 @@ struct _SuilX11Wrapper { const LV2UI_Idle_Interface* idle_iface; guint idle_id; guint idle_ms; + int req_width; + int req_height; }; struct _SuilX11WrapperClass { @@ -253,6 +255,55 @@ suil_x11_wrapper_key_event(GtkWidget* widget, } static void +suil_x11_wrapper_get_preferred_width(GtkWidget* widget, + gint* minimum_width, + gint* natural_width) +{ + + SuilX11Wrapper* const self = SUIL_X11_WRAPPER(widget); + if (x_window_is_valid(self)) { + GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(self->plug)); + XSizeHints hints; + memset(&hints, 0, sizeof(hints)); + long supplied; + XGetWMNormalHints(GDK_WINDOW_XDISPLAY(window), + (Window)self->instance->ui_widget, + &hints, + &supplied); + *natural_width = ((hints.flags & PBaseSize) ? hints.base_width + : self->req_width); + *minimum_width = ((hints.flags & PMinSize) ? hints.min_width + : self->req_width); + } else { + *natural_width = *minimum_width = self->req_width; + } +} + +static void +suil_x11_wrapper_get_preferred_height(GtkWidget* widget, + gint* minimum_height, + gint* natural_height) +{ + SuilX11Wrapper* const self = SUIL_X11_WRAPPER(widget); + if (x_window_is_valid(self)) { + GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(self->plug)); + XSizeHints hints; + memset(&hints, 0, sizeof(hints)); + long supplied; + XGetWMNormalHints(GDK_WINDOW_XDISPLAY(window), + (Window)self->instance->ui_widget, + &hints, + &supplied); + *natural_height = ((hints.flags & PBaseSize) ? hints.base_height + : self->req_height); + *minimum_height = ((hints.flags & PMinSize) ? hints.min_height + : self->req_height); + } else { + *natural_height = *minimum_height = self->req_height; + } +} + +static void suil_x11_on_size_allocate(GtkWidget* widget, GtkAllocation* a) { @@ -272,11 +323,13 @@ suil_x11_wrapper_class_init(SuilX11WrapperClass* klass) GObjectClass* const gobject_class = G_OBJECT_CLASS(klass); GtkWidgetClass* const widget_class = GTK_WIDGET_CLASS(klass); - gobject_class->finalize = suil_x11_wrapper_finalize; - widget_class->realize = suil_x11_wrapper_realize; - widget_class->show = suil_x11_wrapper_show; - widget_class->key_press_event = suil_x11_wrapper_key_event; - widget_class->key_release_event = suil_x11_wrapper_key_event; + gobject_class->finalize = suil_x11_wrapper_finalize; + widget_class->realize = suil_x11_wrapper_realize; + widget_class->show = suil_x11_wrapper_show; + widget_class->key_press_event = suil_x11_wrapper_key_event; + widget_class->key_release_event = suil_x11_wrapper_key_event; + widget_class->get_preferred_width = suil_x11_wrapper_get_preferred_width; + widget_class->get_preferred_height = suil_x11_wrapper_get_preferred_height; } static void @@ -287,12 +340,19 @@ suil_x11_wrapper_init(SuilX11Wrapper* self) self->instance = NULL; self->idle_iface = NULL; self->idle_ms = 1000 / 30; // 30 Hz default + self->req_width = 0; + self->req_height = 0; } static int wrapper_resize(LV2UI_Feature_Handle handle, int width, int height) { - gtk_widget_set_size_request(GTK_WIDGET(handle), width, height); + SuilX11Wrapper* const wrap = SUIL_X11_WRAPPER(handle); + + wrap->req_width = width; + wrap->req_height = height; + + gtk_widget_queue_resize(GTK_WIDGET(handle)); return 0; } |