Document the mouse control method for Cube.
[sgt/puzzles] / windows.c
index 45ec69c..0a61f3c 100644 (file)
--- a/windows.c
+++ b/windows.c
@@ -35,8 +35,8 @@
 #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"
@@ -118,6 +118,7 @@ struct frontend {
     HFONT cfgfont;
     char *help_path;
     int help_has_contents;
+    char *laststatus;
 };
 
 void fatal(char *fmt, ...)
@@ -144,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)
@@ -437,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;
@@ -1221,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.