From 3c833d458bd4db0fe5ab9b5234e17eac28e0cab4 Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 12 May 2005 18:25:57 +0000 Subject: [PATCH] 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!). git-svn-id: svn://svn.tartarus.org/sgt/puzzles@5774 cda61777-01e9-0310-a592-d414129be87e --- cube.c | 18 +++++++++--------- gtk.c | 36 ++++++++++++++++++++++-------------- osx.m | 3 +++ puzzles.h | 6 ++---- solo.c | 2 ++ windows.c | 60 ++++++++++++++++++++++++++++++++++++++++++++---------------- 6 files changed, 82 insertions(+), 43 deletions(-) diff --git a/cube.c b/cube.c index 82901e5..0933928 100644 --- a/cube.c +++ b/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; diff --git a/gtk.c b/gtk.c index d721320..199225a 100644 --- a/gtk.c +++ b/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; diff --git a/osx.m b/osx.m index a27c840..d4dd90a 100644 --- a/osx.m +++ b/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]; } } diff --git a/puzzles.h b/puzzles.h index a9323f5..3867c2d 100644 --- a/puzzles.h +++ b/puzzles.h @@ -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) <= \ diff --git a/solo.c b/solo.c index c943ed4..c9c6412 100644 --- a/solo.c +++ b/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; diff --git a/windows.c b/windows.c index f503bdc..414c7cc 100644 --- a/windows.c +++ b/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) { -- 2.11.0