Map Ctrl-Shift-Z to Redo.

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.
This commit is contained in:
Simon Tatham
2017-09-20 16:38:31 +01:00
parent e4d05c36d9
commit d72db91888
5 changed files with 28 additions and 5 deletions

View File

@ -126,7 +126,12 @@ public class PuzzleApplet extends JApplet implements Runtime.CallJavaCB {
} }
} }
public void keyTyped(KeyEvent e) { 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() { pp.addMouseListener(new MouseAdapter() {

6
emcc.c
View File

@ -310,6 +310,8 @@ void key(int keycode, int charcode, const char *key, const char *chr,
keyevent = MOD_NUM_KEYPAD | '7'; keyevent = MOD_NUM_KEYPAD | '7';
} else if (!strnullcmp(key, "PageUp") || keycode==33) { } else if (!strnullcmp(key, "PageUp") || keycode==33) {
keyevent = MOD_NUM_KEYPAD | '9'; keyevent = MOD_NUM_KEYPAD | '9';
} else if (shift && ctrl && (keycode & 0x1F) == 26) {
keyevent = UI_REDO;
} else if (chr && chr[0] && !chr[1]) { } else if (chr && chr[0] && !chr[1]) {
keyevent = chr[0] & 0xFF; keyevent = chr[0] & 0xFF;
} else if (keycode >= 96 && keycode < 106) { } 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 (keyevent >= 0) {
if (shift && keyevent >= 0x100) if (shift && (keyevent >= 0x100 && !IS_UI_FAKE_KEY(keyevent)))
keyevent |= MOD_SHFT; keyevent |= MOD_SHFT;
if (ctrl) { if (ctrl && !IS_UI_FAKE_KEY(keyevent)) {
if (keyevent >= 0x100) if (keyevent >= 0x100)
keyevent |= MOD_CTRL; keyevent |= MOD_CTRL;
else else

2
gtk.c
View File

@ -1206,6 +1206,8 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
event->keyval == GDK_KEY_Delete || event->keyval == GDK_KEY_Delete ||
event->keyval == GDK_KEY_KP_Delete) event->keyval == GDK_KEY_KP_Delete)
keyval = '\177'; keyval = '\177';
else if ((event->keyval == 'z' || event->keyval == 'Z') && shift && ctrl)
keyval = UI_REDO;
else if (event->string[0] && !event->string[1]) else if (event->string[0] && !event->string[1])
keyval = (unsigned char)event->string[0]; keyval = (unsigned char)event->string[0];
else else

4
osx.m
View File

@ -687,6 +687,10 @@ struct frontend {
if (c >= '0' && c <= '9' && ([ev modifierFlags] & NSNumericPadKeyMask)) if (c >= '0' && c <= '9' && ([ev modifierFlags] & NSNumericPadKeyMask))
c |= MOD_NUM_KEYPAD; c |= MOD_NUM_KEYPAD;
if (c == 26 &&
!((NSShiftKeyMask | NSControlKeyMask) & ~[ev modifierFlags]))
c = UI_REDO;
[self processKey:c]; [self processKey:c];
} }
} }

View File

@ -3405,8 +3405,18 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
} }
break; break;
case WM_CHAR: case WM_CHAR:
if (!midend_process_key(fe->me, 0, 0, (unsigned char)wParam)) {
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); PostQuitMessage(0);
}
return 0; return 0;
case WM_TIMER: case WM_TIMER:
if (fe->timer) { if (fe->timer) {