From 1bd37af7d0ac109f0dd47bc59b0118c552ce9144 Mon Sep 17 00:00:00 2001 From: deepend-tildeclub Date: Mon, 27 Apr 2026 15:36:22 -0600 Subject: [PATCH] Refresh menu sizing after theme switch --- src/fe-gtk/maingui.c | 45 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/fe-gtk/maingui.c b/src/fe-gtk/maingui.c index 2e84e85d..1377b2d5 100644 --- a/src/fe-gtk/maingui.c +++ b/src/fe-gtk/maingui.c @@ -3566,6 +3566,44 @@ mg_theme_userlist_changed (const ThemeChangedEvent *event, gpointer userdata) mg_theme_apply_userlist_style (gui); } +static void +mg_theme_refresh_menu_widget (GtkWidget *widget) +{ + GtkRequisition minimum; + GtkRequisition natural; + + if (!widget) + return; + + gtk_widget_queue_resize (widget); + gtk_widget_get_preferred_size (widget, &minimum, &natural); +} + +static void +mg_theme_refresh_menu_tree (GtkWidget *menu) +{ + GList *children; + GList *node; + + if (!menu || !GTK_IS_MENU_SHELL (menu)) + return; + + children = gtk_container_get_children (GTK_CONTAINER (menu)); + for (node = children; node; node = node->next) + { + GtkWidget *item = GTK_WIDGET (node->data); + GtkWidget *submenu = NULL; + + if (GTK_IS_MENU_ITEM (item)) + submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (item)); + if (submenu) + mg_theme_refresh_menu_tree (submenu); + mg_theme_refresh_menu_widget (item); + } + g_list_free (children); + mg_theme_refresh_menu_widget (menu); +} + static void mg_theme_window_changed (const ThemeChangedEvent *event, gpointer userdata) { @@ -3576,8 +3614,11 @@ mg_theme_window_changed (const ThemeChangedEvent *event, gpointer userdata) !theme_changed_event_has_reason (event, THEME_CHANGED_REASON_WIDGET_STYLE)) return; - if (gui) - theme_manager_apply_to_window (gui->window); + if (!gui) + return; + + theme_manager_apply_to_window (gui->window); + mg_theme_refresh_menu_tree (gui->menu); } static void