mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 08:01:30 -07:00
I've had two complaints that Solo ought to recognise the numeric
keypad. The reason it doesn't is because front ends were carefully translating the numeric keypad into 8-way directional keys for the benefit of Cube. Therefore, a policy change: - front ends process the numeric keypad by sending MOD_NUM_KEYPAD | '3' and similar - front ends running on a platform with Num Lock SHOULD do this _irrespective_ of the state of Num Lock - back ends do whatever they see fit with numeric keypad keys. Result: the numeric keypad now works in Solo, and also works in OS X Cube (which it previously didn't because I forgot to implement that bit of the front end!). [originally from svn r5774]
This commit is contained in:
18
cube.c
18
cube.c
@ -1017,23 +1017,23 @@ static game_state *make_move(game_state *from, game_ui *ui,
|
||||
struct solid *poly;
|
||||
|
||||
/*
|
||||
* All moves are made with the cursor keys.
|
||||
* All moves are made with the cursor keys or numeric keypad.
|
||||
*/
|
||||
if (button == CURSOR_UP)
|
||||
if (button == CURSOR_UP || button == (MOD_NUM_KEYPAD | '8'))
|
||||
direction = UP;
|
||||
else if (button == CURSOR_DOWN)
|
||||
else if (button == CURSOR_DOWN || button == (MOD_NUM_KEYPAD | '2'))
|
||||
direction = DOWN;
|
||||
else if (button == CURSOR_LEFT)
|
||||
else if (button == CURSOR_LEFT || button == (MOD_NUM_KEYPAD | '4'))
|
||||
direction = LEFT;
|
||||
else if (button == CURSOR_RIGHT)
|
||||
else if (button == CURSOR_RIGHT || button == (MOD_NUM_KEYPAD | '6'))
|
||||
direction = RIGHT;
|
||||
else if (button == CURSOR_UP_LEFT)
|
||||
else if (button == (MOD_NUM_KEYPAD | '7'))
|
||||
direction = UP_LEFT;
|
||||
else if (button == CURSOR_DOWN_LEFT)
|
||||
else if (button == (MOD_NUM_KEYPAD | '1'))
|
||||
direction = DOWN_LEFT;
|
||||
else if (button == CURSOR_UP_RIGHT)
|
||||
else if (button == (MOD_NUM_KEYPAD | '9'))
|
||||
direction = UP_RIGHT;
|
||||
else if (button == CURSOR_DOWN_RIGHT)
|
||||
else if (button == (MOD_NUM_KEYPAD | '3'))
|
||||
direction = DOWN_RIGHT;
|
||||
else
|
||||
return NULL;
|
||||
|
36
gtk.c
36
gtk.c
@ -321,28 +321,36 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
||||
if (!fe->pixmap)
|
||||
return TRUE;
|
||||
|
||||
if (event->string[0] && !event->string[1])
|
||||
keyval = (unsigned char)event->string[0];
|
||||
else if (event->keyval == GDK_Up || event->keyval == GDK_KP_Up ||
|
||||
event->keyval == GDK_KP_8)
|
||||
if (event->keyval == GDK_Up)
|
||||
keyval = CURSOR_UP;
|
||||
else if (event->keyval == GDK_Down || event->keyval == GDK_KP_Down ||
|
||||
event->keyval == GDK_KP_2)
|
||||
else if (event->keyval == GDK_KP_Up || event->keyval == GDK_KP_8)
|
||||
keyval = MOD_NUM_KEYPAD | '8';
|
||||
else if (event->keyval == GDK_Down)
|
||||
keyval = CURSOR_DOWN;
|
||||
else if (event->keyval == GDK_Left || event->keyval == GDK_KP_Left ||
|
||||
event->keyval == GDK_KP_4)
|
||||
else if (event->keyval == GDK_KP_Down || event->keyval == GDK_KP_2)
|
||||
keyval = MOD_NUM_KEYPAD | '2';
|
||||
else if (event->keyval == GDK_Left)
|
||||
keyval = CURSOR_LEFT;
|
||||
else if (event->keyval == GDK_Right || event->keyval == GDK_KP_Right ||
|
||||
event->keyval == GDK_KP_6)
|
||||
else if (event->keyval == GDK_KP_Left || event->keyval == GDK_KP_4)
|
||||
keyval = MOD_NUM_KEYPAD | '4';
|
||||
else if (event->keyval == GDK_Right)
|
||||
keyval = CURSOR_RIGHT;
|
||||
else if (event->keyval == GDK_KP_Right || event->keyval == GDK_KP_6)
|
||||
keyval = MOD_NUM_KEYPAD | '6';
|
||||
else if (event->keyval == GDK_KP_Home || event->keyval == GDK_KP_7)
|
||||
keyval = CURSOR_UP_LEFT;
|
||||
keyval = MOD_NUM_KEYPAD | '7';
|
||||
else if (event->keyval == GDK_KP_End || event->keyval == GDK_KP_1)
|
||||
keyval = CURSOR_DOWN_LEFT;
|
||||
keyval = MOD_NUM_KEYPAD | '1';
|
||||
else if (event->keyval == GDK_KP_Page_Up || event->keyval == GDK_KP_9)
|
||||
keyval = CURSOR_UP_RIGHT;
|
||||
keyval = MOD_NUM_KEYPAD | '9';
|
||||
else if (event->keyval == GDK_KP_Page_Down || event->keyval == GDK_KP_3)
|
||||
keyval = CURSOR_DOWN_RIGHT;
|
||||
keyval = MOD_NUM_KEYPAD | '3';
|
||||
else if (event->keyval == GDK_KP_Insert || event->keyval == GDK_KP_0)
|
||||
keyval = MOD_NUM_KEYPAD | '0';
|
||||
else if (event->keyval == GDK_KP_Begin || event->keyval == GDK_KP_5)
|
||||
keyval = MOD_NUM_KEYPAD | '5';
|
||||
else if (event->string[0] && !event->string[1])
|
||||
keyval = (unsigned char)event->string[0];
|
||||
else
|
||||
keyval = -1;
|
||||
|
||||
|
3
osx.m
3
osx.m
@ -515,6 +515,9 @@ struct frontend {
|
||||
}
|
||||
}
|
||||
|
||||
if (c >= '0' && c <= '9' && ([ev modifierFlags] & NSNumericPadKeyMask))
|
||||
c |= MOD_NUM_KEYPAD;
|
||||
|
||||
[self processButton:c x:-1 y:-1];
|
||||
}
|
||||
}
|
||||
|
@ -31,10 +31,8 @@ enum {
|
||||
CURSOR_DOWN,
|
||||
CURSOR_LEFT,
|
||||
CURSOR_RIGHT,
|
||||
CURSOR_UP_LEFT,
|
||||
CURSOR_DOWN_LEFT,
|
||||
CURSOR_UP_RIGHT,
|
||||
CURSOR_DOWN_RIGHT
|
||||
|
||||
MOD_NUM_KEYPAD = 0x40000000
|
||||
};
|
||||
|
||||
#define IS_MOUSE_DOWN(m) ( (unsigned)((m) - LEFT_BUTTON) <= \
|
||||
|
2
solo.c
2
solo.c
@ -1781,6 +1781,8 @@ static game_state *make_move(game_state *from, game_ui *ui, int x, int y,
|
||||
int tx, ty;
|
||||
game_state *ret;
|
||||
|
||||
button &= ~MOD_NUM_KEYPAD; /* we treat this the same as normal */
|
||||
|
||||
tx = (x + TILE_SIZE - BORDER) / TILE_SIZE - 1;
|
||||
ty = (y + TILE_SIZE - BORDER) / TILE_SIZE - 1;
|
||||
|
||||
|
60
windows.c
60
windows.c
@ -1035,36 +1035,64 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
||||
int key = -1;
|
||||
|
||||
switch (wParam) {
|
||||
case VK_LEFT: key = CURSOR_LEFT; break;
|
||||
case VK_RIGHT: key = CURSOR_RIGHT; break;
|
||||
case VK_UP: key = CURSOR_UP; break;
|
||||
case VK_DOWN: key = CURSOR_DOWN; break;
|
||||
case VK_LEFT:
|
||||
if (!(lParam & 0x01000000))
|
||||
key = MOD_NUM_KEYPAD | '4';
|
||||
else
|
||||
key = CURSOR_LEFT;
|
||||
break;
|
||||
case VK_RIGHT:
|
||||
if (!(lParam & 0x01000000))
|
||||
key = MOD_NUM_KEYPAD | '6';
|
||||
else
|
||||
key = CURSOR_RIGHT;
|
||||
break;
|
||||
case VK_UP:
|
||||
if (!(lParam & 0x01000000))
|
||||
key = MOD_NUM_KEYPAD | '8';
|
||||
else
|
||||
key = CURSOR_UP;
|
||||
break;
|
||||
case VK_DOWN:
|
||||
if (!(lParam & 0x01000000))
|
||||
key = MOD_NUM_KEYPAD | '2';
|
||||
else
|
||||
key = CURSOR_DOWN;
|
||||
break;
|
||||
/*
|
||||
* Diagonal keys on the numeric keypad.
|
||||
*/
|
||||
case VK_PRIOR:
|
||||
if (!(lParam & 0x01000000)) key = CURSOR_UP_RIGHT;
|
||||
if (!(lParam & 0x01000000)) key = MOD_NUM_KEYPAD | '9';
|
||||
break;
|
||||
case VK_NEXT:
|
||||
if (!(lParam & 0x01000000)) key = CURSOR_DOWN_RIGHT;
|
||||
if (!(lParam & 0x01000000)) key = MOD_NUM_KEYPAD | '3';
|
||||
break;
|
||||
case VK_HOME:
|
||||
if (!(lParam & 0x01000000)) key = CURSOR_UP_LEFT;
|
||||
if (!(lParam & 0x01000000)) key = MOD_NUM_KEYPAD | '7';
|
||||
break;
|
||||
case VK_END:
|
||||
if (!(lParam & 0x01000000)) key = CURSOR_DOWN_LEFT;
|
||||
if (!(lParam & 0x01000000)) key = MOD_NUM_KEYPAD | '1';
|
||||
break;
|
||||
case VK_INSERT:
|
||||
if (!(lParam & 0x01000000)) key = MOD_NUM_KEYPAD | '0';
|
||||
break;
|
||||
case VK_CLEAR:
|
||||
if (!(lParam & 0x01000000)) key = MOD_NUM_KEYPAD | '5';
|
||||
break;
|
||||
/*
|
||||
* Numeric keypad keys with Num Lock on.
|
||||
*/
|
||||
case VK_NUMPAD4: key = CURSOR_LEFT; break;
|
||||
case VK_NUMPAD6: key = CURSOR_RIGHT; break;
|
||||
case VK_NUMPAD8: key = CURSOR_UP; break;
|
||||
case VK_NUMPAD2: key = CURSOR_DOWN; break;
|
||||
case VK_NUMPAD9: key = CURSOR_UP_RIGHT; break;
|
||||
case VK_NUMPAD3: key = CURSOR_DOWN_RIGHT; break;
|
||||
case VK_NUMPAD7: key = CURSOR_UP_LEFT; break;
|
||||
case VK_NUMPAD1: key = CURSOR_DOWN_LEFT; break;
|
||||
case VK_NUMPAD4: key = MOD_NUM_KEYPAD | '4'; break;
|
||||
case VK_NUMPAD6: key = MOD_NUM_KEYPAD | '6'; break;
|
||||
case VK_NUMPAD8: key = MOD_NUM_KEYPAD | '8'; break;
|
||||
case VK_NUMPAD2: key = MOD_NUM_KEYPAD | '2'; break;
|
||||
case VK_NUMPAD5: key = MOD_NUM_KEYPAD | '5'; break;
|
||||
case VK_NUMPAD9: key = MOD_NUM_KEYPAD | '9'; break;
|
||||
case VK_NUMPAD3: key = MOD_NUM_KEYPAD | '3'; break;
|
||||
case VK_NUMPAD7: key = MOD_NUM_KEYPAD | '7'; break;
|
||||
case VK_NUMPAD1: key = MOD_NUM_KEYPAD | '1'; break;
|
||||
case VK_NUMPAD0: key = MOD_NUM_KEYPAD | '0'; break;
|
||||
}
|
||||
|
||||
if (key != -1) {
|
||||
|
Reference in New Issue
Block a user