From e415a0373db0bb058ffbb50c3b4ee4e9ae104438 Mon Sep 17 00:00:00 2001 From: wdlkmpx Date: Sun, 17 Jan 2021 20:51:38 +0800 Subject: [PATCH 1/8] gtkutils.c/h: add gtkutil_dialog_new() and gtkutil_frame_vbox() --- src/gtkutils.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- src/gtkutils.h | 7 +++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/gtkutils.c b/src/gtkutils.c index acbfdd1..fa1ec7e 100644 --- a/src/gtkutils.c +++ b/src/gtkutils.c @@ -35,6 +35,53 @@ GtkWidget *ut_window_new(gchar *title, gchar *wmname, gchar *wmclass, } +GtkWidget * gtkutil_dialog_new (char * title, + GtkWindow * parent, + gboolean resizable, + GtkWidget ** main_vbox) /* out */ +{ + GtkWidget * dialog; + dialog = gtk_dialog_new (); + gtk_window_set_title (GTK_WINDOW (dialog), title); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 4); /* padding */ + if (parent) { + gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent)); + gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); + gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE); + gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ON_PARENT); + gtk_window_set_skip_pager_hint (GTK_WINDOW (dialog), TRUE); + gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog), TRUE); + } + if (!resizable) { + // no need to call this if TRUE, unexpected behavior in GTK3 IIRC + gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); + } + + if (main_vbox) { + *main_vbox = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); + /* padding */ + gtk_container_set_border_width (GTK_CONTAINER (*main_vbox), 4); + } + + return dialog; +} + + +GtkWidget * gtkutil_frame_vbox (char * label, GtkWidget * parent_box) +{ + GtkWidget * frame; + frame = gtk_frame_new (label); + gtk_box_pack_start (GTK_BOX (parent_box), frame, FALSE, FALSE, 0); + + GtkWidget * frame_vbox = gtk_vbox_new (FALSE, 5); + gtk_container_add (GTK_CONTAINER (frame), frame_vbox); + /* padding */ + gtk_container_set_border_width (GTK_CONTAINER (frame_vbox), 5); + + return frame_vbox; +} + + GtkWidget *ut_check_button_new(gchar *label, gboolean active, GtkWidget *parent) { GtkWidget *button; @@ -92,7 +139,7 @@ GtkWidget *ut_spin_button_new(gchar *label, gint min, gint max, gint val, GtkWid GtkWidget *button, *hbox, *labelw; hbox = gtk_hbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(parent), hbox, TRUE, TRUE, 2); + gtk_box_pack_start(GTK_BOX(parent), hbox, TRUE, TRUE, 0); labelw = gtk_label_new(label); gtk_box_pack_start(GTK_BOX(hbox), labelw, FALSE, FALSE, 5); diff --git a/src/gtkutils.h b/src/gtkutils.h index 061e75f..a4ed1d1 100644 --- a/src/gtkutils.h +++ b/src/gtkutils.h @@ -10,6 +10,13 @@ GtkWidget *ut_window_new (gchar *title, gboolean resizable, gint border); +GtkWidget * gtkutil_dialog_new (char * title, + GtkWindow * parent, + gboolean resizable, + GtkWidget ** main_vbox); /* out */ + +GtkWidget * gtkutil_frame_vbox (char * label, GtkWidget * parent_box); + GtkWidget *ut_check_button_new (gchar *label, gboolean active, GtkWidget *parent); From 5a32287cdc8ac23c23e472e43215e3db6c2110af Mon Sep 17 00:00:00 2001 From: wdlkmpx Date: Sun, 17 Jan 2021 20:53:51 +0800 Subject: [PATCH 2/8] halloffame.c: use GtkDialog --- src/halloffame.c | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/src/halloffame.c b/src/halloffame.c index 6dca7cc..69f2612 100644 --- a/src/halloffame.c +++ b/src/halloffame.c @@ -13,10 +13,9 @@ void show_hall_of_fame (GtkWidget *widget, gpointer data, struct score_board b[10]) { - GtkWidget * hall_of_fame; + GtkWidget * dialog; GtkWidget * frame, * sw, * tv; - GtkWidget * vbox, * button_box; - GtkWidget * close_button; + GtkWidget * main_vbox, * vbox; gint i; struct score_board *bs = b; struct score_board bn[10]; @@ -34,20 +33,14 @@ void show_hall_of_fame (GtkWidget *widget, gpointer data, struct score_board b[1 } bs = bn; } - hall_of_fame = ut_window_new(_("Hall of Fame"), "GtkBalls_Scores", "GtkBalls", TRUE, TRUE, FALSE, 5); - vbox = gtk_vbox_new(FALSE, 0); - gtk_container_set_border_width(GTK_CONTAINER(vbox), 1); - gtk_container_add(GTK_CONTAINER(hall_of_fame), vbox); - - frame = gtk_frame_new(_("Hall of Fame")); - gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); + dialog = gtkutil_dialog_new (_("Hall of Fame"), main_window, FALSE, &main_vbox); + vbox = gtkutil_frame_vbox (_("Hall of Fame"), main_vbox); sw = gtk_scrolled_window_new(NULL, NULL); - gtk_container_set_border_width(GTK_CONTAINER(sw), 5); + gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_NEVER); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN); - gtk_container_add(GTK_CONTAINER(frame), sw); store = gtk_list_store_new (3, G_TYPE_STRING, @@ -90,14 +83,11 @@ void show_hall_of_fame (GtkWidget *widget, gpointer data, struct score_board b[1 g_free(str); } - button_box = gtk_hbox_new(TRUE, 0); - gtk_box_pack_start(GTK_BOX(vbox), button_box, FALSE, FALSE, 4); + gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-close", GTK_RESPONSE_CLOSE); + g_signal_connect_swapped (dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog); + gtk_widget_grab_focus (gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE)); - close_button = ut_button_new_stock_swap(GTK_STOCK_CLOSE, gtk_widget_destroy, hall_of_fame, button_box); - - gtk_widget_grab_focus (close_button); - gtk_widget_grab_default (close_button); - gtk_widget_show_all (hall_of_fame); + gtk_widget_show_all (dialog); } From ea387e962546bef432f3420cbb014a0b72284fe6 Mon Sep 17 00:00:00 2001 From: wdlkmpx Date: Mon, 18 Jan 2021 15:01:23 +0800 Subject: [PATCH 3/8] inputname.c: tweaks / avoid dialog->action_area --- src/inputname.c | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/inputname.c b/src/inputname.c index b417928..f267d1b 100644 --- a/src/inputname.c +++ b/src/inputname.c @@ -16,12 +16,10 @@ #include "halloffame.h" #include "game.h" -static GtkWidget *_dialog = NULL; - static gchar _last_player_name[15] = ""; static gint _saved_score = 0; -void read_entry(GtkWidget *widget, gpointer data) +static void read_entry (GtkEntry *entry, gpointer data) { struct score_board current_entry; time_t current_time; @@ -32,7 +30,7 @@ void read_entry(GtkWidget *widget, gpointer data) struct score_board b[10]; struct score_board_full *bf = NULL; - tstr = (gchar*)gtk_entry_get_text(GTK_ENTRY(data)); + tstr = (gchar*)gtk_entry_get_text (entry); strncpy(current_entry.name, tstr && *tstr ? tstr : _("Anonymous"), sizeof(current_entry.name)); strncpy(_last_player_name, current_entry.name, sizeof(_last_player_name)); current_entry.score = _saved_score; @@ -72,14 +70,25 @@ void read_entry(GtkWidget *widget, gpointer data) } } - gtk_widget_destroy(_dialog); + gtk_widget_destroy (GTK_WIDGET (data)); /* show scores to let user see if (s)he's on top ;) */ } +static void input_name_response (GtkDialog * dlg, int response, gpointer user_data) +{ + if (response == GTK_RESPONSE_OK) { + read_entry (GTK_ENTRY (user_data), dlg); + } +} + +static void input_name_esc (GtkDialog * dlg, gpointer data) +{ + g_signal_stop_emission_by_name (dlg, "close"); // ignore Esc +} void input_name_dialog(void) { - GtkWidget * prompt_label, * vbox; + GtkWidget * dialog, * prompt_label, * vbox; GtkWidget * name; GtkWidget * button; gchar * s; @@ -87,18 +96,14 @@ void input_name_dialog(void) /* we have to save score, because they will be set to 0 in new_game() */ _saved_score = game_get_score(); - _dialog = gtk_dialog_new(); - gtk_window_set_role(GTK_WINDOW(_dialog), "GtkBalls_Inputname"); - - vbox = gtk_dialog_get_content_area (GTK_DIALOG (_dialog)); - gtk_container_set_border_width(GTK_CONTAINER(vbox), 2); + dialog = gtkutil_dialog_new (NULL, main_window, TRUE, &vbox); prompt_label = gtk_label_new(_("Enter your name")); gtk_box_pack_start (GTK_BOX(vbox), prompt_label, TRUE, TRUE, 0); name = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(name), 14); - g_signal_connect(G_OBJECT(name), "activate", G_CALLBACK(read_entry), name); + g_signal_connect(G_OBJECT(name), "activate", G_CALLBACK(read_entry), dialog); /* restore the last player's name */ if (!(*_last_player_name)) { @@ -110,10 +115,9 @@ void input_name_dialog(void) gtk_editable_select_region(GTK_EDITABLE(name), 0, -1); gtk_box_pack_start (GTK_BOX(vbox), name, TRUE, TRUE, 5); - button=ut_button_new_stock(GTK_STOCK_OK, read_entry, name, GTK_DIALOG(_dialog)->action_area); + gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-ok", GTK_RESPONSE_OK); + g_signal_connect (dialog, "response", G_CALLBACK (input_name_response), name); + g_signal_connect (dialog, "close", G_CALLBACK (input_name_esc), name); - gtk_widget_grab_focus(name); - - gtk_widget_grab_default(button); - gtk_widget_show_all(_dialog); + gtk_widget_show_all (dialog); } From 74413f4484ea3f7f926426bf1e0b3a3567df56c1 Mon Sep 17 00:00:00 2001 From: wdlkmpx Date: Mon, 18 Jan 2021 15:03:33 +0800 Subject: [PATCH 4/8] preferences.c: use GtkDialog --- src/preferences.c | 71 +++++++++++++++++------------------------------ 1 file changed, 26 insertions(+), 45 deletions(-) diff --git a/src/preferences.c b/src/preferences.c index 0d51497..09fb757 100644 --- a/src/preferences.c +++ b/src/preferences.c @@ -18,7 +18,6 @@ enum { - PR_DIALOG, PR_SHOW_NEXT, PR_SHOW_PATH, PR_SHOW_PAWS, @@ -33,26 +32,17 @@ enum PR_SIZE }; -void parent_toggled(GtkToggleButton *togglebutton, gpointer data) { +static void parent_toggled(GtkToggleButton *togglebutton, gpointer data) { gtk_widget_set_sensitive(GTK_WIDGET(data), gtk_toggle_button_get_active(togglebutton)); } -void preferences_destroy_cb(GtkWidget *widget, gpointer data) { - g_free(data); -} - -void preferences_cancel(GtkWidget *widget, gpointer data) { - GtkWidget **buttons = data; - gtk_widget_destroy(buttons[PR_DIALOG]); -} - -gboolean fix_draw_next_balls(gpointer data) { +static gboolean fix_draw_next_balls(gpointer data) { draw_next_balls(); return FALSE; } -void preferences_apply(GtkWidget *widget, gpointer data) +static void preferences_apply(gpointer data) { GtkWidget **buttons = data; GtkTreeModel *model; @@ -108,22 +98,29 @@ void preferences_apply(GtkWidget *widget, gpointer data) } } - -void preferences_ok(GtkWidget *widget, gpointer data) { - GtkWidget **buttons = data; - preferences_apply(widget, buttons); - gtk_widget_destroy(buttons[PR_DIALOG]); +static void prefs_dialog_response (GtkDialog * dlg, int response, gpointer user_data) +{ + switch (response) + { + case GTK_RESPONSE_APPLY: + preferences_apply (user_data); + g_signal_stop_emission_by_name (dlg, "response"); + return; + case GTK_RESPONSE_OK: + preferences_apply (user_data); + break; + } + gtk_widget_destroy (GTK_WIDGET (dlg)); + g_free (user_data); /* buttons */ } - void preferences_dialog (void) { GtkWidget ** buttons; - GtkWidget * frame; - GtkWidget * big_vbox, * vbox, * buttons_box; + GtkWidget * dialog, * frame; + GtkWidget * big_vbox, * vbox; GtkWidget * theme_scrolled_window; - GtkWidget * separator; gint i, st; GtkListStore * store; GtkTreeIter iter; @@ -140,18 +137,8 @@ void preferences_dialog (void) buttons = g_malloc (PR_SIZE * sizeof(GtkWidget)); - buttons[PR_DIALOG] = ut_window_new(_("Preferences"), "GtkBalls_Preferences", "GtkBalls", TRUE, TRUE, TRUE, 5); - g_signal_connect (G_OBJECT(buttons[PR_DIALOG]), "destroy", G_CALLBACK(preferences_destroy_cb), buttons); - - big_vbox = gtk_vbox_new (FALSE, 0); - gtk_container_add (GTK_CONTAINER(buttons[PR_DIALOG]), big_vbox); - - frame = gtk_frame_new (_("Preferences")); - gtk_box_pack_start (GTK_BOX(big_vbox), frame, FALSE, FALSE, 0); - - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER(vbox), 5); - gtk_container_add (GTK_CONTAINER(frame), vbox); + dialog = gtkutil_dialog_new (_("Preferences"), main_window, TRUE, &big_vbox); + vbox = gtkutil_frame_vbox (_("Preferences"), big_vbox); buttons[PR_SHOW_NEXT] = ut_check_button_new(_("Show colors that will appear on next turn"), pref_get_show_next_colors(), vbox); buttons[PR_SHOW_PATH] = ut_check_button_new(_("Show path of the ball"), pref_get_show_path(), vbox); @@ -212,16 +199,10 @@ void preferences_dialog (void) } g_free (pathstr); - separator = gtk_hseparator_new (); - gtk_box_pack_start (GTK_BOX(big_vbox), separator, FALSE, FALSE, 5); + gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-apply", GTK_RESPONSE_APPLY); + gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-ok", GTK_RESPONSE_OK); + gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-cancel", GTK_RESPONSE_CANCEL); + g_signal_connect (dialog, "response", G_CALLBACK (prefs_dialog_response), buttons); - buttons_box = gtk_hbutton_box_new (); - gtk_button_box_set_layout (GTK_BUTTON_BOX(buttons_box), GTK_BUTTONBOX_SPREAD); - gtk_box_pack_start (GTK_BOX(big_vbox), buttons_box, TRUE, TRUE, 0); - - gtk_widget_grab_default (ut_button_new_stock(GTK_STOCK_OK, preferences_ok, buttons, buttons_box)); - ut_button_new_stock (GTK_STOCK_CANCEL, preferences_cancel, buttons, buttons_box); - ut_button_new_stock (GTK_STOCK_APPLY, preferences_apply, buttons, buttons_box); - - gtk_widget_show_all (buttons[PR_DIALOG]); + gtk_widget_show_all (dialog); } From 57e69dec119a5150fbe2eda51d002de7eafabcc5 Mon Sep 17 00:00:00 2001 From: wdlkmpx Date: Mon, 18 Jan 2021 15:04:12 +0800 Subject: [PATCH 5/8] rules.c: use GtkDialog --- src/rules.c | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/src/rules.c b/src/rules.c index 2be1a2a..72575ab 100644 --- a/src/rules.c +++ b/src/rules.c @@ -13,24 +13,16 @@ /* Show dialog box with game rules*/ void show_rules (GtkWidget *widget, gpointer data) { - GtkWidget * window; - GtkWidget * vbox, * hbox, * button_box; + GtkWidget * dialog; + GtkWidget * main_vbox, * vbox, * hbox; GtkWidget * label; GtkWidget * frame; - GtkWidget * separator; - GtkWidget * ok_button; - window = ut_window_new(_("Rules"), "GtkBalls_Rules", "GtkBalls", TRUE, FALSE, FALSE, 5); - - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_add (GTK_CONTAINER(window), vbox); - - frame = gtk_frame_new (_("Rules")); - gtk_box_pack_start (GTK_BOX(vbox), frame, TRUE, TRUE, 3); + dialog = gtkutil_dialog_new (_("Rules"), main_window, TRUE, &main_vbox); + vbox = gtkutil_frame_vbox (_("Rules"), main_vbox); hbox = gtk_hbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER(hbox), 10); - gtk_container_add (GTK_CONTAINER(frame), hbox); + gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); label = gtk_label_new (_("The standard play area of GtkBalls is a 9x9\n" \ "grid (it can be changed through \"Rules\"\n" \ @@ -64,14 +56,8 @@ void show_rules (GtkWidget *widget, gpointer data) "the grid will be.")); gtk_box_pack_start (GTK_BOX(hbox), label, TRUE, TRUE, 5); - separator = gtk_hseparator_new (); - gtk_box_pack_start (GTK_BOX(vbox), separator, FALSE, FALSE, 5); + gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-close", GTK_RESPONSE_OK); + g_signal_connect_swapped (dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog); - button_box = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX(vbox), button_box, TRUE, TRUE, 2); - - ok_button = ut_button_new_stock_swap (GTK_STOCK_CLOSE, gtk_widget_destroy, window, button_box); - - gtk_widget_grab_default (ok_button); - gtk_widget_show_all (window); + gtk_widget_show_all (dialog); } From 7d05b8390a7c644be7ed032b124814ae68a05f1c Mon Sep 17 00:00:00 2001 From: wdlkmpx Date: Mon, 18 Jan 2021 15:04:47 +0800 Subject: [PATCH 6/8] rulesdialog.c: use GtkDialog --- src/rulesdialog.c | 65 +++++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 39 deletions(-) diff --git a/src/rulesdialog.c b/src/rulesdialog.c index 1b69a1a..5843564 100644 --- a/src/rulesdialog.c +++ b/src/rulesdialog.c @@ -20,7 +20,7 @@ struct _gtkb_rules_dialog { struct _gtkb_rules_dialog _rd; -void rules_ok(GtkWidget *widget, gpointer data) +static void rules_ok (void) { gint oldnext = rules_get_next(); gchar *msg; @@ -33,9 +33,6 @@ void rules_ok(GtkWidget *widget, gpointer data) reinit_board (NULL, NULL, 0, oldnext); - if(data) { - gtk_widget_destroy (GTK_WIDGET(data)); - } msg = save_preferences (); if(msg) { ut_simple_message_box (msg); @@ -44,36 +41,33 @@ void rules_ok(GtkWidget *widget, gpointer data) } -void rules_classic(void) -{ - gtk_spin_button_set_value(GTK_SPIN_BUTTON(_rd.xrange), rules_get_classic_width()); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(_rd.yrange), rules_get_classic_height()); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(_rd.crange), rules_get_classic_colors()); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(_rd.nrange), rules_get_classic_next()); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(_rd.drange), rules_get_classic_destroy()); -} +#define BTN_CLASSIC_RULES 100 +static void rules_dialog_response (GtkDialog * dlg, int response, gpointer user_data) +{ + if (response == BTN_CLASSIC_RULES) { + gtk_spin_button_set_value (GTK_SPIN_BUTTON(_rd.xrange), rules_get_classic_width()); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(_rd.yrange), rules_get_classic_height()); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(_rd.crange), rules_get_classic_colors()); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(_rd.nrange), rules_get_classic_next()); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(_rd.drange), rules_get_classic_destroy()); + g_signal_stop_emission_by_name (dlg, "response"); + return; + } + if (response == GTK_RESPONSE_OK) { + rules_ok (); + } + gtk_widget_destroy (GTK_WIDGET (dlg)); +} void rules_dialog (void) { GtkWidget * dialog; GtkWidget * frame; - GtkWidget * big_vbox, * vbox, * buttons_box; - GtkWidget * separator; - GtkWidget * ok_button, * cancel_button, * classic_button; + GtkWidget * big_vbox, * vbox, * btn; - - dialog = ut_window_new(_("Game rules"), "GtkBalls_Rules", "GtkBalls", TRUE, TRUE, TRUE, 5); - - big_vbox = gtk_vbox_new (FALSE, 5); - gtk_container_add (GTK_CONTAINER(dialog), big_vbox); - - frame = gtk_frame_new (_("Game rules")); - gtk_box_pack_start (GTK_BOX(big_vbox), frame, FALSE, FALSE, 0); - - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER(vbox), 5); - gtk_container_add (GTK_CONTAINER(frame), vbox); + dialog = gtkutil_dialog_new (_("Game rules"), main_window, TRUE, &big_vbox); + vbox = gtkutil_frame_vbox (_("Game rules"), big_vbox); _rd.xrange = ut_spin_button_new (_("Board width"), 4, 99, rules_get_width(), vbox); _rd.yrange = ut_spin_button_new (_("Board height"), 4, 99, rules_get_height(), vbox); @@ -83,18 +77,11 @@ void rules_dialog (void) _rd.drange = ut_spin_button_new (_("How many balls at line eliminate it"), 3, 99, rules_get_destroy(), vbox); - classic_button = ut_button_new (_("Classic rules"), rules_classic, dialog, big_vbox); + gtk_dialog_add_button (GTK_DIALOG (dialog), _("Classic rules"), BTN_CLASSIC_RULES); + gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-ok", GTK_RESPONSE_OK); + gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-cancel", GTK_RESPONSE_CANCEL); - separator = gtk_hseparator_new (); - gtk_box_pack_start (GTK_BOX(big_vbox), separator, FALSE, FALSE, 5); - - buttons_box = gtk_hbutton_box_new (); - gtk_button_box_set_layout (GTK_BUTTON_BOX(buttons_box), GTK_BUTTONBOX_SPREAD); - gtk_box_pack_start (GTK_BOX(big_vbox), buttons_box, TRUE, TRUE, 0); - - ok_button = ut_button_new_stock (GTK_STOCK_OK, rules_ok, dialog, buttons_box); - cancel_button = ut_button_new_stock_swap (GTK_STOCK_CANCEL, gtk_widget_destroy, dialog, buttons_box); - - gtk_widget_grab_default (ok_button); + gtk_widget_grab_default (gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK)); + g_signal_connect (dialog, "response", G_CALLBACK (rules_dialog_response), NULL); gtk_widget_show_all (dialog); } From 41ad985376efdc1d21cc5673a8aadc7f57daaf7d Mon Sep 17 00:00:00 2001 From: wdlkmpx Date: Mon, 18 Jan 2021 15:05:11 +0800 Subject: [PATCH 7/8] savedialog.c: use GtkDialog --- src/savedialog.c | 63 +++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/src/savedialog.c b/src/savedialog.c index b2fa720..46e2e6e 100644 --- a/src/savedialog.c +++ b/src/savedialog.c @@ -58,7 +58,7 @@ void do_load_game(GtkWidget *widget, gpointer data) { } } -void do_delete_game(GtkWidget *widget, GtkWidget *treeview) { +static void do_delete_game (GtkWidget *treeview) { GtkTreeModel *model; GtkTreeIter iter, nextiter; GValue value = {0, }; @@ -175,6 +175,29 @@ gint game_compare_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpoi } +#define BUTTON_SAVE_GAME 100 +#define BUTTON_LOAD_GAME 101 +#define BUTTON_DELETE_GAME 102 + +static void save_load_dlg_response (GtkDialog * dlg, int response, gpointer user_data) +{ + GtkWidget * treeview = GTK_WIDGET (user_data); + switch (response) + { + case BUTTON_SAVE_GAME: + do_save_game (treeview, dlg); + return; + case BUTTON_LOAD_GAME: + do_load_game (treeview, dlg); + return; + case BUTTON_DELETE_GAME: + do_delete_game (treeview); + return; + } + gtk_widget_destroy (GTK_WIDGET (dlg)); +} + + void save_load_game_dialog(gboolean is_save) { @@ -184,9 +207,7 @@ void save_load_game_dialog(gboolean is_save) GtkCellRenderer * renderer; GtkTreeViewColumn * column; GtkTreePath * path; - GtkWidget * window, * swindow; - GtkWidget * vbox, * button_box; - GtkWidget * ok_button, * cancel_button, *delete_button; + GtkWidget * dialog, * swindow, * main_vbox, * vbox; gint i, num; gchar ** gamelist, str1[20], * str2; @@ -198,13 +219,8 @@ void save_load_game_dialog(gboolean is_save) return; } - window = ut_window_new(is_save ? _("Save game") : _("Load game"), - is_save ? "GtkBalls_Save" : "GtkBalls_Load", - "GtkBalls", TRUE, TRUE, TRUE, 5); - - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER(vbox), 1); - gtk_container_add (GTK_CONTAINER(window), vbox); + dialog = gtkutil_dialog_new (is_save ? _("Save game") : _("Load game"), + main_window, TRUE, &vbox); swindow = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); @@ -269,24 +285,21 @@ void save_load_game_dialog(gboolean is_save) } g_object_unref (G_OBJECT(store)); - button_box = gtk_hbox_new (TRUE, 10); if (is_save) { - ok_button = ut_button_new (_("Save game"), do_save_game, window, button_box); - g_signal_connect (G_OBJECT(treeview), "row_activated", G_CALLBACK(save_row_activated_cb), window); + gtk_dialog_add_button (GTK_DIALOG (dialog), _("Save game"), BUTTON_SAVE_GAME); + g_signal_connect (G_OBJECT(treeview), "row_activated", G_CALLBACK(save_row_activated_cb), dialog); + } else { - ok_button = ut_button_new (_("Load game"), do_load_game, window, button_box); - g_signal_connect(G_OBJECT(treeview), "row_activated", G_CALLBACK(load_row_activated_cb), window); + gtk_dialog_add_button (GTK_DIALOG (dialog), _("Load game"), BUTTON_LOAD_GAME); + g_signal_connect (G_OBJECT(treeview), "row_activated", G_CALLBACK(load_row_activated_cb), dialog); } - delete_button = ut_button_new (_("Delete game"), do_delete_game, treeview, button_box); + gtk_dialog_add_button (GTK_DIALOG (dialog), _("Delete game"), BUTTON_DELETE_GAME); + gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-cancel", GTK_RESPONSE_CANCEL); + g_signal_connect (dialog, "response", G_CALLBACK (save_load_dlg_response), + treeview); - cancel_button = ut_button_new_stock_swap (GTK_STOCK_CANCEL, gtk_widget_destroy, window, button_box); - gtk_box_pack_start (GTK_BOX(vbox), button_box, FALSE, FALSE, 4); - - gtk_widget_grab_default (ok_button); - gtk_widget_grab_focus (ok_button); - - gtk_window_set_default_size (GTK_WINDOW(window), -1, 300); - gtk_widget_show_all (window); + gtk_window_set_default_size (GTK_WINDOW(dialog), -1, 300); + gtk_widget_show_all (dialog); } void save_game_cb(GtkWidget *widget, gpointer data) { From 3fb6dc4a9fa9191719d6475589da734fe21a120f Mon Sep 17 00:00:00 2001 From: wdlkmpx Date: Mon, 18 Jan 2021 15:12:38 +0800 Subject: [PATCH 8/8] gtkutils.c/h: remove ut_button_new_stock* --- src/gtkutils.c | 26 -------------------------- src/gtkutils.h | 10 ---------- 2 files changed, 36 deletions(-) diff --git a/src/gtkutils.c b/src/gtkutils.c index fa1ec7e..c7c2b37 100644 --- a/src/gtkutils.c +++ b/src/gtkutils.c @@ -107,32 +107,6 @@ GtkWidget *ut_button_new(gchar *label, gpointer func, gpointer func_data, GtkWid } -GtkWidget *ut_button_new_stock(const gchar *stock_id, gpointer func, gpointer func_data, GtkWidget *parent) -{ - GtkWidget *button; - - button = gtk_button_new_from_stock(stock_id); - g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(func), func_data); - gtk_box_pack_start(GTK_BOX(parent), button, TRUE, TRUE, 0); - gtk_widget_set_can_default (button, TRUE); - - return button; -} - - -GtkWidget *ut_button_new_stock_swap(const gchar *stock_id, gpointer func, gpointer func_data, GtkWidget *parent) -{ - GtkWidget *button; - - button = gtk_button_new_from_stock(stock_id); - g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(func), func_data); - gtk_box_pack_start(GTK_BOX(parent), button, TRUE, TRUE, 0); - gtk_widget_set_can_default (button, TRUE); - - return button; -} - - GtkWidget *ut_spin_button_new(gchar *label, gint min, gint max, gint val, GtkWidget *parent) { GtkAdjustment *adj; diff --git a/src/gtkutils.h b/src/gtkutils.h index a4ed1d1..fd64bb4 100644 --- a/src/gtkutils.h +++ b/src/gtkutils.h @@ -26,16 +26,6 @@ GtkWidget *ut_button_new (gchar *label, gpointer func_data, GtkWidget *parent); -GtkWidget *ut_button_new_stock (const gchar *stock_id, - gpointer func, - gpointer func_data, - GtkWidget *parent); - -GtkWidget *ut_button_new_stock_swap (const gchar *stock_id, - gpointer func, - gpointer func_data, - GtkWidget *parent); - GtkWidget *ut_spin_button_new (gchar *label, gint min, gint max,