From a4cf8071d916f087fe057c3d7451d1fbfa810f18 Mon Sep 17 00:00:00 2001 From: Marko Lindqvist Date: Sat, 14 Jan 2023 10:41:30 +0200 Subject: [PATCH 43/43] gtk4: Fix submenu leaks See osdn #46491 Signed-off-by: Marko Lindqvist --- client/gui-gtk-4.0/cityrep.c | 4 ++-- client/gui-gtk-4.0/diplodlg.c | 8 ++++---- client/gui-gtk-4.0/gui_stuff.h | 7 +++++++ client/gui-gtk-4.0/menu.c | 37 +++++++++++++++++----------------- client/gui-gtk-4.0/plrdlg.c | 8 ++++---- 5 files changed, 36 insertions(+), 28 deletions(-) diff --git a/client/gui-gtk-4.0/cityrep.c b/client/gui-gtk-4.0/cityrep.c index bc4045ecae..d3db907dcf 100644 --- a/client/gui-gtk-4.0/cityrep.c +++ b/client/gui-gtk-4.0/cityrep.c @@ -1107,7 +1107,7 @@ static GtkWidget *create_city_report_menu(void) menu_item_append_unref(submenu, g_menu_item_new(_("Clear _Worklist"), "win.clear_worklist")); - g_menu_append_submenu(menu, _("_Production"), G_MENU_MODEL(submenu)); + submenu_append_unref(menu, _("_Production"), G_MENU_MODEL(submenu)); #ifdef MENUS_GTK3 menu = gtk_menu_button_new(); @@ -1164,7 +1164,7 @@ static GtkWidget *create_city_report_menu(void) #endif /* MENUS_GTK3 */ submenu = create_display_menu(group); - g_menu_append_submenu(menu, _("_Display"), G_MENU_MODEL(submenu)); + submenu_append_unref(menu, _("_Display"), G_MENU_MODEL(submenu)); gtk_widget_insert_action_group(aux_menu, "win", group); gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(aux_menu), G_MENU_MODEL(menu)); diff --git a/client/gui-gtk-4.0/diplodlg.c b/client/gui-gtk-4.0/diplodlg.c index 9fd3c73899..5e4091af55 100644 --- a/client/gui-gtk-4.0/diplodlg.c +++ b/client/gui-gtk-4.0/diplodlg.c @@ -317,7 +317,7 @@ static GMenu *create_clause_menu(GActionGroup *group, } if (any_map) { - g_menu_append_submenu(topmenu, _("_Maps"), G_MENU_MODEL(submenu)); + submenu_append_unref(topmenu, _("_Maps"), G_MENU_MODEL(submenu)); } /* Trading: advances */ @@ -391,7 +391,7 @@ static GMenu *create_clause_menu(GActionGroup *group, g_list_free(sorting_list); } - g_menu_append_submenu(topmenu, _("_Advances"), G_MENU_MODEL(submenu)); + submenu_append_unref(topmenu, _("_Advances"), G_MENU_MODEL(submenu)); } /* Trading: cities. */ @@ -448,7 +448,7 @@ static GMenu *create_clause_menu(GActionGroup *group, free(city_list_ptrs); } - g_menu_append_submenu(topmenu, _("_Cities"), G_MENU_MODEL(submenu)); + submenu_append_unref(topmenu, _("_Cities"), G_MENU_MODEL(submenu)); } /* Give shared vision. */ @@ -557,7 +557,7 @@ static GMenu *create_clause_menu(GActionGroup *group, } if (pact_clauses > 0) { - g_menu_append_submenu(topmenu, _("_Pacts"), G_MENU_MODEL(submenu)); + submenu_append_unref(topmenu, _("_Pacts"), G_MENU_MODEL(submenu)); } else { g_object_unref(submenu); } diff --git a/client/gui-gtk-4.0/gui_stuff.h b/client/gui-gtk-4.0/gui_stuff.h index 96d35cc11e..ff5696f908 100644 --- a/client/gui-gtk-4.0/gui_stuff.h +++ b/client/gui-gtk-4.0/gui_stuff.h @@ -153,4 +153,11 @@ GtkWidget *widget_get_child(GtkWidget *wdg); g_object_unref(_item_var); \ } +#define submenu_append_unref(menu, name, submenu) \ +{ \ + GMenuModel *_submenu_var = submenu; \ + g_menu_append_submenu(menu, name, _submenu_var); \ + g_object_unref(_submenu_var); \ +} + #endif /* FC__GUI_STUFF_H */ diff --git a/client/gui-gtk-4.0/menu.c b/client/gui-gtk-4.0/menu.c index 782fade133..de38c399b3 100644 --- a/client/gui-gtk-4.0/menu.c +++ b/client/gui-gtk-4.0/menu.c @@ -2527,6 +2527,7 @@ static void menu_entry_init(GMenu *sub, const char *key) item = g_menu_item_new(Q_(info->name), actname); } + /* Should be menu_item_append_unref()? */ g_menu_append_item(sub, item); g_object_unref(item); } @@ -2638,14 +2639,14 @@ static GMenu *setup_menus(GtkApplication *app) menu_entry_init(options_menu, "SAVE_OPTIONS"); menu_entry_init(options_menu, "SAVE_OPTIONS_ON_EXIT"); - g_menu_append_submenu(topmenu, _("_Options"), G_MENU_MODEL(options_menu)); + submenu_append_unref(topmenu, _("_Options"), G_MENU_MODEL(options_menu)); menu_entry_init(topmenu, "GAME_SAVE"); menu_entry_init(topmenu, "GAME_SAVE_AS"); menu_entry_init(topmenu, "LEAVE"); menu_entry_init(topmenu, "QUIT"); - g_menu_append_submenu(menubar, _("_Game"), G_MENU_MODEL(topmenu)); + submenu_append_unref(menubar, _("_Game"), G_MENU_MODEL(topmenu)); topmenu = g_menu_new(); @@ -2659,20 +2660,20 @@ static GMenu *setup_menus(GtkApplication *app) /* menu_entry_init(topmenu, "SCENARIO_SAVE"); */ menu_entry_init(topmenu, "CLIENT_LUA_SCRIPT"); - g_menu_append_submenu(menubar, _("_Edit"), G_MENU_MODEL(topmenu)); + submenu_append_unref(menubar, _("_Edit"), G_MENU_MODEL(topmenu)); view_menu = g_menu_new(); menu_entry_init(view_menu, "FULL_SCREEN"); menu_entry_init(view_menu, "CENTER_VIEW"); - g_menu_append_submenu(menubar, Q_("?verb:_View"), G_MENU_MODEL(view_menu)); + submenu_append_unref(menubar, Q_("?verb:_View"), G_MENU_MODEL(view_menu)); unit_menu = g_menu_new(); /* Placeholder submenu (so that menu update has something to replace) */ submenu = g_menu_new(); - g_menu_append_submenu(unit_menu, N_("Go to a_nd..."), G_MENU_MODEL(submenu)); + submenu_append_unref(unit_menu, N_("Go to a_nd..."), G_MENU_MODEL(submenu)); menu_entry_init(unit_menu, "UNIT_EXPLORE"); menu_entry_init(unit_menu, "UNIT_SENTRY"); @@ -2685,7 +2686,7 @@ static GMenu *setup_menus(GtkApplication *app) menu_entry_init(unit_menu, "UNIT_WAIT"); menu_entry_init(unit_menu, "UNIT_DONE"); - g_menu_append_submenu(menubar, _("_Unit"), G_MENU_MODEL(unit_menu)); + submenu_append_unref(menubar, _("_Unit"), G_MENU_MODEL(unit_menu)); work_menu = g_menu_new(); menu_entry_init(work_menu, "BUILD_CITY"); @@ -2693,13 +2694,13 @@ static GMenu *setup_menus(GtkApplication *app) /* Placeholder submenus (so that menu update has something to replace) */ submenu = g_menu_new(); - g_menu_append_submenu(work_menu, _("Build _Path"), G_MENU_MODEL(submenu)); + submenu_append_unref(work_menu, _("Build _Path"), G_MENU_MODEL(submenu)); submenu = g_menu_new(); - g_menu_append_submenu(work_menu, _("Build _Irrigation"), G_MENU_MODEL(submenu)); + submenu_append_unref(work_menu, _("Build _Irrigation"), G_MENU_MODEL(submenu)); submenu = g_menu_new(); - g_menu_append_submenu(work_menu, _("Build _Mine"), G_MENU_MODEL(submenu)); + submenu_append_unref(work_menu, _("Build _Mine"), G_MENU_MODEL(submenu)); submenu = g_menu_new(); - g_menu_append_submenu(work_menu, _("_Clean Nuisance"), G_MENU_MODEL(submenu)); + submenu_append_unref(work_menu, _("_Clean Nuisance"), G_MENU_MODEL(submenu)); menu_entry_init(work_menu, "BUILD_ROAD"); menu_entry_init(work_menu, "BUILD_IRRIGATION"); @@ -2709,7 +2710,7 @@ static GMenu *setup_menus(GtkApplication *app) menu_entry_init(work_menu, "TRANSFORM_TERRAIN"); menu_entry_init(work_menu, "CLEAN"); - g_menu_append_submenu(menubar, _("_Work"), G_MENU_MODEL(work_menu)); + submenu_append_unref(menubar, _("_Work"), G_MENU_MODEL(work_menu)); combat_menu = g_menu_new(); menu_entry_init(combat_menu, "FORTIFY"); @@ -2718,9 +2719,9 @@ static GMenu *setup_menus(GtkApplication *app) /* Placeholder submenu (so that menu update has something to replace) */ submenu = g_menu_new(); - g_menu_append_submenu(combat_menu, _("Build _Base"), G_MENU_MODEL(submenu)); + submenu_append_unref(combat_menu, _("Build _Base"), G_MENU_MODEL(submenu)); - g_menu_append_submenu(menubar, _("_Combat"), G_MENU_MODEL(combat_menu)); + submenu_append_unref(menubar, _("_Combat"), G_MENU_MODEL(combat_menu)); menu_entry_init(combat_menu, "PARADROP"); menu_entry_init(combat_menu, "PILLAGE"); @@ -2737,7 +2738,7 @@ static GMenu *setup_menus(GtkApplication *app) /* Placeholder submenu (so that menu update has something to replace) */ submenu = g_menu_new(); - g_menu_append_submenu(gov_menu, _("_Government"), G_MENU_MODEL(submenu)); + submenu_append_unref(gov_menu, _("_Government"), G_MENU_MODEL(submenu)); menu_entry_init(gov_menu, "REPORT_WOW"); menu_entry_init(gov_menu, "REPORT_TOP_CITIES"); @@ -2746,7 +2747,7 @@ static GMenu *setup_menus(GtkApplication *app) menu_entry_init(gov_menu, "REPORT_SPACESHIP"); menu_entry_init(gov_menu, "REPORT_ACHIEVEMENTS"); - g_menu_append_submenu(menubar, _("C_ivilization"), G_MENU_MODEL(gov_menu)); + submenu_append_unref(menubar, _("C_ivilization"), G_MENU_MODEL(gov_menu)); topmenu = g_menu_new(); @@ -2767,14 +2768,14 @@ static GMenu *setup_menus(GtkApplication *app) register_bg_actions(G_ACTION_MAP(app), i); } - g_menu_append_submenu(menubar, _("Battle Groups"), G_MENU_MODEL(topmenu)); + submenu_append_unref(menubar, _("Battle Groups"), G_MENU_MODEL(topmenu)); topmenu = g_menu_new(); menu_entry_init(topmenu, "HELP_COPYING"); menu_entry_init(topmenu, "HELP_ABOUT"); - g_menu_append_submenu(menubar, _("_Help"), G_MENU_MODEL(topmenu)); + submenu_append_unref(menubar, _("_Help"), G_MENU_MODEL(topmenu)); #ifndef FREECIV_DEBUG menu_entry_set_visible("RELOAD_TILESET", FALSE, FALSE); @@ -3058,7 +3059,7 @@ void real_menus_update(void) #undef CREATE_SUB_ITEM - g_menu_append_submenu(submenu, name, G_MENU_MODEL(sub_target_menu)); + submenu_append_unref(submenu, name, G_MENU_MODEL(sub_target_menu)); } else { g_signal_connect(act, "activate", G_CALLBACK(unit_goto_and_callback), paction); diff --git a/client/gui-gtk-4.0/plrdlg.c b/client/gui-gtk-4.0/plrdlg.c index d3fb879f2b..fb1650a60a 100644 --- a/client/gui-gtk-4.0/plrdlg.c +++ b/client/gui-gtk-4.0/plrdlg.c @@ -708,16 +708,16 @@ void create_players_dialog(void) topmenu = g_menu_new(); submenu = create_diplomacy_menu(group); - g_menu_append_submenu(topmenu, _("Di_plomacy"), G_MENU_MODEL(submenu)); + submenu_append_unref(topmenu, _("Di_plomacy"), G_MENU_MODEL(submenu)); submenu = create_intelligence_menu(group); - g_menu_append_submenu(topmenu, _("_Intelligence"), G_MENU_MODEL(submenu)); + submenu_append_unref(topmenu, _("_Intelligence"), G_MENU_MODEL(submenu)); submenu = create_show_menu(group); - g_menu_append_submenu(topmenu, _("_Display"), G_MENU_MODEL(submenu)); + submenu_append_unref(topmenu, _("_Display"), G_MENU_MODEL(submenu)); submenu = create_ai_menu(group); - g_menu_append_submenu(topmenu, _("_AI"), G_MENU_MODEL(submenu)); + submenu_append_unref(topmenu, _("_AI"), G_MENU_MODEL(submenu)); gtk_widget_insert_action_group(aux_menu, "win", group); gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(aux_menu), G_MENU_MODEL(topmenu)); -- 2.39.0