aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--emccpre.js45
1 files changed, 29 insertions, 16 deletions
diff --git a/emccpre.js b/emccpre.js
index 6485d94..7a99e3d 100644
--- a/emccpre.js
+++ b/emccpre.js
@@ -476,7 +476,9 @@ function initPuzzle() {
}
// Keyboard handlers for the menus.
function menukey(event) {
- var thisitem = event.target.closest("li");
+ var target = event.target;
+ var key = event.key;
+ var thisitem = target.closest("li");
var thismenu = thisitem.closest("ul");
var targetitem = null;
var parentitem;
@@ -490,19 +492,30 @@ function initPuzzle() {
}
if (dlg_dimmer !== null)
return;
+ if (["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
+ .includes(key)) {
+ var shortcutitem = thismenu.querySelectorAll(
+ ":scope > li:not([role='separator']")[(Number(key) + 9) % 10];
+ if (shortcutitem) {
+ target = shortcutitem.firstElementChild;
+ target.focus();
+ thisitem = target.closest("li");
+ key = "Enter";
+ }
+ }
if (!["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Enter",
"Escape", "Backspace", "SoftRight", "F10"]
- .includes(event.key))
+ .includes(key))
return;
if (ishorizontal(thismenu)) {
// Top-level menu bar.
- if (event.key == "ArrowLeft")
+ if (key == "ArrowLeft")
targetitem = prevmenuitem(thisitem) || lastmenuitem(thismenu);
- else if (event.key == "ArrowRight")
+ else if (key == "ArrowRight")
targetitem = nextmenuitem(thisitem) || firstmenuitem(thismenu);
- else if (event.key == "ArrowUp")
+ else if (key == "ArrowUp")
targetitem = lastmenuitem(thisitem.querySelector("ul"));
- else if (event.key == "ArrowDown" || event.key == "Enter")
+ else if (key == "ArrowDown" || key == "Enter")
targetitem = firstmenuitem(thisitem.querySelector("ul"));
} else {
// Ordinary vertical menu.
@@ -513,29 +526,29 @@ function initPuzzle() {
else
parentitem_sideways = parentitem;
}
- if (event.key == "ArrowUp")
+ if (key == "ArrowUp")
targetitem = prevmenuitem(thisitem) || parentitem_up ||
lastmenuitem(thismenu);
- else if (event.key == "ArrowDown")
+ else if (key == "ArrowDown")
targetitem = nextmenuitem(thisitem) || parentitem_up ||
firstmenuitem(thismenu);
- else if (event.key == "ArrowRight")
+ else if (key == "ArrowRight")
targetitem = thisitem.querySelector("li") ||
(parentitem_up && nextmenuitem(parentitem_up));
- else if (event.key == "Enter")
+ else if (key == "Enter")
targetitem = thisitem.querySelector("li");
- else if (event.key == "ArrowLeft")
+ else if (key == "ArrowLeft")
targetitem = parentitem_sideways ||
(parentitem_up && prevmenuitem(parentitem_up));
- else if (event.key == "Backspace")
+ else if (key == "Backspace")
targetitem = parentitem;
}
if (targetitem)
targetitem.firstElementChild.focus();
- else if (event.key == "Enter")
- event.target.click();
- else if (event.key == "Escape" || event.key == "SoftRight" ||
- event.key == "F10" || event.key == "Backspace")
+ else if (key == "Enter")
+ target.click();
+ else if (key == "Escape" || key == "SoftRight" ||
+ key == "F10" || key == "Backspace")
// Leave the menu entirely.
onscreen_canvas.focus();
// Prevent default even if we didn't do anything, as long as this