commit
1d71a0f601
4 changed files with 134 additions and 4 deletions
BIN
bun.lockb
BIN
bun.lockb
Binary file not shown.
|
|
@ -22,7 +22,6 @@
|
||||||
"@tauri-apps/plugin-stronghold": "~2",
|
"@tauri-apps/plugin-stronghold": "~2",
|
||||||
"@tauri-apps/plugin-updater": "~2",
|
"@tauri-apps/plugin-updater": "~2",
|
||||||
"@tauri-apps/plugin-upload": "~2",
|
"@tauri-apps/plugin-upload": "~2",
|
||||||
"keycode": "^2.2.1",
|
|
||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.3.1",
|
"react-dom": "^18.3.1",
|
||||||
"tailwindcss": "^4.0.2",
|
"tailwindcss": "^4.0.2",
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ import {
|
||||||
} from "../../lib/types";
|
} from "../../lib/types";
|
||||||
import { invoke } from "@tauri-apps/api/core";
|
import { invoke } from "@tauri-apps/api/core";
|
||||||
import { type } from "@tauri-apps/plugin-os";
|
import { type } from "@tauri-apps/plugin-os";
|
||||||
import keycode from "keycode";
|
import { getKeyName } from "../../lib/utils/keyboard";
|
||||||
import ResetIcon from "../icons/ResetIcon";
|
import ResetIcon from "../icons/ResetIcon";
|
||||||
|
|
||||||
export const KeyboardShortcuts: React.FC = () => {
|
export const KeyboardShortcuts: React.FC = () => {
|
||||||
|
|
@ -95,7 +95,7 @@ export const KeyboardShortcuts: React.FC = () => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
// Get the key and normalize it (unify left/right modifiers)
|
// Get the key and normalize it (unify left/right modifiers)
|
||||||
const rawKey = keycode(e).toLowerCase();
|
const rawKey = getKeyName(e);
|
||||||
const key = normalizeKey(rawKey);
|
const key = normalizeKey(rawKey);
|
||||||
|
|
||||||
console.log("You pressed", rawKey, "normalized to", key);
|
console.log("You pressed", rawKey, "normalized to", key);
|
||||||
|
|
@ -113,7 +113,7 @@ export const KeyboardShortcuts: React.FC = () => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
// Get the key and normalize it
|
// Get the key and normalize it
|
||||||
const rawKey = keycode(e).toLowerCase();
|
const rawKey = getKeyName(e);
|
||||||
const key = normalizeKey(rawKey);
|
const key = normalizeKey(rawKey);
|
||||||
|
|
||||||
// Remove from currently pressed keys
|
// Remove from currently pressed keys
|
||||||
|
|
|
||||||
131
src/lib/utils/keyboard.ts
Normal file
131
src/lib/utils/keyboard.ts
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
/**
|
||||||
|
* Keyboard utility functions for handling keyboard events
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract a consistent key name from a KeyboardEvent
|
||||||
|
* This function replaces the keycode library and provides better support
|
||||||
|
* for extended function keys (F14+) and cross-platform compatibility
|
||||||
|
*/
|
||||||
|
export const getKeyName = (e: KeyboardEvent): string => {
|
||||||
|
// Handle special cases first
|
||||||
|
if (e.code) {
|
||||||
|
const code = e.code;
|
||||||
|
|
||||||
|
// Handle function keys (F1-F24)
|
||||||
|
if (code.match(/^F\d+$/)) {
|
||||||
|
return code.toLowerCase(); // F1, F2, ..., F14, F15, etc.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle regular letter keys (KeyA -> a)
|
||||||
|
if (code.match(/^Key[A-Z]$/)) {
|
||||||
|
return code.replace("Key", "").toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle digit keys (Digit0 -> 0)
|
||||||
|
if (code.match(/^Digit\d$/)) {
|
||||||
|
return code.replace("Digit", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle numpad digit keys (Numpad0 -> numpad 0)
|
||||||
|
if (code.match(/^Numpad\d$/)) {
|
||||||
|
return code.replace("Numpad", "numpad ").toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle modifier keys - normalize left/right variants
|
||||||
|
const modifierMap: Record<string, string> = {
|
||||||
|
ShiftLeft: "shift",
|
||||||
|
ShiftRight: "shift",
|
||||||
|
ControlLeft: "ctrl",
|
||||||
|
ControlRight: "ctrl",
|
||||||
|
AltLeft: "alt",
|
||||||
|
AltRight: "alt",
|
||||||
|
MetaLeft: "command",
|
||||||
|
MetaRight: "command",
|
||||||
|
OSLeft: "command",
|
||||||
|
OSRight: "command",
|
||||||
|
CapsLock: "caps lock",
|
||||||
|
Tab: "tab",
|
||||||
|
Enter: "enter",
|
||||||
|
Space: "space",
|
||||||
|
Backspace: "backspace",
|
||||||
|
Delete: "delete",
|
||||||
|
Escape: "esc",
|
||||||
|
ArrowUp: "up",
|
||||||
|
ArrowDown: "down",
|
||||||
|
ArrowLeft: "left",
|
||||||
|
ArrowRight: "right",
|
||||||
|
Home: "home",
|
||||||
|
End: "end",
|
||||||
|
PageUp: "page up",
|
||||||
|
PageDown: "page down",
|
||||||
|
Insert: "insert",
|
||||||
|
PrintScreen: "print screen",
|
||||||
|
ScrollLock: "scroll lock",
|
||||||
|
Pause: "pause",
|
||||||
|
ContextMenu: "menu",
|
||||||
|
NumpadMultiply: "numpad *",
|
||||||
|
NumpadAdd: "numpad +",
|
||||||
|
NumpadSubtract: "numpad -",
|
||||||
|
NumpadDecimal: "numpad .",
|
||||||
|
NumpadDivide: "numpad /",
|
||||||
|
NumLock: "num lock",
|
||||||
|
};
|
||||||
|
|
||||||
|
if (modifierMap[code]) {
|
||||||
|
return modifierMap[code];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle punctuation and special characters
|
||||||
|
const punctuationMap: Record<string, string> = {
|
||||||
|
Semicolon: ";",
|
||||||
|
Equal: "=",
|
||||||
|
Comma: ",",
|
||||||
|
Minus: "-",
|
||||||
|
Period: ".",
|
||||||
|
Slash: "/",
|
||||||
|
Backquote: "`",
|
||||||
|
BracketLeft: "[",
|
||||||
|
Backslash: "\\",
|
||||||
|
BracketRight: "]",
|
||||||
|
Quote: "'",
|
||||||
|
};
|
||||||
|
|
||||||
|
if (punctuationMap[code]) {
|
||||||
|
return punctuationMap[code];
|
||||||
|
}
|
||||||
|
|
||||||
|
// For any other codes, try to convert to a reasonable format
|
||||||
|
return code.toLowerCase().replace(/([a-z])([A-Z])/g, "$1 $2");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback to e.key if e.code is not available
|
||||||
|
if (e.key) {
|
||||||
|
const key = e.key;
|
||||||
|
|
||||||
|
// Handle special key names
|
||||||
|
const keyMap: Record<string, string> = {
|
||||||
|
Control: "ctrl",
|
||||||
|
Alt: "alt",
|
||||||
|
Shift: "shift",
|
||||||
|
Meta: "command",
|
||||||
|
OS: "command",
|
||||||
|
CapsLock: "caps lock",
|
||||||
|
ArrowUp: "up",
|
||||||
|
ArrowDown: "down",
|
||||||
|
ArrowLeft: "left",
|
||||||
|
ArrowRight: "right",
|
||||||
|
Escape: "esc",
|
||||||
|
" ": "space",
|
||||||
|
};
|
||||||
|
|
||||||
|
if (keyMap[key]) {
|
||||||
|
return keyMap[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
return key.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Last resort fallback
|
||||||
|
return `unknown-${e.keyCode || e.which || 0}`;
|
||||||
|
};
|
||||||
Loading…
Reference in a new issue