chiark / gitweb /
I've had two complaints that Solo ought to recognise the numeric
authorSimon Tatham <anakin@pobox.com>
Thu, 12 May 2005 18:25:57 +0000 (18:25 +0000)
committerSimon Tatham <anakin@pobox.com>
Thu, 12 May 2005 18:25:57 +0000 (18:25 +0000)
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]

cube.c
gtk.c
osx.m
puzzles.h
solo.c
windows.c

diff --git a/cube.c b/cube.c
index 82901e57fc71f9a304b09e8115c97b6eaaa1e91f..0933928690f9ab3e1ddec6b758dff0823c66648d 100644 (file)
--- 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 d721320b8046cc96ee011462f776cbc1a9640be4..199225ac6e65bead8d66cddbf4b1b2b1172baefc 100644 (file)
--- 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 a27c8403f9c74d289d0e550ddf565d6d403c00dd..d4dd90a1ec2ba42ea858170401df91d68fe521cc 100644 (file)
--- 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];
     }
 }
index a9323f50754d5a2eb718515e21340a9941013376..3867c2d72a709b2f071ff66d36b285fd745d4979 100644 (file)
--- 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 c943ed44c534690df3ce0e5d83d9d177a3fe4381..c9c64127da8102e2cc50efd1268d7d92fbb389fd 100644 (file)
--- 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;
 
index f503bdc669344da0cf200835d7e77a64d166d76f..414c7ccfd5ff5f3712974d09a1cbbde8b3a67823 100644 (file)
--- 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) {