|
export function makeKeyboardModifiersBitfield(e: WheelEvent | PointerEvent | MouseEvent | KeyboardEvent): number { |
|
return ( |
|
|
|
(Number(e.shiftKey) << 0) | |
|
|
|
(Number(e.altKey) << 1) | |
|
|
|
(Number(e.ctrlKey) << 2) | |
|
|
|
(Number(e.metaKey) << 3) |
|
); |
|
} |
|
|
|
|
|
export function textInputCleanup(text: string): string { |
|
if (text[text.length - 1] === "\n") return text.slice(0, -1); |
|
return text; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export async function getLocalizedScanCode(e: KeyboardEvent): Promise<string> { |
|
const keyText = e.key; |
|
const scanCode = e.code; |
|
|
|
|
|
const scanCodeNotLocaleSpecific = !LOCALE_SPECIFIC_KEY_CODES.includes(scanCode); |
|
if (scanCodeNotLocaleSpecific) { |
|
return scanCode; |
|
} |
|
|
|
|
|
if (SCAN_CODES_FOR_NON_WRITING_KEYS_THAT_VARY_PER_LOCALE.includes(scanCode)) { |
|
|
|
if (NUMPAD_DECIMAL_AND_THOUSANDS_SEPARATORS.includes(scanCode)) { |
|
switch (scanCode) { |
|
case ".": |
|
return "NumpadDecimal"; |
|
case ",": |
|
return "NumpadComma"; |
|
default: |
|
return scanCode; |
|
} |
|
} |
|
|
|
|
|
if (scanCode === "AltRight") { |
|
return keyText === "Alt" ? "AltRight" : "AltGraph"; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
if (/^Digit[0-9]$/.test(scanCode)) { |
|
|
|
|
|
|
|
|
|
return scanCode; |
|
} |
|
|
|
|
|
if (/^Key([A-Z])$/.test(scanCode)) { |
|
|
|
const rawLetter = keyText |
|
.normalize("NFD") |
|
.replace(/\p{Diacritic}/gu, "") |
|
.toUpperCase(); |
|
|
|
|
|
if (/^[A-Z]$/.test(rawLetter)) return `Key${rawLetter}`; |
|
|
|
|
|
|
|
|
|
if (!KEY_ATTRIBUTE_VALUES.has(keyText)) { |
|
|
|
if (navigator && "keyboard" in navigator && "getLayoutMap" in (navigator as any).keyboard) { |
|
|
|
const layout = await (navigator as any).keyboard.getLayoutMap(); |
|
|
|
type KeyCode = string; |
|
type KeySymbol = string; |
|
|
|
const keyboardLayoutMap: [KeyCode, KeySymbol][] = [...layout.entries()].map(([keyCode, keySymbol]) => [keyCode, keySymbol.toUpperCase()]); |
|
|
|
|
|
const matchedEntry = keyboardLayoutMap.find(([_, keySymbol]) => keySymbol === keyText.toUpperCase()); |
|
if (matchedEntry) return matchedEntry[0]; |
|
} |
|
|
|
|
|
|
|
|
|
return scanCode; |
|
} |
|
|
|
|
|
if (KEY_CODE_NAMES.includes(keyText)) { |
|
return scanCodeFromKeyText(keyText); |
|
} |
|
if (KEY_ATTRIBUTE_VALUES_INVOLVING_HANDEDNESS.includes(keyText)) { |
|
|
|
|
|
|
|
return `${keyText}Left`; |
|
} |
|
|
|
|
|
return scanCode; |
|
} |
|
|
|
|
|
if (WRITING_SYSTEM_SPECIAL_CHARS.includes(keyText)) { |
|
return scanCodeFromKeyText(keyText); |
|
} |
|
|
|
|
|
if (keyText === "Unidentified" || scanCode === "Unidentified") return "Unidentified"; |
|
|
|
|
|
return scanCode; |
|
} |
|
|
|
function scanCodeFromKeyText(keyText: string): string { |
|
|
|
|
|
|
|
if (KEY_ATTRIBUTE_VALUES_INVOLVING_HANDEDNESS.includes(keyText)) { |
|
return `${keyText}Left`; |
|
} |
|
|
|
|
|
const identicalName = KEY_CODE_NAMES.find((code) => code === keyText); |
|
if (identicalName) return keyText; |
|
|
|
|
|
|
|
if (keyText === " ") return "Space"; |
|
|
|
|
|
|
|
const matchedScanCode = KEY_CODES.find((info) => info.keys?.us?.includes(keyText)); |
|
if (matchedScanCode) return matchedScanCode.code; |
|
|
|
return "Unidentified"; |
|
} |
|
|
|
type KeyCategories = "writing-system" | "functional" | "functional-jp-kr" | "control-pad" | "arrow-pad" | "numpad" | "function" | "media" | "unidentified"; |
|
type KeyboardLocale = "us"; |
|
type ScanCodeInfo = { code: string; category: KeyCategories; keys?: Record<KeyboardLocale, string | undefined> }; |
|
const KEY_CODES: ScanCodeInfo[] = [ |
|
|
|
|
|
|
|
|
|
{ code: "Digit0", category: "writing-system", keys: { us: "0 )" } }, |
|
{ code: "Digit1", category: "writing-system", keys: { us: "1 !" } }, |
|
{ code: "Digit2", category: "writing-system", keys: { us: "2 @" } }, |
|
{ code: "Digit3", category: "writing-system", keys: { us: "3 #" } }, |
|
{ code: "Digit4", category: "writing-system", keys: { us: "4 $" } }, |
|
{ code: "Digit5", category: "writing-system", keys: { us: "5 %" } }, |
|
{ code: "Digit6", category: "writing-system", keys: { us: "6 ^" } }, |
|
{ code: "Digit7", category: "writing-system", keys: { us: "7 &" } }, |
|
{ code: "Digit8", category: "writing-system", keys: { us: "8 *" } }, |
|
{ code: "Digit9", category: "writing-system", keys: { us: "9 (" } }, |
|
|
|
{ code: "KeyA", category: "writing-system", keys: { us: "a A" } }, |
|
{ code: "KeyB", category: "writing-system", keys: { us: "b B" } }, |
|
{ code: "KeyC", category: "writing-system", keys: { us: "c C" } }, |
|
{ code: "KeyD", category: "writing-system", keys: { us: "d D" } }, |
|
{ code: "KeyE", category: "writing-system", keys: { us: "e E" } }, |
|
{ code: "KeyF", category: "writing-system", keys: { us: "f F" } }, |
|
{ code: "KeyG", category: "writing-system", keys: { us: "g G" } }, |
|
{ code: "KeyH", category: "writing-system", keys: { us: "h H" } }, |
|
{ code: "KeyI", category: "writing-system", keys: { us: "i I" } }, |
|
{ code: "KeyJ", category: "writing-system", keys: { us: "j J" } }, |
|
{ code: "KeyK", category: "writing-system", keys: { us: "k K" } }, |
|
{ code: "KeyL", category: "writing-system", keys: { us: "l L" } }, |
|
{ code: "KeyM", category: "writing-system", keys: { us: "m M" } }, |
|
{ code: "KeyN", category: "writing-system", keys: { us: "n N" } }, |
|
{ code: "KeyO", category: "writing-system", keys: { us: "o O" } }, |
|
{ code: "KeyP", category: "writing-system", keys: { us: "p P" } }, |
|
{ code: "KeyQ", category: "writing-system", keys: { us: "q Q" } }, |
|
{ code: "KeyR", category: "writing-system", keys: { us: "r R" } }, |
|
{ code: "KeyS", category: "writing-system", keys: { us: "s S" } }, |
|
{ code: "KeyT", category: "writing-system", keys: { us: "t T" } }, |
|
{ code: "KeyU", category: "writing-system", keys: { us: "u U" } }, |
|
{ code: "KeyV", category: "writing-system", keys: { us: "v V" } }, |
|
{ code: "KeyW", category: "writing-system", keys: { us: "w W" } }, |
|
{ code: "KeyX", category: "writing-system", keys: { us: "x X" } }, |
|
{ code: "KeyY", category: "writing-system", keys: { us: "y Y" } }, |
|
{ code: "KeyZ", category: "writing-system", keys: { us: "z Z" } }, |
|
|
|
{ code: "Backquote", category: "writing-system", keys: { us: "` ~" } }, |
|
{ code: "Backslash", category: "writing-system", keys: { us: "\\ |" } }, |
|
{ code: "BracketLeft", category: "writing-system", keys: { us: "[ {" } }, |
|
{ code: "BracketRight", category: "writing-system", keys: { us: "] }" } }, |
|
{ code: "Comma", category: "writing-system", keys: { us: ", <" } }, |
|
{ code: "Equal", category: "writing-system", keys: { us: "= +" } }, |
|
{ code: "Minus", category: "writing-system", keys: { us: "- _" } }, |
|
{ code: "Period", category: "writing-system", keys: { us: ". >" } }, |
|
{ code: "Quote", category: "writing-system", keys: { us: "' \"" } }, |
|
{ code: "Semicolon", category: "writing-system", keys: { us: "; :" } }, |
|
{ code: "Slash", category: "writing-system", keys: { us: "/ ?" } }, |
|
|
|
{ code: "IntlBackslash", category: "writing-system", keys: { us: undefined } }, |
|
{ code: "IntlRo", category: "writing-system", keys: { us: undefined } }, |
|
{ code: "IntlYen", category: "writing-system", keys: { us: undefined } }, |
|
|
|
|
|
|
|
|
|
{ code: "AltLeft", category: "functional" }, |
|
{ code: "AltRight", category: "functional" }, |
|
|
|
|
|
|
|
{ code: "Backspace", category: "writing-system" }, |
|
{ code: "CapsLock", category: "functional" }, |
|
{ code: "ContextMenu", category: "functional" }, |
|
{ code: "ControlLeft", category: "functional" }, |
|
{ code: "ControlRight", category: "functional" }, |
|
{ code: "Enter", category: "functional" }, |
|
{ code: "MetaLeft", category: "functional" }, |
|
{ code: "MetaRight", category: "functional" }, |
|
{ code: "ShiftLeft", category: "functional" }, |
|
{ code: "ShiftRight", category: "functional" }, |
|
{ code: "Space", category: "functional" }, |
|
{ code: "Tab", category: "functional" }, |
|
|
|
|
|
{ code: "Convert", category: "functional-jp-kr" }, |
|
{ code: "KanaMode", category: "functional-jp-kr" }, |
|
{ code: "Lang1", category: "functional-jp-kr" }, |
|
{ code: "Lang2", category: "functional-jp-kr" }, |
|
{ code: "Lang3", category: "functional-jp-kr" }, |
|
{ code: "Lang4", category: "functional-jp-kr" }, |
|
{ code: "Lang5", category: "functional-jp-kr" }, |
|
{ code: "NonConvert", category: "functional-jp-kr" }, |
|
|
|
|
|
{ code: "Delete", category: "control-pad" }, |
|
{ code: "End", category: "control-pad" }, |
|
{ code: "Help", category: "control-pad" }, |
|
{ code: "Home", category: "control-pad" }, |
|
{ code: "Insert", category: "control-pad" }, |
|
{ code: "PageDown", category: "control-pad" }, |
|
{ code: "PageUp", category: "control-pad" }, |
|
|
|
|
|
{ code: "ArrowDown", category: "arrow-pad" }, |
|
{ code: "ArrowLeft", category: "arrow-pad" }, |
|
{ code: "ArrowRight", category: "arrow-pad" }, |
|
{ code: "ArrowUp", category: "arrow-pad" }, |
|
|
|
|
|
{ code: "Numpad0", category: "numpad" }, |
|
{ code: "Numpad1", category: "numpad" }, |
|
{ code: "Numpad2", category: "numpad" }, |
|
{ code: "Numpad3", category: "numpad" }, |
|
{ code: "Numpad4", category: "numpad" }, |
|
{ code: "Numpad5", category: "numpad" }, |
|
{ code: "Numpad6", category: "numpad" }, |
|
{ code: "Numpad7", category: "numpad" }, |
|
{ code: "Numpad8", category: "numpad" }, |
|
{ code: "Numpad9", category: "numpad" }, |
|
{ code: "NumLock", category: "numpad" }, |
|
{ code: "NumpadAdd", category: "numpad" }, |
|
{ code: "NumpadBackspace", category: "numpad" }, |
|
{ code: "NumpadClear", category: "numpad" }, |
|
{ code: "NumpadClearEntry", category: "numpad" }, |
|
{ code: "NumpadComma", category: "numpad" }, |
|
{ code: "NumpadDecimal", category: "numpad" }, |
|
{ code: "NumpadDivide", category: "numpad" }, |
|
{ code: "NumpadEnter", category: "numpad" }, |
|
{ code: "NumpadEqual", category: "numpad" }, |
|
{ code: "NumpadHash", category: "numpad" }, |
|
{ code: "NumpadMemoryAdd", category: "numpad" }, |
|
{ code: "NumpadMemoryClear", category: "numpad" }, |
|
{ code: "NumpadMemoryRecall", category: "numpad" }, |
|
{ code: "NumpadMemoryStore", category: "numpad" }, |
|
{ code: "NumpadMemorySubtract", category: "numpad" }, |
|
{ code: "NumpadMultiply", category: "numpad" }, |
|
{ code: "NumpadParenLeft", category: "numpad" }, |
|
{ code: "NumpadParenRight", category: "numpad" }, |
|
{ code: "NumpadStar", category: "numpad" }, |
|
{ code: "NumpadSubtract", category: "numpad" }, |
|
|
|
|
|
{ code: "Escape", category: "function" }, |
|
{ code: "F1", category: "function" }, |
|
{ code: "F2", category: "function" }, |
|
{ code: "F3", category: "function" }, |
|
{ code: "F4", category: "function" }, |
|
{ code: "F5", category: "function" }, |
|
{ code: "F6", category: "function" }, |
|
{ code: "F7", category: "function" }, |
|
{ code: "F8", category: "function" }, |
|
{ code: "F9", category: "function" }, |
|
{ code: "F10", category: "function" }, |
|
{ code: "F11", category: "function" }, |
|
{ code: "F12", category: "function" }, |
|
{ code: "F13", category: "function" }, |
|
{ code: "F14", category: "function" }, |
|
{ code: "F15", category: "function" }, |
|
{ code: "F16", category: "function" }, |
|
{ code: "F17", category: "function" }, |
|
{ code: "F18", category: "function" }, |
|
{ code: "F19", category: "function" }, |
|
{ code: "F20", category: "function" }, |
|
{ code: "F21", category: "function" }, |
|
{ code: "F22", category: "function" }, |
|
{ code: "F23", category: "function" }, |
|
{ code: "F24", category: "function" }, |
|
{ code: "Fn", category: "function" }, |
|
{ code: "FnLock", category: "function" }, |
|
{ code: "PrintScreen", category: "function" }, |
|
{ code: "ScrollLock", category: "function" }, |
|
{ code: "Pause", category: "function" }, |
|
|
|
|
|
{ code: "BrowserBack", category: "media" }, |
|
{ code: "BrowserFavorites", category: "media" }, |
|
{ code: "BrowserForward", category: "media" }, |
|
{ code: "BrowserHome", category: "media" }, |
|
{ code: "BrowserRefresh", category: "media" }, |
|
{ code: "BrowserSearch", category: "media" }, |
|
{ code: "BrowserStop", category: "media" }, |
|
{ code: "Eject", category: "media" }, |
|
{ code: "LaunchApp1", category: "media" }, |
|
{ code: "LaunchApp2", category: "media" }, |
|
{ code: "LaunchMail", category: "media" }, |
|
{ code: "MediaPlayPause", category: "media" }, |
|
{ code: "MediaSelect", category: "media" }, |
|
{ code: "MediaStop", category: "media" }, |
|
{ code: "MediaTrackNext", category: "media" }, |
|
{ code: "MediaTrackPrevious", category: "media" }, |
|
{ code: "Power", category: "media" }, |
|
{ code: "Sleep", category: "media" }, |
|
{ code: "AudioVolumeDown", category: "media" }, |
|
{ code: "AudioVolumeMute", category: "media" }, |
|
{ code: "AudioVolumeUp", category: "media" }, |
|
{ code: "WakeUp", category: "media" }, |
|
|
|
|
|
{ code: "Unidentified", category: "unidentified" }, |
|
]; |
|
const KEY_CODE_NAMES = Object.values(KEY_CODES).map((info) => info.code); |
|
|
|
|
|
|
|
const NUMPAD_DECIMAL_AND_THOUSANDS_SEPARATORS = ["NumpadComma", "NumpadDecimal"]; |
|
const SCAN_CODES_FOR_NON_WRITING_KEYS_THAT_VARY_PER_LOCALE = ["AltRight", ...NUMPAD_DECIMAL_AND_THOUSANDS_SEPARATORS]; |
|
const LOCALE_SPECIFIC_KEY_CODES_INFO = KEY_CODES.filter((key) => key.category === "writing-system" || SCAN_CODES_FOR_NON_WRITING_KEYS_THAT_VARY_PER_LOCALE.includes(key.code)); |
|
const LOCALE_SPECIFIC_KEY_CODES = LOCALE_SPECIFIC_KEY_CODES_INFO.map((info) => info.code); |
|
const WRITING_SYSTEM_SPECIAL_CHARS = Object.values(KEY_CODES) |
|
.filter((info) => info.category === "writing-system") |
|
.flatMap((info) => info.keys?.us?.split(" ")) |
|
.filter((character) => character && !/[a-zA-Z0-9]/.test(character)) as string[]; |
|
|
|
const KEY_ATTRIBUTE_VALUES_INVOLVING_HANDEDNESS = ["Control", "Meta", "Shift"]; |
|
const KEY_ATTRIBUTE_VALUES = new Set([ |
|
|
|
"Alt", |
|
"AltGraph", |
|
"CapsLock", |
|
"Control", |
|
"Fn", |
|
"FnLock", |
|
"Meta", |
|
"NumLock", |
|
"ScrollLock", |
|
"Shift", |
|
"Symbol", |
|
"SymbolLock", |
|
|
|
|
|
"Hyper", |
|
"Super", |
|
|
|
|
|
"Enter", |
|
"Tab", |
|
|
|
|
|
"ArrowDown", |
|
"ArrowLeft", |
|
"ArrowRight", |
|
"ArrowUp", |
|
"End", |
|
"Home", |
|
"PageDown", |
|
"PageUp", |
|
|
|
|
|
"Backspace", |
|
"Clear", |
|
"Copy", |
|
"CrSel", |
|
"Cut", |
|
"Delete", |
|
"EraseEof", |
|
"ExSel", |
|
"Insert", |
|
"Paste", |
|
"Redo", |
|
"Undo", |
|
|
|
|
|
"Accept", |
|
"Again", |
|
"Attn", |
|
"Cancel", |
|
"ContextMenu", |
|
"Escape", |
|
"Execute", |
|
"Find", |
|
"Help", |
|
"Pause", |
|
"Play", |
|
"Props", |
|
"Select", |
|
"ZoomIn", |
|
"ZoomOut", |
|
|
|
|
|
"BrightnessDown", |
|
"BrightnessUp", |
|
"Eject", |
|
"LogOff", |
|
"Power", |
|
"PowerOff", |
|
"PrintScreen", |
|
"Hibernate", |
|
"Standby", |
|
"WakeUp", |
|
|
|
|
|
"AllCandidates", |
|
"Alphanumeric", |
|
"CodeInput", |
|
"Compose", |
|
"Convert", |
|
"Dead", |
|
"FinalMode", |
|
"GroupFirst", |
|
"GroupLast", |
|
"GroupNext", |
|
"GroupPrevious", |
|
"ModeChange", |
|
"NextCandidate", |
|
"NonConvert", |
|
"PreviousCandidate", |
|
"Process", |
|
"SingleCandidate", |
|
|
|
|
|
"HangulMode", |
|
"HanjaMode", |
|
"JunjaMode", |
|
|
|
|
|
"Eisu", |
|
"Hankaku", |
|
"Hiragana", |
|
"HiraganaKatakana", |
|
"KanaMode", |
|
"KanjiMode", |
|
"Katakana", |
|
"Romaji", |
|
"Zenkaku", |
|
"ZenkakuHankaku", |
|
|
|
|
|
"F1", |
|
"F2", |
|
"F3", |
|
"F4", |
|
"F5", |
|
"F6", |
|
"F7", |
|
"F8", |
|
"F9", |
|
"F10", |
|
"F11", |
|
"F12", |
|
"F13", |
|
"F14", |
|
"F15", |
|
"F16", |
|
"F17", |
|
"F18", |
|
"F19", |
|
"F20", |
|
"F21", |
|
"F22", |
|
"F23", |
|
"F24", |
|
"Soft1", |
|
"Soft2", |
|
"Soft3", |
|
"Soft4", |
|
"Soft5", |
|
"Soft6", |
|
"Soft7", |
|
"Soft8", |
|
"Soft9", |
|
"Soft10", |
|
"Soft11", |
|
"Soft12", |
|
"Soft13", |
|
"Soft14", |
|
"Soft15", |
|
"Soft16", |
|
"Soft17", |
|
"Soft18", |
|
"Soft19", |
|
"Soft20", |
|
"Soft21", |
|
"Soft22", |
|
"Soft23", |
|
"Soft24", |
|
|
|
|
|
"ChannelDown", |
|
"ChannelUp", |
|
"Close", |
|
"MailForward", |
|
"MailReply", |
|
"MailSend", |
|
"MediaClose", |
|
"MediaFastForward", |
|
"MediaPause", |
|
"MediaPlay", |
|
"MediaPlayPause", |
|
"MediaRecord", |
|
"MediaRewind", |
|
"MediaStop", |
|
"MediaTrackNext", |
|
"MediaTrackPrevious", |
|
"New", |
|
"Open", |
|
"Print", |
|
"Save", |
|
"SpellCheck", |
|
|
|
|
|
"Digit11", |
|
"Digit12", |
|
|
|
|
|
"AudioBalanceLeft", |
|
"AudioBalanceRight", |
|
"AudioBassBoostDown", |
|
"AudioBassBoostToggle", |
|
"AudioBassBoostUp", |
|
"AudioFaderFront", |
|
"AudioFaderRear", |
|
"AudioSurroundModeNext", |
|
"AudioTrebleDown", |
|
"AudioTrebleUp", |
|
"AudioVolumeDown", |
|
"AudioVolumeUp", |
|
"AudioVolumeMute", |
|
"MicrophoneToggle", |
|
"MicrophoneVolumeDown", |
|
"MicrophoneVolumeUp", |
|
"MicrophoneVolumeMute", |
|
|
|
|
|
"SpeechCorrectionList", |
|
"SpeechInputToggle", |
|
|
|
|
|
"LaunchApplication1", |
|
"LaunchApplication2", |
|
"LaunchCalendar", |
|
"LaunchContacts", |
|
"LaunchMail", |
|
"LaunchMediaPlayer", |
|
"LaunchMusicPlayer", |
|
"LaunchPhone", |
|
"LaunchScreenSaver", |
|
"LaunchSpreadsheet", |
|
"LaunchWebBrowser", |
|
"LaunchWebCam", |
|
"LaunchWordProcessor", |
|
|
|
|
|
"BrowserBack", |
|
"BrowserFavorites", |
|
"BrowserForward", |
|
"BrowserHome", |
|
"BrowserRefresh", |
|
"BrowserSearch", |
|
"BrowserStop", |
|
|
|
|
|
"AppSwitch", |
|
"Call", |
|
"Camera", |
|
"CameraFocus", |
|
"EndCall", |
|
"GoBack", |
|
"GoHome", |
|
"HeadsetHook", |
|
"LastNumberRedial", |
|
"Notification", |
|
"MannerMode", |
|
"VoiceDial", |
|
|
|
|
|
"TV", |
|
"TV3DMode", |
|
"TVAntennaCable", |
|
"TVAudioDescription", |
|
"TVAudioDescriptionMixDown", |
|
"TVAudioDescriptionMixUp", |
|
"TVContentsMenu", |
|
"TVDataService", |
|
"TVInput", |
|
"TVInputComponent1", |
|
"TVInputComponent2", |
|
"TVInputComposite1", |
|
"TVInputComposite2", |
|
"TVInputHDMI1", |
|
"TVInputHDMI2", |
|
"TVInputHDMI3", |
|
"TVInputHDMI4", |
|
"TVInputVGA1", |
|
"TVMediaContext", |
|
"TVNetwork", |
|
"TVNumberEntry", |
|
"TVPower", |
|
"TVRadioService", |
|
"TVSatellite", |
|
"TVSatelliteBS", |
|
"TVSatelliteCS", |
|
"TVSatelliteToggle", |
|
"TVTerrestrialAnalog", |
|
"TVTerrestrialDigital", |
|
"TVTimer", |
|
|
|
|
|
"AVRInput", |
|
"AVRPower", |
|
"ColorF0Red", |
|
"ColorF1Green", |
|
"ColorF2Yellow", |
|
"ColorF3Blue", |
|
"ColorF4Grey", |
|
"ColorF5Brown", |
|
"ClosedCaptionToggle", |
|
"Dimmer", |
|
"DisplaySwap", |
|
"DVR", |
|
"Exit", |
|
"FavoriteClear0", |
|
"FavoriteClear1", |
|
"FavoriteClear2", |
|
"FavoriteClear3", |
|
"FavoriteRecall0", |
|
"FavoriteRecall1", |
|
"FavoriteRecall2", |
|
"FavoriteRecall3", |
|
"FavoriteStore0", |
|
"FavoriteStore1", |
|
"FavoriteStore2", |
|
"FavoriteStore3", |
|
"Guide", |
|
"GuideNextDay", |
|
"GuidePreviousDay", |
|
"Info", |
|
"InstantReplay", |
|
"Link", |
|
"ListProgram", |
|
"LiveContent", |
|
"Lock", |
|
"MediaApps", |
|
"MediaAudioTrack", |
|
"MediaLast", |
|
"MediaSkipBackward", |
|
"MediaSkipForward", |
|
"MediaStepBackward", |
|
"MediaStepForward", |
|
"MediaTopMenu", |
|
"NavigateIn", |
|
"NavigateNext", |
|
"NavigateOut", |
|
"NavigatePrevious", |
|
"NextFavoriteChannel", |
|
"NextUserProfile", |
|
"OnDemand", |
|
"Pairing", |
|
"PinPDown", |
|
"PinPMove", |
|
"PinPToggle", |
|
"PinPUp", |
|
"PlaySpeedDown", |
|
"PlaySpeedReset", |
|
"PlaySpeedUp", |
|
"RandomToggle", |
|
"RcLowBattery", |
|
"RecordSpeedNext", |
|
"RfBypass", |
|
"ScanChannelsToggle", |
|
"ScreenModeNext", |
|
"Settings", |
|
"SplitScreenToggle", |
|
"STBInput", |
|
"STBPower", |
|
"Subtitle", |
|
"Teletext", |
|
"VideoModeNext", |
|
"Wink", |
|
"ZoomToggle", |
|
|
|
|
|
"Unidentified", |
|
]); |
|
|