mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 16:05:44 -07:00
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]
This commit is contained in:
34
cube.c
34
cube.c
@ -150,7 +150,7 @@ enum {
|
|||||||
NCOLOURS
|
NCOLOURS
|
||||||
};
|
};
|
||||||
|
|
||||||
enum { LEFT, RIGHT, UP, DOWN };
|
enum { LEFT, RIGHT, UP, DOWN, UP_LEFT, UP_RIGHT, DOWN_LEFT, DOWN_RIGHT };
|
||||||
|
|
||||||
#define GRID_SCALE 48
|
#define GRID_SCALE 48
|
||||||
#define ROLLTIME 0.1
|
#define ROLLTIME 0.1
|
||||||
@ -171,7 +171,7 @@ struct grid_square {
|
|||||||
float x, y;
|
float x, y;
|
||||||
int npoints;
|
int npoints;
|
||||||
float points[8]; /* maximum */
|
float points[8]; /* maximum */
|
||||||
int directions[4]; /* bit masks showing point pairs */
|
int directions[8]; /* bit masks showing point pairs */
|
||||||
int flip;
|
int flip;
|
||||||
int blue;
|
int blue;
|
||||||
int tetra_class;
|
int tetra_class;
|
||||||
@ -298,6 +298,10 @@ static void enum_grid_squares(game_params *params,
|
|||||||
sq.directions[RIGHT] = 0x0C; /* 2,3 */
|
sq.directions[RIGHT] = 0x0C; /* 2,3 */
|
||||||
sq.directions[UP] = 0x09; /* 0,3 */
|
sq.directions[UP] = 0x09; /* 0,3 */
|
||||||
sq.directions[DOWN] = 0x06; /* 1,2 */
|
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;
|
sq.flip = FALSE;
|
||||||
|
|
||||||
@ -348,6 +352,15 @@ static void enum_grid_squares(game_params *params,
|
|||||||
sq.directions[UP] = 0x05; /* 0,2 */
|
sq.directions[UP] = 0x05; /* 0,2 */
|
||||||
sq.directions[DOWN] = 0; /* invalid move */
|
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;
|
sq.flip = TRUE;
|
||||||
|
|
||||||
if (firstix < 0)
|
if (firstix < 0)
|
||||||
@ -384,6 +397,15 @@ static void enum_grid_squares(game_params *params,
|
|||||||
sq.directions[DOWN] = 0x05; /* 0,2 */
|
sq.directions[DOWN] = 0x05; /* 0,2 */
|
||||||
sq.directions[UP] = 0; /* invalid move */
|
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;
|
sq.flip = FALSE;
|
||||||
|
|
||||||
if (firstix < 0)
|
if (firstix < 0)
|
||||||
@ -841,6 +863,14 @@ game_state *make_move(game_state *from, int x, int y, int button)
|
|||||||
direction = LEFT;
|
direction = LEFT;
|
||||||
else if (button == CURSOR_RIGHT)
|
else if (button == CURSOR_RIGHT)
|
||||||
direction = 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
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
20
gtk.c
20
gtk.c
@ -139,14 +139,26 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
|||||||
|
|
||||||
if (event->string[0] && !event->string[1])
|
if (event->string[0] && !event->string[1])
|
||||||
keyval = (unsigned char)event->string[0];
|
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;
|
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;
|
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;
|
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;
|
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
|
else
|
||||||
keyval = -1;
|
keyval = -1;
|
||||||
|
|
||||||
|
@ -21,7 +21,11 @@ enum {
|
|||||||
CURSOR_UP,
|
CURSOR_UP,
|
||||||
CURSOR_DOWN,
|
CURSOR_DOWN,
|
||||||
CURSOR_LEFT,
|
CURSOR_LEFT,
|
||||||
CURSOR_RIGHT
|
CURSOR_RIGHT,
|
||||||
|
CURSOR_UP_LEFT,
|
||||||
|
CURSOR_DOWN_LEFT,
|
||||||
|
CURSOR_UP_RIGHT,
|
||||||
|
CURSOR_DOWN_RIGHT
|
||||||
};
|
};
|
||||||
|
|
||||||
#define IGNOREARG(x) ( (x) = (x) )
|
#define IGNOREARG(x) ( (x) = (x) )
|
||||||
|
79
windows.c
79
windows.c
@ -18,6 +18,51 @@
|
|||||||
#define IDM_QUIT 0x0050
|
#define IDM_QUIT 0x0050
|
||||||
#define IDM_PRESETS 0x0100
|
#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 {
|
struct frontend {
|
||||||
midend_data *me;
|
midend_data *me;
|
||||||
HWND hwnd;
|
HWND hwnd;
|
||||||
@ -349,11 +394,44 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
|||||||
case VK_RIGHT: key = CURSOR_RIGHT; break;
|
case VK_RIGHT: key = CURSOR_RIGHT; break;
|
||||||
case VK_UP: key = CURSOR_UP; break;
|
case VK_UP: key = CURSOR_UP; break;
|
||||||
case VK_DOWN: key = CURSOR_DOWN; 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 (key != -1) {
|
||||||
if (!midend_process_key(fe->me, 0, 0, key))
|
if (!midend_process_key(fe->me, 0, 0, key))
|
||||||
PostQuitMessage(0);
|
PostQuitMessage(0);
|
||||||
|
} else {
|
||||||
|
MSG m;
|
||||||
|
m.hwnd = hwnd;
|
||||||
|
m.message = WM_KEYDOWN;
|
||||||
|
m.wParam = wParam;
|
||||||
|
m.lParam = lParam & 0xdfff;
|
||||||
|
TranslateMessage(&m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -406,7 +484,6 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
|||||||
new_window(inst);
|
new_window(inst);
|
||||||
|
|
||||||
while (GetMessage(&msg, NULL, 0, 0)) {
|
while (GetMessage(&msg, NULL, 0, 0)) {
|
||||||
TranslateMessage(&msg);
|
|
||||||
DispatchMessage(&msg);
|
DispatchMessage(&msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user