tKeyboard shortcuts now work again for "stock" buttons under GTK+1. - vaccinewars - be a doctor and try to vaccinate the world (HTM) git clone git://src.adamsgaard.dk/vaccinewars (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit f2389c43adcb2fa396a1c7a246a3f2cd31f781d9 (DIR) parent d3976c0b72e808e93f1780459629e916449a07f4 (HTM) Author: Ben Webb <ben@salilab.org> Date: Mon, 8 Apr 2002 13:06:40 +0000 Keyboard shortcuts now work again for "stock" buttons under GTK+1. Diffstat: M src/gtkport/gtkport.c | 29 +++++++++++++++++++++-------- M src/gtkport/gtkport.h | 11 +++-------- M src/gui_client/gtk_client.c | 57 ++++++++++++++++++++++--------- M src/gui_client/newgamedia.c | 18 +++++++++++++----- M src/gui_client/optdialog.c | 7 +++++-- 5 files changed, 82 insertions(+), 40 deletions(-) --- (DIR) diff --git a/src/gtkport/gtkport.c b/src/gtkport/gtkport.c t@@ -39,6 +39,15 @@ #include "gtkport.h" #include "nls.h" +#if CYGWIN || !HAVE_GLIB2 +const gchar *GTK_STOCK_OK = N_("_OK"); +const gchar *GTK_STOCK_CLOSE = N_("_Close"); +const gchar *GTK_STOCK_CANCEL = N_("_Cancel"); +const gchar *GTK_STOCK_REFRESH = N_("_Refresh"); +const gchar *GTK_STOCK_YES = N_("_Yes"); +const gchar *GTK_STOCK_NO = N_("_No"); +#endif + #ifdef CYGWIN #include <windows.h> t@@ -5003,9 +5012,9 @@ void gtk_timeout_remove(guint timeout_handler_id) } } -GtkWidget *gtk_button_new_from_stock(const gchar *label) +GtkWidget *NewStockButton(const gchar *label, GtkAccelGroup *accel_group) { - return gtk_button_new_with_label(label); + return gtk_button_new_with_label(_(label)); } /* We don't really handle styles, so these are just placeholder functions */ t@@ -5144,7 +5153,7 @@ gint OldGtkMessageBox(GtkWidget *parent, const gchar *Text, gint i; static gint retval; gboolean imm_return; - gchar *ButtonData[MB_MAX] = { + const gchar *ButtonData[MB_MAX] = { GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_YES, GTK_STOCK_NO }; t@@ -5178,7 +5187,7 @@ gint OldGtkMessageBox(GtkWidget *parent, const gchar *Text, hbbox = gtk_hbutton_box_new(); for (i = 0; i < MB_MAX; i++) { if (Options & (1 << i)) { - button = gtk_button_new_from_stock(ButtonData[i]); + button = NewStockButton(ButtonData[i], accel_group); if (!imm_return) { gtk_object_set_data(GTK_OBJECT(button), "retval", &retval); } t@@ -5198,6 +5207,11 @@ gint OldGtkMessageBox(GtkWidget *parent, const gchar *Text, #ifdef HAVE_GLIB2 +GtkWidget *NewStockButton(const gchar *label, GtkAccelGroup *accel_group) +{ + return gtk_button_new_from_stock(label); +} + gint GtkMessageBox(GtkWidget *parent, const gchar *Text, const gchar *Title, GtkMessageType type, gint Options) { t@@ -5231,13 +5245,12 @@ gint GtkMessageBox(GtkWidget *parent, const gchar *Text, return OldGtkMessageBox(parent, Text, Title, Options); } -GtkWidget *gtk_button_new_from_stock(const gchar *label) +GtkWidget *NewStockButton(const gchar *label, GtkAccelGroup *accel_group) { GtkWidget *button; -/*button = gtk_button_new_with_label(""); - SetAccelerator(button, label, button, "clicked", accel_group, TRUE);*/ - button = gtk_button_new_with_label(label); + button = gtk_button_new_with_label(""); + SetAccelerator(button, _(label), button, "clicked", accel_group, FALSE); return button; } (DIR) diff --git a/src/gtkport/gtkport.h b/src/gtkport/gtkport.h t@@ -807,14 +807,8 @@ struct _GtkUrl { #endif /* CYGWIN */ #if CYGWIN || !HAVE_GLIB2 -#define GTK_STOCK_OK _("OK") -#define GTK_STOCK_CLOSE _("Close") -#define GTK_STOCK_CANCEL _("Cancel") -#define GTK_STOCK_REFRESH _("Refresh") -#define GTK_STOCK_YES _("Yes") -#define GTK_STOCK_NO _("No") - -GtkWidget *gtk_button_new_from_stock(const gchar *label); +extern const gchar *GTK_STOCK_OK, *GTK_STOCK_CLOSE, *GTK_STOCK_CANCEL, + *GTK_STOCK_REFRESH, *GTK_STOCK_YES, *GTK_STOCK_NO; typedef enum { t@@ -846,5 +840,6 @@ void TextViewAppend(GtkTextView *textview, const gchar *text, void TextViewClear(GtkTextView *textview); GtkWidget *gtk_url_new(const gchar *text, const gchar *target, const gchar *bin); +GtkWidget *NewStockButton(const gchar *label, GtkAccelGroup *accel_group); #endif /* __GTKPORT_H__ */ (DIR) diff --git a/src/gui_client/gtk_client.c b/src/gui_client/gtk_client.c t@@ -305,7 +305,7 @@ void ListInventory(GtkWidget *widget, gpointer data) gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); hbbox = my_hbbox_new(); - button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + button = NewStockButton(GTK_STOCK_CLOSE, accel_group); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)window); t@@ -555,8 +555,9 @@ void HandleClientMessage(char *pt, Player *Play) struct HiScoreDiaStruct { GtkWidget *dialog, *table, *vbox; + GtkAccelGroup *accel_group; }; -static struct HiScoreDiaStruct HiScoreDialog = { NULL, NULL, NULL }; +static struct HiScoreDiaStruct HiScoreDialog = { NULL, NULL, NULL, NULL }; /* * Creates an empty dialog to display high scores. t@@ -570,6 +571,8 @@ void PrepareHighScoreDialog(void) return; HiScoreDialog.dialog = dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); + HiScoreDialog.accel_group = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(dialog), HiScoreDialog.accel_group); /* Title of the GTK+ high score dialog */ gtk_window_set_title(GTK_WINDOW(dialog), _("High Scores")); t@@ -733,7 +736,7 @@ void CompleteHighScoreDialog(gboolean AtEnd) return; hbbox = my_hbbox_new(); - button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + button = NewStockButton(GTK_STOCK_CLOSE, HiScoreDialog.accel_group); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)dialog); t@@ -1673,14 +1676,14 @@ void DealDrugs(GtkWidget *widget, gpointer data) gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); hbbox = my_hbbox_new(); - button = gtk_button_new_from_stock(GTK_STOCK_OK); + button = NewStockButton(GTK_STOCK_OK, accel_group); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(DealOKCallback), data); GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); defbutton = button; gtk_box_pack_start_defaults(GTK_BOX(hbbox), button); - button = gtk_button_new_from_stock(GTK_STOCK_CANCEL); + button = NewStockButton(GTK_STOCK_CANCEL, accel_group); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)dialog); t@@ -1845,10 +1848,10 @@ void QuestionDialog(char *Data, Player *From) for (i = 0; i < strlen(Responses); i++) { switch (Responses[i]) { case 'Y': - button = gtk_button_new_from_stock(GTK_STOCK_YES); + button = NewStockButton(GTK_STOCK_YES, accel_group); break; case 'N': - button = gtk_button_new_from_stock(GTK_STOCK_NO); + button = NewStockButton(GTK_STOCK_NO, accel_group); break; default: for (j = 0, trword = NULL; j < numWords && !trword; j++) { t@@ -2264,6 +2267,7 @@ void display_intro(GtkWidget *widget, gpointer data) gchar *VersionStr, *docindex; const int rows = 6, cols = 3; int i, j; + GtkAccelGroup *accel_group; gchar *table_data[6][3] = { /* Credits labels in GTK+ 'about' dialog */ {N_("Icons and graphics"), "Ocelot Mantis", NULL}, t@@ -2277,6 +2281,8 @@ void display_intro(GtkWidget *widget, gpointer data) }; dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); + accel_group = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(dialog), accel_group); /* Title of GTK+ 'about' dialog */ gtk_window_set_title(GTK_WINDOW(dialog), _("About dopewars")); t@@ -2344,7 +2350,7 @@ void display_intro(GtkWidget *widget, gpointer data) gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); hbbox = my_hbbox_new(); - OKButton = gtk_button_new_from_stock(GTK_STOCK_OK); + OKButton = NewStockButton(GTK_STOCK_OK, accel_group); gtk_signal_connect_object(GTK_OBJECT(OKButton), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)dialog); t@@ -2427,12 +2433,16 @@ void TransferDialog(gboolean Debt) { GtkWidget *dialog, *button, *label, *radio, *table, *vbox; GtkWidget *hbbox, *hsep, *entry; + GtkAccelGroup *accel_group; GSList *group; GString *text; text = g_string_new(""); dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); + accel_group = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(dialog), accel_group); + gtk_signal_connect(GTK_OBJECT(dialog), "destroy", GTK_SIGNAL_FUNC(SendDoneMessage), NULL); if (Debt) { t@@ -2507,7 +2517,7 @@ void TransferDialog(gboolean Debt) gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); hbbox = my_hbbox_new(); - button = gtk_button_new_from_stock(GTK_STOCK_OK); + button = NewStockButton(GTK_STOCK_OK, accel_group); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(TransferOK), dialog); gtk_box_pack_start_defaults(GTK_BOX(hbbox), button); t@@ -2519,7 +2529,7 @@ void TransferDialog(gboolean Debt) GTK_SIGNAL_FUNC(TransferPayAll), dialog); gtk_box_pack_start_defaults(GTK_BOX(hbbox), button); } - button = gtk_button_new_from_stock(GTK_STOCK_CANCEL); + button = NewStockButton(GTK_STOCK_CANCEL, accel_group); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)dialog); t@@ -2536,10 +2546,13 @@ void TransferDialog(gboolean Debt) void ListPlayers(GtkWidget *widget, gpointer data) { GtkWidget *dialog, *clist, *button, *vbox, *hsep, *hbbox; + GtkAccelGroup *accel_group; if (IsShowingPlayerList) return; dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); + accel_group = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(dialog), accel_group); /* Title of player list dialog */ gtk_window_set_title(GTK_WINDOW(dialog), _("Player List")); t@@ -2562,7 +2575,7 @@ void ListPlayers(GtkWidget *widget, gpointer data) gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); hbbox = my_hbbox_new(); - button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + button = NewStockButton(GTK_STOCK_CLOSE, accel_group); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)dialog); t@@ -2633,11 +2646,14 @@ void TalkDialog(gboolean TalkToAll) { GtkWidget *dialog, *clist, *button, *entry, *label, *vbox, *hsep, *checkbutton, *hbbox; + GtkAccelGroup *accel_group; static struct TalkStruct TalkData; if (IsShowingTalkList) return; dialog = TalkData.dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); + accel_group = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(dialog), accel_group); /* Title of talk dialog */ gtk_window_set_title(GTK_WINDOW(dialog), _("Talk to player(s)")); t@@ -2686,7 +2702,7 @@ void TalkDialog(gboolean TalkToAll) GTK_SIGNAL_FUNC(TalkSend), (gpointer)&TalkData); gtk_box_pack_start_defaults(GTK_BOX(hbbox), button); - button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + button = NewStockButton(GTK_STOCK_CLOSE, accel_group); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)dialog); t@@ -2767,9 +2783,13 @@ void TipOff(GtkWidget *widget, gpointer data) void ErrandDialog(gint ErrandType) { GtkWidget *dialog, *clist, *button, *vbox, *hbbox, *hsep, *label; + GtkAccelGroup *accel_group; gchar *text; dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); + accel_group = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(dialog), accel_group); + gtk_container_set_border_width(GTK_CONTAINER(dialog), 7); gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); t@@ -2826,14 +2846,14 @@ void ErrandDialog(gint ErrandType) gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); hbbox = my_hbbox_new(); - button = gtk_button_new_from_stock(GTK_STOCK_OK); + button = NewStockButton(GTK_STOCK_OK, accel_group); gtk_object_set_data(GTK_OBJECT(button), "dialog", dialog); gtk_object_set_data(GTK_OBJECT(button), "errandtype", GINT_TO_POINTER(ErrandType)); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(ErrandOK), (gpointer)clist); gtk_box_pack_start_defaults(GTK_BOX(hbbox), button); - button = gtk_button_new_from_stock(GTK_STOCK_CANCEL); + button = NewStockButton(GTK_STOCK_CANCEL, accel_group); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)dialog); t@@ -2991,8 +3011,11 @@ static void NewNameOK(GtkWidget *widget, GtkWidget *window) void NewNameDialog(void) { GtkWidget *window, *button, *hsep, *vbox, *label, *entry; + GtkAccelGroup *accel_group; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + accel_group = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); /* Title of dialog for changing a player's name */ gtk_window_set_title(GTK_WINDOW(window), _("Change Name")); t@@ -3021,7 +3044,7 @@ void NewNameDialog(void) hsep = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); - button = gtk_button_new_from_stock(GTK_STOCK_OK); + button = NewStockButton(GTK_STOCK_OK, accel_group); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(NewNameOK), window); gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0); t@@ -3074,7 +3097,7 @@ void GunShopDialog(void) gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); hbbox = my_hbbox_new(); - button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + button = NewStockButton(GTK_STOCK_CLOSE, accel_group); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)window); t@@ -3131,7 +3154,7 @@ static void CreateSpyReports(void) gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); - button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + button = NewStockButton(GTK_STOCK_CLOSE, accel_group); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)window); (DIR) diff --git a/src/gui_client/newgamedia.c b/src/gui_client/newgamedia.c t@@ -578,7 +578,7 @@ void NewGameDialog(Player *play) hbbox = my_hbbox_new(); /* Button to update metaserver information */ - button = gtk_button_new_from_stock(GTK_STOCK_REFRESH); + button = NewStockButton(GTK_STOCK_REFRESH, accel_group); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(UpdateMetaServerList), NULL); gtk_box_pack_start_defaults(GTK_BOX(hbbox), button); t@@ -662,8 +662,12 @@ void AuthDialog(HttpConnection *conn, gboolean proxy, gchar *realm, gpointer data) { GtkWidget *window, *button, *hsep, *vbox, *label, *entry, *table, *hbbox; + GtkAccelGroup *accel_group; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + accel_group = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); + gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(DestroyAuthDialog), NULL); gtk_object_set_data(GTK_OBJECT(window), "proxy", GINT_TO_POINTER(proxy)); t@@ -723,12 +727,12 @@ void AuthDialog(HttpConnection *conn, gboolean proxy, gchar *realm, hbbox = my_hbbox_new(); - button = gtk_button_new_from_stock(GTK_STOCK_OK); + button = NewStockButton(GTK_STOCK_OK, accel_group); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(OKAuthDialog), (gpointer)window); gtk_box_pack_start_defaults(GTK_BOX(hbbox), button); - button = gtk_button_new_from_stock(GTK_STOCK_CANCEL); + button = NewStockButton(GTK_STOCK_CANCEL, accel_group); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)window); t@@ -778,8 +782,12 @@ static void RealSocksAuthDialog(NetworkBuffer *netbuf, gboolean meta, gpointer data) { GtkWidget *window, *button, *hsep, *vbox, *label, *entry, *table, *hbbox; + GtkAccelGroup *accel_group; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + accel_group = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); + gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(DestroySocksAuth), NULL); gtk_object_set_data(GTK_OBJECT(window), "netbuf", (gpointer)netbuf); t@@ -827,12 +835,12 @@ static void RealSocksAuthDialog(NetworkBuffer *netbuf, gboolean meta, hbbox = my_hbbox_new(); - button = gtk_button_new_from_stock(GTK_STOCK_OK); + button = NewStockButton(GTK_STOCK_OK, accel_group); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(OKSocksAuth), (gpointer)window); gtk_box_pack_start_defaults(GTK_BOX(hbbox), button); - button = gtk_button_new_from_stock(GTK_STOCK_CANCEL); + button = NewStockButton(GTK_STOCK_CANCEL, accel_group); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)window); (DIR) diff --git a/src/gui_client/optdialog.c b/src/gui_client/optdialog.c t@@ -683,6 +683,7 @@ void OptDialog(GtkWidget *widget, gpointer data) { GtkWidget *dialog, *notebook, *table, *label, *check, *entry; GtkWidget *hbox, *vbox, *hsep, *button, *hbbox; + GtkAccelGroup *accel_group; struct ConfigMembers locmembers[] = { { "Police presence", "PolicePresence" }, t@@ -715,6 +716,8 @@ void OptDialog(GtkWidget *widget, gpointer data) }; dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); + accel_group = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(dialog), accel_group); gtk_window_set_title(GTK_WINDOW(dialog), _("Options")); gtk_container_set_border_width(GTK_CONTAINER(dialog), 7); t@@ -865,11 +868,11 @@ void OptDialog(GtkWidget *widget, gpointer data) hbbox = my_hbbox_new(); - button = gtk_button_new_from_stock(GTK_STOCK_OK); + button = NewStockButton(GTK_STOCK_OK, accel_group); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(OKCallback), (gpointer)dialog); gtk_box_pack_start_defaults(GTK_BOX(hbbox), button); - button = gtk_button_new_from_stock(GTK_STOCK_CANCEL); + button = NewStockButton(GTK_STOCK_CANCEL, accel_group); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)dialog);