diff --git a/resources/head.ui b/resources/head.ui index c16ffaa..2efbefc 100644 --- a/resources/head.ui +++ b/resources/head.ui @@ -66,6 +66,7 @@ True word-char end + 40 0 diff --git a/src/main.c b/src/main.c index 2484a63..7372aa0 100644 --- a/src/main.c +++ b/src/main.c @@ -296,6 +296,24 @@ static void queue_canvas_draw(struct wd_state *state) { gtk_gl_area_queue_render(GTK_GL_AREA(state->canvas)); } +// GTK toplevels on Wayland don't grow to fit new content once mapped, so +// force a resize whenever a layout change may need more space than the +// window currently has (https://github.com/artizirk/wdisplays/issues/5). +static void resize_to_fit(struct wd_state *state) { + if (state->window == NULL) { + return; + } + GtkRequisition natural; + gtk_widget_get_preferred_size(state->window, NULL, &natural); + gint cur_width, cur_height; + gtk_window_get_size(GTK_WINDOW(state->window), &cur_width, &cur_height); + gint new_width = MAX(cur_width, natural.width); + gint new_height = MAX(cur_height, natural.height); + if (new_width != cur_width || new_height != cur_height) { + gtk_window_resize(GTK_WINDOW(state->window), new_width, new_height); + } +} + static void show_apply(struct wd_state *state) { const gchar *page = "title"; if (has_changes(state)) { @@ -306,6 +324,7 @@ static void show_apply(struct wd_state *state) { } } gtk_stack_set_visible_child_name(GTK_STACK(state->header_stack), page); + resize_to_fit(state); } static void update_ui(WdHeadForm *form, enum wd_head_fields fields, @@ -350,6 +369,7 @@ void wd_ui_reset_heads(struct wd_state *state) { } update_canvas_size(state); queue_canvas_draw(state); + resize_to_fit(state); } void wd_ui_reset_head(const struct wd_head *head, enum wd_head_fields fields) { @@ -938,6 +958,7 @@ static void activate(GtkApplication* app, gpointer user_data) { GtkBuilder *builder = gtk_builder_new_from_resource( WDISPLAYS_RESOURCE_PREFIX "/wdisplays.ui"); GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "heads_window")); + state->window = window; state->main_box = GTK_WIDGET(gtk_builder_get_object(builder, "main_box")); state->header_stack = GTK_WIDGET(gtk_builder_get_object(builder, "header_stack")); state->stack_switcher = GTK_WIDGET(gtk_builder_get_object(builder, "heads_stack_switcher")); diff --git a/src/wdisplays.h b/src/wdisplays.h index 4824017..f0c919f 100644 --- a/src/wdisplays.h +++ b/src/wdisplays.h @@ -200,6 +200,7 @@ struct wd_state { bool panning; struct wd_point pan_start; + GtkWidget *window; GtkWidget *main_box; GtkWidget *header_stack; GtkWidget *stack_switcher;