X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/9709875736518ec7ae58ea474ac5130ae320158a..87871cf197134b1b88055371edcc4e35d660cce4:/windows.c diff --git a/windows.c b/windows.c index feee3cf..0a61f3c 100644 --- a/windows.c +++ b/windows.c @@ -31,11 +31,12 @@ #define IDM_SOLVE 0x0060 #define IDM_QUIT 0x0070 #define IDM_CONFIG 0x0080 -#define IDM_SEED 0x0090 -#define IDM_HELPC 0x00A0 -#define IDM_GAMEHELP 0x00B0 +#define IDM_DESC 0x0090 +#define IDM_SEED 0x00A0 +#define IDM_HELPC 0x00B0 +#define IDM_GAMEHELP 0x00C0 +#define IDM_ABOUT 0x00D0 #define IDM_PRESETS 0x0100 -#define IDM_ABOUT 0x0110 #define HELP_FILE_NAME "puzzles.hlp" #define HELP_CNT_NAME "puzzles.cnt" @@ -117,6 +118,7 @@ struct frontend { HFONT cfgfont; char *help_path; int help_has_contents; + char *laststatus; }; void fatal(char *fmt, ...) @@ -143,7 +145,14 @@ void get_random_seed(void **randseed, int *randseedsize) void status_bar(frontend *fe, char *text) { - SetWindowText(fe->statusbar, text); + char *rewritten = midend_rewrite_statusbar(fe->me, text); + if (!fe->laststatus || strcmp(rewritten, fe->laststatus)) { + SetWindowText(fe->statusbar, rewritten); + sfree(fe->laststatus); + fe->laststatus = rewritten; + } else { + sfree(rewritten); + } } void frontend_default_colour(frontend *fe, float *output) @@ -416,7 +425,7 @@ static frontend *new_window(HINSTANCE inst, char *game_id, char **error) fe->me = midend_new(fe, &thegame); if (game_id) { - *error = midend_game_id(fe->me, game_id, FALSE); + *error = midend_game_id(fe->me, game_id); if (*error) { midend_free(fe->me); sfree(fe); @@ -436,6 +445,8 @@ static frontend *new_window(HINSTANCE inst, char *game_id, char **error) fe->fonts = NULL; fe->nfonts = fe->fontsize = 0; + fe->laststatus = NULL; + { int i, ncolours; float *colours; @@ -476,7 +487,8 @@ static frontend *new_window(HINSTANCE inst, char *game_id, char **error) AppendMenu(bar, MF_ENABLED|MF_POPUP, (UINT)menu, "Game"); AppendMenu(menu, MF_ENABLED, IDM_NEW, "New"); AppendMenu(menu, MF_ENABLED, IDM_RESTART, "Restart"); - AppendMenu(menu, MF_ENABLED, IDM_SEED, "Specific..."); + AppendMenu(menu, MF_ENABLED, IDM_DESC, "Specific..."); + AppendMenu(menu, MF_ENABLED, IDM_SEED, "Random Seed..."); if ((fe->npresets = midend_num_presets(fe->me)) > 0 || thegame.can_configure) { @@ -1118,8 +1130,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, PostQuitMessage(0); break; case IDM_RESTART: - if (!midend_process_key(fe->me, 0, 0, 'r')) - PostQuitMessage(0); + midend_restart_game(fe->me); break; case IDM_UNDO: if (!midend_process_key(fe->me, 0, 0, 'u')) @@ -1159,6 +1170,10 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, if (get_config(fe, CFG_SEED)) new_game_type(fe); break; + case IDM_DESC: + if (get_config(fe, CFG_DESC)) + new_game_type(fe); + break; case IDM_ABOUT: about(fe); break; @@ -1216,31 +1231,35 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, case WM_KEYDOWN: { int key = -1; + BYTE keystate[256]; + int r = GetKeyboardState(keystate); + int shift = (r && (keystate[VK_SHIFT] & 0x80)) ? MOD_SHFT : 0; + int ctrl = (r && (keystate[VK_CONTROL] & 0x80)) ? MOD_CTRL : 0; switch (wParam) { case VK_LEFT: if (!(lParam & 0x01000000)) key = MOD_NUM_KEYPAD | '4'; - else - key = CURSOR_LEFT; + else + key = shift | ctrl | CURSOR_LEFT; break; case VK_RIGHT: if (!(lParam & 0x01000000)) key = MOD_NUM_KEYPAD | '6'; - else - key = CURSOR_RIGHT; + else + key = shift | ctrl | CURSOR_RIGHT; break; case VK_UP: if (!(lParam & 0x01000000)) key = MOD_NUM_KEYPAD | '8'; - else - key = CURSOR_UP; + else + key = shift | ctrl | CURSOR_UP; break; case VK_DOWN: if (!(lParam & 0x01000000)) key = MOD_NUM_KEYPAD | '2'; - else - key = CURSOR_DOWN; + else + key = shift | ctrl | CURSOR_DOWN; break; /* * Diagonal keys on the numeric keypad.