ref: 56a59e2e51d0cbe93ce16253e52a6421b0168c06
parent: d37b52bde5a358b1ee839c263bdc0308d1047a1a
author: Simon Tatham <anakin@pobox.com>
date: Wed Apr 28 13:21:57 EDT 2004
Introduce diagonal movement keys on the numeric keypad, and use them 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]
--- a/cube.c
+++ b/cube.c
@@ -150,7 +150,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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;
--- a/gtk.c
+++ b/gtk.c
@@ -139,14 +139,26 @@
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;
--- a/puzzles.h
+++ b/puzzles.h
@@ -21,7 +21,11 @@
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) )
--- a/windows.c
+++ b/windows.c
@@ -18,6 +18,51 @@
#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 @@
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 @@
new_window(inst);
while (GetMessage(&msg, NULL, 0, 0)) {
- TranslateMessage(&msg);
DispatchMessage(&msg);
}