chiark / gitweb /
Map Ctrl-Shift-Z to Redo.
authorSimon Tatham <anakin@pobox.com>
Wed, 20 Sep 2017 15:38:31 +0000 (16:38 +0100)
committerSimon Tatham <anakin@pobox.com>
Wed, 20 Sep 2017 17:03:44 +0000 (18:03 +0100)
This is in addition to the existing keystrokes r, ^R and ^Y. I've
become used to Ctrl-Shift-Z in other GUI games, and my fingers keep
getting confused when my own puzzles don't handle it the same way.

PuzzleApplet.java
emcc.c
gtk.c
osx.m
windows.c

index 8f8bec1c0cdd83896c26c18d45aafdf498881152..8455734dd128e734bbb4e16dd81cb6f077a8329e 100644 (file)
@@ -126,7 +126,12 @@ public class PuzzleApplet extends JApplet implements Runtime.CallJavaCB {
                     }
                 }
                 public void keyTyped(KeyEvent e) {
-                    runtimeCall("jcallback_key_event", new int[] {0, 0, e.getKeyChar()});
+                    int key = e.getKeyChar();
+                    if (key == 26 && e.isShiftDown() && e.isControlDown()) {
+                        runtimeCall("jcallback_redo_event", new int[0]);
+                        return;
+                    }
+                    runtimeCall("jcallback_key_event", new int[] {0, 0, key});
                 }
             });
             pp.addMouseListener(new MouseAdapter() {
diff --git a/emcc.c b/emcc.c
index a55f0a69b387b21e12ccfadddd4e81bc02ee8b08..23ab333f5db0cb58b7579b10b9f974d4e45f9c95 100644 (file)
--- a/emcc.c
+++ b/emcc.c
@@ -310,6 +310,8 @@ void key(int keycode, int charcode, const char *key, const char *chr,
         keyevent = MOD_NUM_KEYPAD | '7';
     } else if (!strnullcmp(key, "PageUp") || keycode==33) {
         keyevent = MOD_NUM_KEYPAD | '9';
+    } else if (shift && ctrl && (keycode & 0x1F) == 26) {
+        keyevent = UI_REDO;
     } else if (chr && chr[0] && !chr[1]) {
         keyevent = chr[0] & 0xFF;
     } else if (keycode >= 96 && keycode < 106) {
@@ -323,10 +325,10 @@ void key(int keycode, int charcode, const char *key, const char *chr,
     }
 
     if (keyevent >= 0) {
-        if (shift && keyevent >= 0x100)
+        if (shift && (keyevent >= 0x100 && !IS_UI_FAKE_KEY(keyevent)))
             keyevent |= MOD_SHFT;
 
-        if (ctrl) {
+        if (ctrl && !IS_UI_FAKE_KEY(keyevent)) {
             if (keyevent >= 0x100)
                 keyevent |= MOD_CTRL;
             else
diff --git a/gtk.c b/gtk.c
index 9ce5c8da7284251dec1a6bd8881d6c3ccb888d25..c2125229570927925773a12cf592e17350e9a19f 100644 (file)
--- a/gtk.c
+++ b/gtk.c
@@ -1206,6 +1206,8 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
             event->keyval == GDK_KEY_Delete ||
             event->keyval == GDK_KEY_KP_Delete)
         keyval = '\177';
+    else if ((event->keyval == 'z' || event->keyval == 'Z') && shift && ctrl)
+        keyval = UI_REDO;
     else if (event->string[0] && !event->string[1])
         keyval = (unsigned char)event->string[0];
     else
diff --git a/osx.m b/osx.m
index fae98c73e5d87ba3ab30e59d4ade4e8d35996ee0..be29819b620494094168f0e779b9681307ffdfdd 100644 (file)
--- a/osx.m
+++ b/osx.m
@@ -687,6 +687,10 @@ struct frontend {
        if (c >= '0' && c <= '9' && ([ev modifierFlags] & NSNumericPadKeyMask))
            c |= MOD_NUM_KEYPAD;
 
+        if (c == 26 &&
+            !((NSShiftKeyMask | NSControlKeyMask) & ~[ev modifierFlags]))
+            c = UI_REDO;
+
        [self processKey:c];
     }
 }
index 076e713d7ad5590f954c187413a094855fb6af81..ffd0f75894611260a7abdcf86e8c670334cb73a0 100644 (file)
--- a/windows.c
+++ b/windows.c
@@ -3405,8 +3405,18 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
        }
        break;
       case WM_CHAR:
-       if (!midend_process_key(fe->me, 0, 0, (unsigned char)wParam))
-           PostQuitMessage(0);
+        {
+            int key = (unsigned char)wParam;
+            if (key == '\x1A') {
+                BYTE keystate[256];
+                if (GetKeyboardState(keystate) &&
+                    (keystate[VK_SHIFT] & 0x80) &&
+                    (keystate[VK_CONTROL] & 0x80))
+                    key = UI_REDO;
+            }
+            if (!midend_process_key(fe->me, 0, 0, key))
+                PostQuitMessage(0);
+        }
        return 0;
       case WM_TIMER:
        if (fe->timer) {