diff --git a/frontend/src/components/Keyboard/data/new/KeyboardEventKeys.ts b/frontend/src/components/Keyboard/data/new/KeyboardEventKeys.ts new file mode 100644 index 0000000..47ce356 --- /dev/null +++ b/frontend/src/components/Keyboard/data/new/KeyboardEventKeys.ts @@ -0,0 +1,331 @@ +export const keyboardEventKeys = [ + "Alt", + "AltGraph", + "CapsLock", + "Control", + "Fn", + "FnLock", + "Hyper", + "Meta", + "NumLock", + "ScrollLock", + "Shift", + "Super", + "Symbol", + "SymbolLock", + "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", + "Finish", + "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", + "ZenkakuHanaku", + "F1", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "F10", + "F11", + "F12", + "F13", + "F14", + "F15", + "F16", + "F17", + "F18", + "F19", + "F20", + "Soft1", + "Soft2", + "Soft3", + "Soft4", + "AppSwitch", + "Call", + "Camera", + "CameraFocus", + "EndCall", + "GoBack", + "GoHome", + "HeadsetHook", + "LastNumberRedial", + "Notification", + "MannerMode", + "VoiceDial", + "ChannelDown", + "ChannelUp", + "MediaFastForward", + "MediaPause", + "MediaPlay", + "MediaPlayPause", + "MediaRecord", + "MediaRewind", + "MediaStop", + "MediaTrackNext", + "MediaTrackPrevious", + "AudioBalanceLeft", + "AudioBalanceRight", + "AudioBassDown", + "AudioBassBoostDown", + "AudioBassBoostToggle", + "AudioBassBoostUp", + "AudioBassUp", + "AudioFaderFront", + "AudioFaderRear", + "AudioSurroundModeNext", + "AudioTrebleDown", + "AudioTrebleUp", + "AudioVolumeDown [1]", + "AudioVolumeMute [1]", + "AudioVolumeUp [1]", + "MicrophoneToggle", + "MicrophoneVolumeDown", + "MicrophoneVolumeMute", + "MicrophoneVolumeUp", + "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", + "SpeechCorrectionList", + "SpeechInputToggle", + "Close", + "New", + "Open", + "Print", + "Save", + "SpellCheck", + "MailForward", + "MailReply", + "MailSend", + "LaunchCalculator", + "LaunchCalendar", + "LaunchContacts", + "LaunchMail", + "LaunchMediaPlayer", + "LaunchMusicPlayer", + "LaunchMyComputer", + "LaunchPhone", + "LaunchScreenSaver", + "LaunchSpreadsheet", + "LaunchWebBrowser", + "LaunchWebCam", + "LaunchWordProcessor", + "LaunchApplication1", + "LaunchApplication2", + "LaunchApplication3", + "LaunchApplication4", + "LaunchApplication5", + "LaunchApplication6", + "LaunchApplication7", + "LaunchApplication8", + "LaunchApplication9", + "LaunchApplication10", + "LaunchApplication11", + "LaunchApplication12", + "LaunchApplication13", + "LaunchApplication14", + "LaunchApplication15", + "LaunchApplication16", + "BrowserBack", + "BrowserFavorites", + "BrowserForward", + "BrowserHome", + "BrowserRefresh", + "BrowserSearch", + "BrowserStop", + "Decimal", + "Key11", + "Key12", + "Multiply", + "Add", + "Clear", + "Divide", + "Subtract", + "Separator", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", +]; + +// "Unidentified" diff --git a/frontend/src/components/Keyboard/data/new/StandardKeyName.ts b/frontend/src/components/Keyboard/data/new/StandardKeyName.ts new file mode 100644 index 0000000..9369b7e --- /dev/null +++ b/frontend/src/components/Keyboard/data/new/StandardKeyName.ts @@ -0,0 +1,165 @@ +/** + * Array of standard key names for keyboard events, including additional keys for macOS and Windows. + */ +export const standardKeyNames = [ + "Escape", + "Digit1", + "Digit2", + "Digit3", + "Digit4", + "Digit5", + "Digit6", + "Digit7", + "Digit8", + "Digit9", + "Digit0", + "Minus", + "Equal", + "Backspace", + "Tab", + "KeyQ", + "KeyW", + "KeyE", + "KeyR", + "KeyT", + "KeyY", + "KeyU", + "KeyI", + "KeyO", + "KeyP", + "BracketLeft", + "BracketRight", + "Enter", + "ControlLeft", + "KeyA", + "KeyS", + "KeyD", + "KeyF", + "KeyG", + "KeyH", + "KeyJ", + "KeyK", + "KeyL", + "Semicolon", + "Quote", + "Backquote", + "ShiftLeft", + "Backslash", + "KeyZ", + "KeyX", + "KeyC", + "KeyV", + "KeyB", + "KeyN", + "KeyM", + "Comma", + "Period", + "Slash", + "ShiftRight", + "NumpadMultiply", + "AltLeft", + "Space", + "CapsLock", + "F1", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "F10", + "NumLock", + "ScrollLock", + "Numpad7", + "Numpad8", + "Numpad9", + "NumpadSubtract", + "Numpad4", + "Numpad5", + "Numpad6", + "NumpadAdd", + "Numpad1", + "Numpad2", + "Numpad3", + "Numpad0", + "NumpadDecimal", + "IntlBackslash", + "F11", + "F12", + "IntlRo", + "Convert", + "KanaMode", + "NonConvert", + "NumpadEnter", + "ControlRight", + "NumpadDivide", + "PrintScreen", + "AltRight", + "Home", + "ArrowUp", + "PageUp", + "ArrowLeft", + "ArrowRight", + "End", + "ArrowDown", + "PageDown", + "Insert", + "Delete", + "VolumeMute", + "VolumeDown", + "VolumeUp", + "NumpadEqual", + "Pause", + "NumpadComma", + "Lang1", + "Lang2", + "IntlYen", + "MetaLeft", + "MetaRight", + "ContextMenu", + "BrowserStop", + "Again", + "Props", + "Undo", + "Select", + "Copy", + "Open", + "Paste", + "Find", + "Cut", + "Help", + "LaunchApp2", + "WakeUp", + "LaunchApp1", + "LaunchMail", + "BrowserFavorites", + "BrowserBack", + "BrowserForward", + "Eject", + "MediaTrackNext", + "MediaPlayPause", + "MediaTrackPrevious", + "MediaStop", + "MediaSelect", + "BrowserHome", + "BrowserRefresh", + "F13", + "F14", + "F15", + "F16", + "F17", + "F18", + "F19", + "F20", + "F21", + "F22", + "F23", + "F24", + "BrowserSearch", + "Fn", // Additional key for macOS + "Power", // Additional key for Windows +] as const; + +export type StandardKeyNameType = (typeof standardKeyNames)[number]; diff --git a/frontend/src/components/Keyboard/data/new/convertKeyboardEventCodeToStandardKeyName.ts b/frontend/src/components/Keyboard/data/new/convertKeyboardEventCodeToStandardKeyName.ts new file mode 100644 index 0000000..0496835 --- /dev/null +++ b/frontend/src/components/Keyboard/data/new/convertKeyboardEventCodeToStandardKeyName.ts @@ -0,0 +1,102 @@ +import { StandardKeyNameType, standardKeyNames } from "./StandardKeyName"; + +type KeyboardEventCodeToStandardKeyNameMapType = { + [key: string]: StandardKeyNameType | null; +}; + +const linuxFirefoxKeyboardEventCodeToStandardKeyName: KeyboardEventCodeToStandardKeyNameMapType = + {}; + +const linuxChromiumKeyboardEventCodeToStandardKeyName: KeyboardEventCodeToStandardKeyNameMapType = + { + Lang5: null, + Lang3: null, + Lang4: null, + AudioVolumeMute: "VolumeMute", + AudioVolumeDown: "VolumeDown", + AudioVolumeUp: "VolumeUp", + Sleep: null, + NumpadParenLeft: null, + NumpadParenRight: null, + }; + +const macosFirefoxKeyboardEventCodeToStandardKeyName: KeyboardEventCodeToStandardKeyNameMapType = + {}; + +const macosChromiumKeyboardEventCodeToStandardKeyName: KeyboardEventCodeToStandardKeyNameMapType = + { + AudioVolumeUp: "VolumeUp", + AudioVolumeDown: "VolumeDown", + AudioVolumeMute: "VolumeMute", + Insert: "Help", + }; + +const windowsFirefoxKeyboardEventCodeToStandardKeyName: KeyboardEventCodeToStandardKeyNameMapType = + { + AudioVolumeMute: "VolumeMute", + }; + +const windowsChromiumKeyboardEventCodeToStandardKeyName: KeyboardEventCodeToStandardKeyNameMapType = + { + AudioVolumeMute: "VolumeMute", + AudioVolumeDown: "VolumeDown", + AudioVolumeUp: "VolumeUp", + }; + +type Platform = "Linux" | "macOS" | "Windows"; +type Browser = "Firefox" | "Chromium"; + +function getKeyboardEventCodeToStandardKeyNameMap( + platform: Platform, + browser: Browser, +) { + switch (platform) { + case "Linux": + switch (browser) { + case "Firefox": + return linuxFirefoxKeyboardEventCodeToStandardKeyName; + case "Chromium": + return linuxChromiumKeyboardEventCodeToStandardKeyName; + } + break; + case "macOS": + switch (browser) { + case "Firefox": + return macosFirefoxKeyboardEventCodeToStandardKeyName; + case "Chromium": + return macosChromiumKeyboardEventCodeToStandardKeyName; + } + break; + case "Windows": + switch (browser) { + case "Firefox": + return windowsFirefoxKeyboardEventCodeToStandardKeyName; + case "Chromium": + return windowsChromiumKeyboardEventCodeToStandardKeyName; + } + } +} + +export default function convertKeyboardEventCodeToStandardKeyName( + platform: Platform, + browser: Browser, + keyboardEventCode: string, +): StandardKeyNameType | null { + const keyboardEventCodeToStandardKeyNameMap = + getKeyboardEventCodeToStandardKeyNameMap(platform, browser); + switch (keyboardEventCodeToStandardKeyNameMap[keyboardEventCode]) { + case null: + return null; + case undefined: + if ( + !standardKeyNames.includes(keyboardEventCode as StandardKeyNameType) + ) { + throw new Error( + `Unknown keyboard event code: ${keyboardEventCode} (platform: ${platform}, browser: ${browser})`, + ); + } + return keyboardEventCode as StandardKeyNameType; + default: + return keyboardEventCodeToStandardKeyNameMap[keyboardEventCode]; + } +}