Rewrite the JS keyboard handling to cope with IE and Chrome.

Unlike Firefox, IE and Chrome don't generate keypress events at all if
you suppress the default handling of keydowns. Therefore, we have to
figure out everything from the keydown event, because if we unsuppress
the default handling of any keydowns then we'll get annoyances like ^R
going back to meaning reload-page rather than redo-move.

[originally from svn r9810]
This commit is contained in:
Simon Tatham
2013-04-05 15:49:27 +00:00
parent 5dc559c8be
commit 2360b77812
2 changed files with 76 additions and 73 deletions

View File

@ -157,26 +157,21 @@ function initPuzzle() {
}
};
// Set up keyboard handlers. We expect ordinary keys (with a
// charCode) to be handled by onkeypress, but function keys
// (arrows etc) to be handled by onkeydown.
//
// We also call event.preventDefault() in both handlers. This
// means that while the canvas itself has focus, _all_ keypresses
// go only to the puzzle - so users of this puzzle collection in
// other media can indulge their instinct to press ^R for redo,
// for example, without accidentally reloading the page.
key = Module.cwrap('key', 'void',
['number', 'number', 'number', 'number']);
// Set up keyboard handlers. We do all the actual keyboard
// handling in onkeydown; but we also call event.preventDefault()
// in both the keydown and keypress handlers. This means that
// while the canvas itself has focus, _all_ keypresses go only to
// the puzzle - so users of this puzzle collection in other media
// can indulge their instinct to press ^R for redo, for example,
// without accidentally reloading the page.
key = Module.cwrap('key', 'void', ['number', 'number', 'string',
'string', 'number', 'number']);
onscreen_canvas.onkeydown = function(event) {
key(event.keyCode, event.charCode,
key(event.keyCode, event.charCode, event.key, event.char,
event.shiftKey ? 1 : 0, event.ctrlKey ? 1 : 0);
event.preventDefault();
};
onscreen_canvas.onkeypress = function(event) {
if (event.charCode != 0)
key(event.keyCode, event.charCode,
event.shiftKey ? 1 : 0, event.ctrlKey ? 1 : 0);
event.preventDefault();
};