From c71454c085f5be897c46741e624413399f57da8a Mon Sep 17 00:00:00 2001 From: simon Date: Wed, 28 Apr 2004 17:21:57 +0000 Subject: [PATCH] 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.) git-svn-id: svn://svn.tartarus.org/sgt/puzzles@4162 cda61777-01e9-0310-a592-d414129be87e --- cube.c | 34 +++++++++++++++++++++++++-- gtk.c | 20 ++++++++++++---- puzzles.h | 6 ++++- windows.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 131 insertions(+), 8 deletions(-) diff --git a/cube.c b/cube.c index 710845d..543e13b 100644 --- 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 23ca66d..b69e95d 100644 --- 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; diff --git a/puzzles.h b/puzzles.h index 86c2cc1..81a9a7a 100644 --- 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) ) diff --git a/windows.c b/windows.c index 618d440..3d9820d 100644 --- 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 @@ 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); } -- 2.11.0