diff --git a/PuzzleApplet.java b/PuzzleApplet.java index 8f8bec1..8455734 100644 --- a/PuzzleApplet.java +++ b/PuzzleApplet.java @@ -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 a55f0a6..23ab333 100644 --- 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 9ce5c8d..c212522 100644 --- 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 fae98c7..be29819 100644 --- 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]; } } diff --git a/windows.c b/windows.c index 076e713..ffd0f75 100644 --- 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) {