chiark / gitweb /
Introduce diagonal movement keys on the numeric keypad, and use them
authorSimon Tatham <anakin@pobox.com>
Wed, 28 Apr 2004 17:21:57 +0000 (17:21 +0000)
committerSimon Tatham <anakin@pobox.com>
Wed, 28 Apr 2004 17:21:57 +0000 (17:21 +0000)
as an alternative control method in Cube. (This was a bit of hassle
in the Windows front end; I also introduced a debugging framework
and made TranslateMessage conditional.)

[originally from svn r4162]

cube.c
gtk.c
puzzles.h
windows.c

diff --git a/cube.c b/cube.c
index 710845d381423e1667caf6712b9e69d7ffba5c78..543e13b6fedd3ad122a8bed9bdea07f1079f1b54 100644 (file)
--- a/cube.c
+++ b/cube.c
@@ -150,7 +150,7 @@ enum {
     NCOLOURS
 };
 
-enum { LEFT, RIGHT, UP, DOWN };
+enum { LEFT, RIGHT, UP, DOWN, UP_LEFT, UP_RIGHT, DOWN_LEFT, DOWN_RIGHT };
 
 #define GRID_SCALE 48
 #define ROLLTIME 0.1
@@ -171,7 +171,7 @@ struct grid_square {
     float x, y;
     int npoints;
     float points[8];                   /* maximum */
-    int directions[4];                 /* bit masks showing point pairs */
+    int directions[8];                 /* bit masks showing point pairs */
     int flip;
     int blue;
     int tetra_class;
@@ -298,6 +298,10 @@ static void enum_grid_squares(game_params *params,
                 sq.directions[RIGHT] = 0x0C;   /* 2,3 */
                 sq.directions[UP]    = 0x09;   /* 0,3 */
                 sq.directions[DOWN]  = 0x06;   /* 1,2 */
+                sq.directions[UP_LEFT] = 0;   /* no diagonals in a square */
+                sq.directions[UP_RIGHT] = 0;   /* no diagonals in a square */
+                sq.directions[DOWN_LEFT] = 0;   /* no diagonals in a square */
+                sq.directions[DOWN_RIGHT] = 0;   /* no diagonals in a square */
 
                 sq.flip = FALSE;
 
@@ -348,6 +352,15 @@ static void enum_grid_squares(game_params *params,
                 sq.directions[UP]    = 0x05;   /* 0,2 */
                 sq.directions[DOWN]  = 0;      /* invalid move */
 
+                /*
+                 * Down-pointing triangle: both the up diagonals go
+                 * up, and the down ones go left and right.
+                 */
+                sq.directions[UP_LEFT] = sq.directions[UP_RIGHT] =
+                    sq.directions[UP];
+                sq.directions[DOWN_LEFT] = sq.directions[LEFT];
+                sq.directions[DOWN_RIGHT] = sq.directions[RIGHT];
+
                 sq.flip = TRUE;
 
                 if (firstix < 0)
@@ -384,6 +397,15 @@ static void enum_grid_squares(game_params *params,
                 sq.directions[DOWN]  = 0x05;   /* 0,2 */
                 sq.directions[UP]    = 0;      /* invalid move */
 
+                /*
+                 * Up-pointing triangle: both the down diagonals go
+                 * down, and the up ones go left and right.
+                 */
+                sq.directions[DOWN_LEFT] = sq.directions[DOWN_RIGHT] =
+                    sq.directions[DOWN];
+                sq.directions[UP_LEFT] = sq.directions[LEFT];
+                sq.directions[UP_RIGHT] = sq.directions[RIGHT];
+
                 sq.flip = FALSE;
 
                 if (firstix < 0)
@@ -841,6 +863,14 @@ game_state *make_move(game_state *from, int x, int y, int button)
         direction = LEFT;
     else if (button == CURSOR_RIGHT)
         direction = RIGHT;
+    else if (button == CURSOR_UP_LEFT)
+        direction = UP_LEFT;
+    else if (button == CURSOR_DOWN_LEFT)
+        direction = DOWN_LEFT;
+    else if (button == CURSOR_UP_RIGHT)
+        direction = UP_RIGHT;
+    else if (button == CURSOR_DOWN_RIGHT)
+        direction = DOWN_RIGHT;
     else
         return NULL;
 
diff --git a/gtk.c b/gtk.c
index 23ca66de067da463d9b56065b67dc3d1f74366b3..b69e95d4dffcb8e44b3ab455a1af1f932f756efe 100644 (file)
--- a/gtk.c
+++ b/gtk.c
@@ -139,14 +139,26 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
 
     if (event->string[0] && !event->string[1])
         keyval = (unsigned char)event->string[0];
-    else if (event->keyval == GDK_Up || event->keyval == GDK_KP_Up)
+    else if (event->keyval == GDK_Up || event->keyval == GDK_KP_Up ||
+             event->keyval == GDK_KP_8)
         keyval = CURSOR_UP;
-    else if (event->keyval == GDK_Down || event->keyval == GDK_KP_Down)
+    else if (event->keyval == GDK_Down || event->keyval == GDK_KP_Down ||
+             event->keyval == GDK_KP_2)
         keyval = CURSOR_DOWN;
-    else if (event->keyval == GDK_Left || event->keyval == GDK_KP_Left)
+    else if (event->keyval == GDK_Left || event->keyval == GDK_KP_Left ||
+             event->keyval == GDK_KP_4)
         keyval = CURSOR_LEFT;
-    else if (event->keyval == GDK_Right || event->keyval == GDK_KP_Right)
+    else if (event->keyval == GDK_Right || event->keyval == GDK_KP_Right ||
+             event->keyval == GDK_KP_6)
         keyval = CURSOR_RIGHT;
+    else if (event->keyval == GDK_KP_Home || event->keyval == GDK_KP_7)
+        keyval = CURSOR_UP_LEFT;
+    else if (event->keyval == GDK_KP_End || event->keyval == GDK_KP_1)
+        keyval = CURSOR_DOWN_LEFT;
+    else if (event->keyval == GDK_KP_Page_Up || event->keyval == GDK_KP_9)
+        keyval = CURSOR_UP_RIGHT;
+    else if (event->keyval == GDK_KP_Page_Down || event->keyval == GDK_KP_3)
+        keyval = CURSOR_DOWN_RIGHT;
     else
         keyval = -1;
 
index 86c2cc1828bc4286b8ea5a95fe35cf465bf3608c..81a9a7a444f652c3643c61b665a250d0433b9b0a 100644 (file)
--- a/puzzles.h
+++ b/puzzles.h
@@ -21,7 +21,11 @@ enum {
     CURSOR_UP,
     CURSOR_DOWN,
     CURSOR_LEFT,
-    CURSOR_RIGHT
+    CURSOR_RIGHT,
+    CURSOR_UP_LEFT,
+    CURSOR_DOWN_LEFT,
+    CURSOR_UP_RIGHT,
+    CURSOR_DOWN_RIGHT
 };
 
 #define IGNOREARG(x) ( (x) = (x) )
index 618d440fe5bfc90205ddfd873bb721344c05093f..3d9820d746d3837cb4b2a08640d69031ba65f498 100644 (file)
--- a/windows.c
+++ b/windows.c
 #define IDM_QUIT      0x0050
 #define IDM_PRESETS   0x0100
 
+#ifdef DEBUG
+static FILE *debug_fp = NULL;
+static HANDLE debug_hdl = INVALID_HANDLE_VALUE;
+static int debug_got_console = 0;
+
+void dputs(char *buf)
+{
+    DWORD dw;
+
+    if (!debug_got_console) {
+       if (AllocConsole()) {
+           debug_got_console = 1;
+           debug_hdl = GetStdHandle(STD_OUTPUT_HANDLE);
+       }
+    }
+    if (!debug_fp) {
+       debug_fp = fopen("debug.log", "w");
+    }
+
+    if (debug_hdl != INVALID_HANDLE_VALUE) {
+       WriteFile(debug_hdl, buf, strlen(buf), &dw, NULL);
+    }
+    fputs(buf, debug_fp);
+    fflush(debug_fp);
+}
+
+void debug_printf(char *fmt, ...)
+{
+    char buf[4096];
+    va_list ap;
+
+    va_start(ap, fmt);
+    vsprintf(buf, fmt, ap);
+    dputs(buf);
+    va_end(ap);
+}
+
+#define debug(x) (debug_printf x)
+
+#else
+
+#define debug(x)
+
+#endif
+
 struct frontend {
     midend_data *me;
     HWND hwnd;
@@ -349,11 +394,44 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
              case VK_RIGHT: key = CURSOR_RIGHT; break;
              case VK_UP: key = CURSOR_UP; break;
              case VK_DOWN: key = CURSOR_DOWN; break;
+               /*
+                * Diagonal keys on the numeric keypad.
+                */
+             case VK_PRIOR:
+               if (!(lParam & 0x01000000)) key = CURSOR_UP_RIGHT;
+               break;
+             case VK_NEXT:
+               if (!(lParam & 0x01000000)) key = CURSOR_DOWN_RIGHT;
+               break;
+             case VK_HOME:
+               if (!(lParam & 0x01000000)) key = CURSOR_UP_LEFT;
+               break;
+             case VK_END:
+               if (!(lParam & 0x01000000)) key = CURSOR_DOWN_LEFT;
+               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;
            }
 
            if (key != -1) {
                if (!midend_process_key(fe->me, 0, 0, key))
                    PostQuitMessage(0);
+           } else {
+               MSG m;
+               m.hwnd = hwnd;
+               m.message = WM_KEYDOWN;
+               m.wParam = wParam;
+               m.lParam = lParam & 0xdfff;
+               TranslateMessage(&m);
            }
        }
        break;
@@ -406,7 +484,6 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
     new_window(inst);
 
     while (GetMessage(&msg, NULL, 0, 0)) {
-       TranslateMessage(&msg);
        DispatchMessage(&msg);
     }