From ec920af20b0463311cb110564ef4facf9e7c2d46 Mon Sep 17 00:00:00 2001 From: Marko Lindqvist Date: Sat, 27 Nov 2021 14:30:45 +0200 Subject: [PATCH 38/38] gtk3x: Avoid calling gtk_dialog_run() by introducing blocking_dialog() gtk_dialog_run() is going away in gtk-3.98.4. Introduce our own blocking_dialog() for cases where we need the blocking. Here we blindly replace all the existing gtk_dialog_run() uses with blocking_dialog(), without considering if the blocking behavior is really right thing to do in each case. See osdn #43284 Signed-off-by: Marko Lindqvist --- client/gui-gtk-4.0/cityrep.c | 2 +- client/gui-gtk-4.0/dialogs.c | 8 ++++--- client/gui-gtk-4.0/editgui.c | 5 +++-- client/gui-gtk-4.0/gui_stuff.c | 36 +++++++++++++++++++++++++++++++ client/gui-gtk-4.0/gui_stuff.h | 2 ++ client/gui-gtk-4.0/plrdlg.c | 2 +- client/gui-gtk-4.0/repodlgs.c | 6 +++--- client/gui-gtk-4.0/soundset_dlg.c | 17 ++++----------- client/gui-gtk-4.0/theme_dlg.c | 10 +++------ client/gui-gtk-4.0/tileset_dlg.c | 8 ++----- 10 files changed, 60 insertions(+), 36 deletions(-) diff --git a/client/gui-gtk-4.0/cityrep.c b/client/gui-gtk-4.0/cityrep.c index b8f665bbbc..64d91eff08 100644 --- a/client/gui-gtk-4.0/cityrep.c +++ b/client/gui-gtk-4.0/cityrep.c @@ -642,7 +642,7 @@ static void select_impr_or_unit_callback(GtkWidget *wdg, gpointer data) GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s", buf); g_free(buf); - res = gtk_dialog_run(GTK_DIALOG(w)); /* Synchron. */ + res = blocking_dialog(w); /* Synchron. */ gtk_widget_destroy(w); if (res == GTK_RESPONSE_NO) { break; diff --git a/client/gui-gtk-4.0/dialogs.c b/client/gui-gtk-4.0/dialogs.c index 78e5ee8149..296197ed74 100644 --- a/client/gui-gtk-4.0/dialogs.c +++ b/client/gui-gtk-4.0/dialogs.c @@ -1467,7 +1467,8 @@ void popup_upgrade_dialog(struct unit_list *punits) setup_dialog(shell, toplevel); gtk_dialog_set_default_response(GTK_DIALOG(shell), GTK_RESPONSE_YES); - if (gtk_dialog_run(GTK_DIALOG(shell)) == GTK_RESPONSE_YES) { + /* FIXME: Should not block */ + if (blocking_dialog(shell) == GTK_RESPONSE_YES) { unit_list_iterate(punits, punit) { request_unit_upgrade(punit); } unit_list_iterate_end; @@ -1505,7 +1506,8 @@ void popup_disband_dialog(struct unit_list *punits) setup_dialog(shell, toplevel); gtk_dialog_set_default_response(GTK_DIALOG(shell), GTK_RESPONSE_YES); - if (gtk_dialog_run(GTK_DIALOG(shell)) == GTK_RESPONSE_YES) { + /* FIXME: Should not block */ + if (blocking_dialog(shell) == GTK_RESPONSE_YES) { unit_list_iterate(punits, punit) { if (unit_can_do_action(punit, ACTION_DISBAND_UNIT)) { request_unit_disband(punit); @@ -1557,7 +1559,7 @@ void show_tileset_error(const char *msg) msg); setup_dialog(dialog, toplevel); - gtk_dialog_run(GTK_DIALOG(dialog)); + blocking_dialog(dialog); gtk_widget_destroy(dialog); } diff --git a/client/gui-gtk-4.0/editgui.c b/client/gui-gtk-4.0/editgui.c index 7d0b4f10aa..4388e944d7 100644 --- a/client/gui-gtk-4.0/editgui.c +++ b/client/gui-gtk-4.0/editgui.c @@ -182,13 +182,14 @@ static void try_to_set_editor_tool(enum editor_tool_type ett) if (!editor_tool_is_usable(ett)) { GtkWidget *dialog; + dialog = gtk_message_dialog_new(GTK_WINDOW(toplevel), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", _("The current ruleset does not define any " "objects corresponding to this editor tool.")); gtk_window_set_title(GTK_WINDOW(dialog), editor_tool_get_name(ett)); - gtk_dialog_run(GTK_DIALOG(dialog)); + blocking_dialog(dialog); gtk_widget_destroy(dialog); } else { editor_set_tool(ett); @@ -330,7 +331,7 @@ static int tool_value_selector_run(struct tool_value_selector *tvs) } dialog = tvs->dialog; - res = gtk_dialog_run(GTK_DIALOG(dialog)); + res = blocking_dialog(dialog); gtk_widget_hide(dialog); if (res != GTK_RESPONSE_ACCEPT) { diff --git a/client/gui-gtk-4.0/gui_stuff.c b/client/gui-gtk-4.0/gui_stuff.c index 37f941edea..da7d73dc3c 100644 --- a/client/gui-gtk-4.0/gui_stuff.c +++ b/client/gui-gtk-4.0/gui_stuff.c @@ -1149,3 +1149,39 @@ void gui_dialog_add_content_widget(struct gui_dialog *dlg, GtkWidget *wdg) dlg->content_counter++, 0, 1, 1); } } + +struct blocking_dialog_data { + GMainLoop *loop; + gint response; +}; + +/**********************************************************************//** + Received a response to a blocking dialog +**************************************************************************/ +static void blocking_dialog_response(GtkWidget *dlg, gint response, void *data) +{ + struct blocking_dialog_data *bd_data = (struct blocking_dialog_data *)data; + + bd_data->response = response; + + g_main_loop_quit(bd_data->loop); +} + +/**********************************************************************//** + Present a blocking dialog and wait for response +**************************************************************************/ +gint blocking_dialog(GtkWidget *dlg) +{ + struct blocking_dialog_data data; + GMainLoop *dlg_loop; + + gtk_widget_show(dlg); + dlg_loop = g_main_loop_new(NULL, FALSE); + data.loop = dlg_loop; + g_signal_connect(dlg, "response", G_CALLBACK(blocking_dialog_response), + &data); + + g_main_loop_run(dlg_loop); + + return data.response; +} diff --git a/client/gui-gtk-4.0/gui_stuff.h b/client/gui-gtk-4.0/gui_stuff.h index 396d7c1418..01d0645db4 100644 --- a/client/gui-gtk-4.0/gui_stuff.h +++ b/client/gui-gtk-4.0/gui_stuff.h @@ -136,4 +136,6 @@ void gui_update_font_full(const char *font_name, const char *font_value, void disable_gobject_callback(GObject *obj, GCallback cb); void enable_gobject_callback(GObject *obj, GCallback cb); +gint blocking_dialog(GtkWidget *dlg); + #endif /* FC__GUI_STUFF_H */ diff --git a/client/gui-gtk-4.0/plrdlg.c b/client/gui-gtk-4.0/plrdlg.c index 1cdfa9b597..0cb7ac110f 100644 --- a/client/gui-gtk-4.0/plrdlg.c +++ b/client/gui-gtk-4.0/plrdlg.c @@ -836,7 +836,7 @@ static void confirm_cancel_pact(enum clause_type clause, int plrno, setup_dialog(shell, toplevel); gtk_dialog_set_default_response(GTK_DIALOG(shell), GTK_RESPONSE_NO); - if (gtk_dialog_run(GTK_DIALOG(shell)) == GTK_RESPONSE_YES) { + if (blocking_dialog(shell) == GTK_RESPONSE_YES) { dsend_packet_diplomacy_cancel_pact(&client.conn, plrno, clause); } gtk_widget_destroy(shell); diff --git a/client/gui-gtk-4.0/repodlgs.c b/client/gui-gtk-4.0/repodlgs.c index 444cf7e984..b8be433a1b 100644 --- a/client/gui-gtk-4.0/repodlgs.c +++ b/client/gui-gtk-4.0/repodlgs.c @@ -978,7 +978,7 @@ static void economy_report_command_callback(struct gui_dialog *pdialog, setup_dialog(shell, gui_dialog_get_toplevel(pdialog)); gtk_window_set_title(GTK_WINDOW(shell), _("Sell Improvements")); - if (GTK_RESPONSE_YES == gtk_dialog_run(GTK_DIALOG(shell))) { + if (GTK_RESPONSE_YES == blocking_dialog(shell)) { sell_all_improvements(pimprove, redundant, buf, sizeof(buf)); } gtk_widget_destroy(shell); @@ -1005,7 +1005,7 @@ static void economy_report_command_callback(struct gui_dialog *pdialog, setup_dialog(shell, gui_dialog_get_toplevel(pdialog)); gtk_window_set_title(GTK_WINDOW(shell), _("Disband Units")); - if (GTK_RESPONSE_YES == gtk_dialog_run(GTK_DIALOG(shell))) { + if (GTK_RESPONSE_YES == blocking_dialog(shell)) { disband_all_units(putype, FALSE, buf, sizeof(buf)); } gtk_widget_destroy(shell); @@ -1600,7 +1600,7 @@ static void units_report_command_callback(struct gui_dialog *pdialog, gtk_window_set_title(GTK_WINDOW(shell), _("Upgrade Obsolete Units")); - if (GTK_RESPONSE_YES == gtk_dialog_run(GTK_DIALOG(shell))) { + if (GTK_RESPONSE_YES == blocking_dialog(shell)) { dsend_packet_unit_type_upgrade(&client.conn, utype_number(utype)); } diff --git a/client/gui-gtk-4.0/soundset_dlg.c b/client/gui-gtk-4.0/soundset_dlg.c index 3aba113ef3..67c6a2360e 100644 --- a/client/gui-gtk-4.0/soundset_dlg.c +++ b/client/gui-gtk-4.0/soundset_dlg.c @@ -33,13 +33,10 @@ #include "dialogs_g.h" -static void soundset_suggestion_callback(GtkWidget *dlg, gint arg); -static void musicset_suggestion_callback(GtkWidget *dlg, gint arg); - /************************************************************************//** Callback either loading suggested soundset or doing nothing ****************************************************************************/ -static void soundset_suggestion_callback(GtkWidget *dlg, gint arg) +static void soundset_suggestion_response(gint arg) { if (arg == GTK_RESPONSE_YES) { /* User accepted soundset loading */ @@ -80,13 +77,10 @@ void popup_soundset_suggestion_dialog(void) gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); gtk_widget_show(label); - g_signal_connect(dialog, "response", - G_CALLBACK(soundset_suggestion_callback), NULL); - /* In case incoming rulesets are incompatible with current soundset * we need to block their receive before user has accepted loading * of the correct soundset. */ - gtk_dialog_run(GTK_DIALOG(dialog)); + soundset_suggestion_response(blocking_dialog(dialog)); gtk_widget_destroy(dialog); } @@ -94,7 +88,7 @@ void popup_soundset_suggestion_dialog(void) /************************************************************************//** Callback either loading suggested musicset or doing nothing ****************************************************************************/ -static void musicset_suggestion_callback(GtkWidget *dlg, gint arg) +static void musicset_suggestion_response(gint arg) { if (arg == GTK_RESPONSE_YES) { /* User accepted musicset loading */ @@ -133,13 +127,10 @@ void popup_musicset_suggestion_dialog(void) gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); gtk_widget_show(label); - g_signal_connect(dialog, "response", - G_CALLBACK(musicset_suggestion_callback), NULL); - /* In case incoming rulesets are incompatible with current musicset * we need to block their receive before user has accepted loading * of the correct musicset. */ - gtk_dialog_run(GTK_DIALOG(dialog)); + musicset_suggestion_response(blocking_dialog(dialog)); gtk_widget_destroy(dialog); } diff --git a/client/gui-gtk-4.0/theme_dlg.c b/client/gui-gtk-4.0/theme_dlg.c index c1fb3c3b08..b4754979cf 100644 --- a/client/gui-gtk-4.0/theme_dlg.c +++ b/client/gui-gtk-4.0/theme_dlg.c @@ -26,15 +26,14 @@ /* gui-gtk-4.0 */ #include "gui_main.h" +#include "gui_stuff.h" static bool load_theme = FALSE; -static void theme_suggestion_callback(GtkWidget *dlg, gint arg); - /************************************************************************//** Callback deciding if the theme may be loaded or not ****************************************************************************/ -static void theme_suggestion_callback(GtkWidget *dlg, gint arg) +static void theme_suggestion_response(gint arg) { load_theme = (arg == GTK_RESPONSE_YES); } @@ -77,10 +76,7 @@ bool popup_theme_suggestion_dialog(const char *theme_name) gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); gtk_widget_show(label); - g_signal_connect(dialog, "response", - G_CALLBACK(theme_suggestion_callback), NULL); - - gtk_dialog_run(GTK_DIALOG(dialog)); + theme_suggestion_response(blocking_dialog(dialog)); gtk_widget_destroy(dialog); diff --git a/client/gui-gtk-4.0/tileset_dlg.c b/client/gui-gtk-4.0/tileset_dlg.c index f794a6f4a1..d299c4b0e9 100644 --- a/client/gui-gtk-4.0/tileset_dlg.c +++ b/client/gui-gtk-4.0/tileset_dlg.c @@ -34,12 +34,11 @@ #include "dialogs_g.h" extern char forced_tileset_name[512]; -static void tileset_suggestion_callback(GtkWidget *dlg, gint arg); /************************************************************************//** Callback either loading suggested tileset or doing nothing ****************************************************************************/ -static void tileset_suggestion_callback(GtkWidget *dlg, gint arg) +static void tileset_suggestion_response(gint arg) { if (arg == GTK_RESPONSE_YES) { /* User accepted tileset loading */ @@ -83,13 +82,10 @@ void popup_tileset_suggestion_dialog(void) gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); gtk_widget_show(label); - g_signal_connect(dialog, "response", - G_CALLBACK(tileset_suggestion_callback), NULL); - /* In case incoming rulesets are incompatible with current tileset * we need to block their receive before user has accepted loading * of the correct tileset. */ - gtk_dialog_run(GTK_DIALOG(dialog)); + tileset_suggestion_response(blocking_dialog(dialog)); gtk_widget_destroy(dialog); } -- 2.33.0