1
0
Fork 0
forked from len0rd/rockbox

puzzles: resync with upstream

This brings puzzles to upstream commit 84d3fd2.

Change-Id: I808a197f868032d771fc101a15666c5ec4b9f94b
This commit is contained in:
Franklin Wei 2017-09-30 17:47:13 -04:00
parent ea679de837
commit b9386109e8
26 changed files with 1037 additions and 583 deletions

View file

@ -140,7 +140,7 @@ struct font {
*/
struct frontend {
GtkWidget *window;
GtkAccelGroup *accelgroup;
GtkAccelGroup *dummy_accelgroup;
GtkWidget *area;
GtkWidget *statusbar;
GtkWidget *menubar;
@ -1160,16 +1160,6 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
if (!backing_store_ok(fe))
return TRUE;
#if !GTK_CHECK_VERSION(2,0,0)
/* Gtk 1.2 passes a key event to this function even if it's also
* defined as an accelerator.
* Gtk 2 doesn't do this, and this function appears not to exist there. */
if (fe->accelgroup &&
gtk_accel_group_get_entry(fe->accelgroup,
event->keyval, event->state))
return TRUE;
#endif
/* Handle mnemonics. */
if (gtk_window_activate_key(GTK_WINDOW(fe->window), event))
return TRUE;
@ -1216,6 +1206,8 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
event->keyval == GDK_KEY_Delete ||
event->keyval == GDK_KEY_KP_Delete)
keyval = '\177';
else if ((event->keyval == 'z' || event->keyval == 'Z') && shift && ctrl)
keyval = UI_REDO;
else if (event->string[0] && !event->string[1])
keyval = (unsigned char)event->string[0];
else
@ -2348,32 +2340,34 @@ static void menu_about_event(GtkMenuItem *menuitem, gpointer data)
#endif
}
static GtkWidget *add_menu_item_with_key(frontend *fe, GtkContainer *cont,
char *text, int key)
static GtkWidget *add_menu_ui_item(
frontend *fe, GtkContainer *cont, char *text, int action,
int accel_key, int accel_keyqual)
{
GtkWidget *menuitem = gtk_menu_item_new_with_label(text);
int keyqual;
gtk_container_add(cont, menuitem);
g_object_set_data(G_OBJECT(menuitem), "user-data", GINT_TO_POINTER(key));
g_object_set_data(G_OBJECT(menuitem), "user-data",
GINT_TO_POINTER(action));
g_signal_connect(G_OBJECT(menuitem), "activate",
G_CALLBACK(menu_key_event), fe);
switch (key & ~0x1F) {
case 0x00:
key += 0x60;
keyqual = GDK_CONTROL_MASK;
break;
case 0x40:
key += 0x20;
keyqual = GDK_SHIFT_MASK;
break;
default:
keyqual = 0;
break;
if (accel_key) {
/*
* Display a keyboard accelerator alongside this menu item.
* Actually this won't be processed via the usual GTK
* accelerator system, because we add it to a dummy
* accelerator group which is never actually activated on the
* main window; this permits back ends to override special
* keys like 'n' and 'r' and 'u' in some UI states. So
* whatever keystroke we display here will still go to
* key_event and be handled in the normal way.
*/
gtk_widget_add_accelerator(menuitem,
"activate", fe->dummy_accelgroup,
accel_key, accel_keyqual,
GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
}
gtk_widget_add_accelerator(menuitem,
"activate", fe->accelgroup,
key, keyqual,
GTK_ACCEL_VISIBLE);
gtk_widget_show(menuitem);
return menuitem;
}
@ -2535,8 +2529,11 @@ static frontend *new_window(char *arg, int argtype, char **error)
gtk_container_add(GTK_CONTAINER(fe->window), GTK_WIDGET(vbox));
gtk_widget_show(GTK_WIDGET(vbox));
fe->accelgroup = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(fe->window), fe->accelgroup);
fe->dummy_accelgroup = gtk_accel_group_new();
/*
* Intentionally _not_ added to the window via
* gtk_window_add_accel_group; see menu_key_event
*/
hbox = GTK_BOX(gtk_hbox_new(FALSE, 0));
gtk_box_pack_start(vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0);
@ -2553,7 +2550,7 @@ static frontend *new_window(char *arg, int argtype, char **error)
menu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
add_menu_item_with_key(fe, GTK_CONTAINER(menu), "New", 'n');
add_menu_ui_item(fe, GTK_CONTAINER(menu), "New", UI_NEWGAME, 'n', 0);
menuitem = gtk_menu_item_new_with_label("Restart");
gtk_container_add(GTK_CONTAINER(menu), menuitem);
@ -2623,8 +2620,8 @@ static frontend *new_window(char *arg, int argtype, char **error)
gtk_widget_show(menuitem);
#ifndef STYLUS_BASED
add_menu_separator(GTK_CONTAINER(menu));
add_menu_item_with_key(fe, GTK_CONTAINER(menu), "Undo", 'u');
add_menu_item_with_key(fe, GTK_CONTAINER(menu), "Redo", 'r');
add_menu_ui_item(fe, GTK_CONTAINER(menu), "Undo", UI_UNDO, 'u', 0);
add_menu_ui_item(fe, GTK_CONTAINER(menu), "Redo", UI_REDO, 'r', 0);
#endif
if (thegame.can_format_as_text_ever) {
add_menu_separator(GTK_CONTAINER(menu));
@ -2646,7 +2643,7 @@ static frontend *new_window(char *arg, int argtype, char **error)
gtk_widget_show(menuitem);
}
add_menu_separator(GTK_CONTAINER(menu));
add_menu_item_with_key(fe, GTK_CONTAINER(menu), "Exit", 'q');
add_menu_ui_item(fe, GTK_CONTAINER(menu), "Exit", UI_QUIT, 'q', 0);
menuitem = gtk_menu_item_new_with_mnemonic("_Help");
gtk_container_add(GTK_CONTAINER(fe->menubar), menuitem);
@ -2664,7 +2661,7 @@ static frontend *new_window(char *arg, int argtype, char **error)
#ifdef STYLUS_BASED
menuitem=gtk_button_new_with_mnemonic("_Redo");
g_object_set_data(G_OBJECT(menuitem), "user-data",
GINT_TO_POINTER((int)('r')));
GINT_TO_POINTER(UI_REDO));
g_signal_connect(G_OBJECT(menuitem), "clicked",
G_CALLBACK(menu_key_event), fe);
gtk_box_pack_end(hbox, menuitem, FALSE, FALSE, 0);
@ -2672,7 +2669,7 @@ static frontend *new_window(char *arg, int argtype, char **error)
menuitem=gtk_button_new_with_mnemonic("_Undo");
g_object_set_data(G_OBJECT(menuitem), "user-data",
GINT_TO_POINTER((int)('u')));
GINT_TO_POINTER(UI_UNDO));
g_signal_connect(G_OBJECT(menuitem), "clicked",
G_CALLBACK(menu_key_event), fe);
gtk_box_pack_end(hbox, menuitem, FALSE, FALSE, 0);