From 50b7531dd2755875c829be3bced52624099dc6f8 Mon Sep 17 00:00:00 2001 From: Sebastian Kaminski Date: Fri, 1 Apr 2022 22:19:24 +0200 Subject: [PATCH] Prevent the boolean widget from changing size when toggled When the label of the button for the boolean widget changes, the size of the button was also changing. This commit sets the minimum size of the widget so that it will accommodate both labels. --- src/widget-boolean.c | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/src/widget-boolean.c b/src/widget-boolean.c index e971c5a..7fa26dc 100644 --- a/src/widget-boolean.c +++ b/src/widget-boolean.c @@ -9,6 +9,18 @@ static void button_clicked(GtkWidget *widget, struct alsa_elem *elem) { alsa_set_elem_value(elem, value); } +static void toggle_button_set_text(struct alsa_elem *elem, const char *text) { + if (!text) + return; + + if (*text == '*') { + GtkWidget *icon = gtk_image_new_from_icon_name(text + 1); + gtk_button_set_child(GTK_BUTTON(elem->widget), icon); + } else { + gtk_button_set_label(GTK_BUTTON(elem->widget), text); + } +} + static void toggle_button_updated(struct alsa_elem *elem) { int is_writable = alsa_get_elem_writable(elem); gtk_widget_set_sensitive(elem->widget, is_writable); @@ -16,17 +28,7 @@ static void toggle_button_updated(struct alsa_elem *elem) { int value = alsa_get_elem_value(elem); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(elem->widget), value); - const char *text = elem->bool_text[value]; - if (text) { - if (*text == '*') { - GtkWidget *icon = gtk_image_new_from_icon_name(text + 1); - gtk_button_set_child(GTK_BUTTON(elem->widget), icon); - } else { - gtk_button_set_label( - GTK_BUTTON(elem->widget), elem->bool_text[value] - ); - } - } + toggle_button_set_text(elem, elem->bool_text[value]); } GtkWidget *make_boolean_alsa_elem( @@ -44,6 +46,24 @@ GtkWidget *make_boolean_alsa_elem( elem->bool_text[0] = disabled_text; elem->bool_text[1] = enabled_text; + // find the maximum width and height of both possible labels + int max_width = 0, max_height = 0; + for (int i = 0; i < 2; i++) { + toggle_button_set_text(elem, elem->bool_text[i]); + + GtkRequisition *size = gtk_requisition_new(); + gtk_widget_get_preferred_size(button, size, NULL); + + if (size->width > max_width) + max_width = size->width; + if (size->height > max_height) + max_height = size->height; + } + + // set the widget minimum size to the maximum label size so that the + // widget doesn't change size when the label changes + gtk_widget_set_size_request(button, max_width, max_height); + toggle_button_updated(elem); return button;