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:
Simon Tatham
2005-05-12 18:25:57 +00:00
parent 8f1c713735
commit 68d27f0526
6 changed files with 82 additions and 43 deletions

18
cube.c
View File

@ -1017,23 +1017,23 @@ static game_state *make_move(game_state *from, game_ui *ui,
struct solid *poly; 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; direction = UP;
else if (button == CURSOR_DOWN) else if (button == CURSOR_DOWN || button == (MOD_NUM_KEYPAD | '2'))
direction = DOWN; direction = DOWN;
else if (button == CURSOR_LEFT) else if (button == CURSOR_LEFT || button == (MOD_NUM_KEYPAD | '4'))
direction = LEFT; direction = LEFT;
else if (button == CURSOR_RIGHT) else if (button == CURSOR_RIGHT || button == (MOD_NUM_KEYPAD | '6'))
direction = RIGHT; direction = RIGHT;
else if (button == CURSOR_UP_LEFT) else if (button == (MOD_NUM_KEYPAD | '7'))
direction = UP_LEFT; direction = UP_LEFT;
else if (button == CURSOR_DOWN_LEFT) else if (button == (MOD_NUM_KEYPAD | '1'))
direction = DOWN_LEFT; direction = DOWN_LEFT;
else if (button == CURSOR_UP_RIGHT) else if (button == (MOD_NUM_KEYPAD | '9'))
direction = UP_RIGHT; direction = UP_RIGHT;
else if (button == CURSOR_DOWN_RIGHT) else if (button == (MOD_NUM_KEYPAD | '3'))
direction = DOWN_RIGHT; direction = DOWN_RIGHT;
else else
return NULL; return NULL;

36
gtk.c
View File

@ -321,28 +321,36 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
if (!fe->pixmap) if (!fe->pixmap)
return TRUE; return TRUE;
if (event->string[0] && !event->string[1]) if (event->keyval == GDK_Up)
keyval = (unsigned char)event->string[0];
else if (event->keyval == GDK_Up || event->keyval == GDK_KP_Up ||
event->keyval == GDK_KP_8)
keyval = CURSOR_UP; keyval = CURSOR_UP;
else if (event->keyval == GDK_Down || event->keyval == GDK_KP_Down || else if (event->keyval == GDK_KP_Up || event->keyval == GDK_KP_8)
event->keyval == GDK_KP_2) keyval = MOD_NUM_KEYPAD | '8';
else if (event->keyval == GDK_Down)
keyval = CURSOR_DOWN; keyval = CURSOR_DOWN;
else if (event->keyval == GDK_Left || event->keyval == GDK_KP_Left || else if (event->keyval == GDK_KP_Down || event->keyval == GDK_KP_2)
event->keyval == GDK_KP_4) keyval = MOD_NUM_KEYPAD | '2';
else if (event->keyval == GDK_Left)
keyval = CURSOR_LEFT; keyval = CURSOR_LEFT;
else if (event->keyval == GDK_Right || event->keyval == GDK_KP_Right || else if (event->keyval == GDK_KP_Left || event->keyval == GDK_KP_4)
event->keyval == GDK_KP_6) keyval = MOD_NUM_KEYPAD | '4';
else if (event->keyval == GDK_Right)
keyval = CURSOR_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) 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) 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) 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) 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 else
keyval = -1; keyval = -1;

3
osx.m
View File

@ -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]; [self processButton:c x:-1 y:-1];
} }
} }

View File

@ -31,10 +31,8 @@ enum {
CURSOR_DOWN, CURSOR_DOWN,
CURSOR_LEFT, CURSOR_LEFT,
CURSOR_RIGHT, CURSOR_RIGHT,
CURSOR_UP_LEFT,
CURSOR_DOWN_LEFT, MOD_NUM_KEYPAD = 0x40000000
CURSOR_UP_RIGHT,
CURSOR_DOWN_RIGHT
}; };
#define IS_MOUSE_DOWN(m) ( (unsigned)((m) - LEFT_BUTTON) <= \ #define IS_MOUSE_DOWN(m) ( (unsigned)((m) - LEFT_BUTTON) <= \

2
solo.c
View File

@ -1781,6 +1781,8 @@ static game_state *make_move(game_state *from, game_ui *ui, int x, int y,
int tx, ty; int tx, ty;
game_state *ret; game_state *ret;
button &= ~MOD_NUM_KEYPAD; /* we treat this the same as normal */
tx = (x + TILE_SIZE - BORDER) / TILE_SIZE - 1; tx = (x + TILE_SIZE - BORDER) / TILE_SIZE - 1;
ty = (y + TILE_SIZE - BORDER) / TILE_SIZE - 1; ty = (y + TILE_SIZE - BORDER) / TILE_SIZE - 1;

View File

@ -1035,36 +1035,64 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
int key = -1; int key = -1;
switch (wParam) { switch (wParam) {
case VK_LEFT: key = CURSOR_LEFT; break; case VK_LEFT:
case VK_RIGHT: key = CURSOR_RIGHT; break; if (!(lParam & 0x01000000))
case VK_UP: key = CURSOR_UP; break; key = MOD_NUM_KEYPAD | '4';
case VK_DOWN: key = CURSOR_DOWN; break; 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. * Diagonal keys on the numeric keypad.
*/ */
case VK_PRIOR: case VK_PRIOR:
if (!(lParam & 0x01000000)) key = CURSOR_UP_RIGHT; if (!(lParam & 0x01000000)) key = MOD_NUM_KEYPAD | '9';
break; break;
case VK_NEXT: case VK_NEXT:
if (!(lParam & 0x01000000)) key = CURSOR_DOWN_RIGHT; if (!(lParam & 0x01000000)) key = MOD_NUM_KEYPAD | '3';
break; break;
case VK_HOME: case VK_HOME:
if (!(lParam & 0x01000000)) key = CURSOR_UP_LEFT; if (!(lParam & 0x01000000)) key = MOD_NUM_KEYPAD | '7';
break; break;
case VK_END: 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; break;
/* /*
* Numeric keypad keys with Num Lock on. * Numeric keypad keys with Num Lock on.
*/ */
case VK_NUMPAD4: key = CURSOR_LEFT; break; case VK_NUMPAD4: key = MOD_NUM_KEYPAD | '4'; break;
case VK_NUMPAD6: key = CURSOR_RIGHT; break; case VK_NUMPAD6: key = MOD_NUM_KEYPAD | '6'; break;
case VK_NUMPAD8: key = CURSOR_UP; break; case VK_NUMPAD8: key = MOD_NUM_KEYPAD | '8'; break;
case VK_NUMPAD2: key = CURSOR_DOWN; break; case VK_NUMPAD2: key = MOD_NUM_KEYPAD | '2'; break;
case VK_NUMPAD9: key = CURSOR_UP_RIGHT; break; case VK_NUMPAD5: key = MOD_NUM_KEYPAD | '5'; break;
case VK_NUMPAD3: key = CURSOR_DOWN_RIGHT; break; case VK_NUMPAD9: key = MOD_NUM_KEYPAD | '9'; break;
case VK_NUMPAD7: key = CURSOR_UP_LEFT; break; case VK_NUMPAD3: key = MOD_NUM_KEYPAD | '3'; break;
case VK_NUMPAD1: key = CURSOR_DOWN_LEFT; 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) { if (key != -1) {