EmbyCrackedClient/web/modules/input/keyboard.js
2025-06-25 11:46:04 +08:00

1 line
No EOL
19 KiB
JavaScript

import inputManager from"./../common/inputmanager.js";import browser from"./../browser.js";import dom from"./../dom.js";function notifyApp(e){inputManager.notify(null,e)}let preventDefaultOnGamePadA=!browser.edge,keyDownTarget;function onGamepadAKeyDown(e,key){var target=e.target;switch(!preventDefaultOnGamePadA&&isEditable(target)||e.preventDefault(),target.tagName){case"INPUT":case"SELECT":case"TEXTAREA":return}if(target===keyDownTarget)return target.classList.contains("longpress")?checkForLongPress(e,key,"menu")?void 0:void e.preventDefault():void(e.repeat||sendCommandFromEvent("select",e));e.preventDefault()}function onGamepadAKeyUp(e,wasLongPressed){var target=e.target;switch(!preventDefaultOnGamePadA&&isEditable(target)||e.preventDefault(),target.tagName){case"INPUT":case"SELECT":case"TEXTAREA":return}target.classList.contains("longpress")&&(wasLongPressed||sendCommandFromEvent("select",e),e.preventDefault())}function sendCommandFromEvent(name,e){var options={sourceElement:e.target,repeat:e.repeat,originalEvent:e};inputManager.trigger(name,options)&&e.preventDefault()}function isEditable(elem){var readOnly=elem.readOnly;if(!readOnly&&!1===readOnly)switch(elem.type){case"checkbox":case"radio":case"file":case"hidden":case"range":return!1;default:return!0}return!1}let isNativeWindows="winjs"===globalThis.appMode,handleMultiMediaKeys=!browser.electron,goBackOnBackspace=browser.electron||isNativeWindows||browser.tv||"embyclient"===globalThis.appMode,appMode=globalThis.appMode,IsBrowser=!browser.electron&&"standalone"===(appMode||"standalone"),isNativeTizen="tizen"===globalThis.appMode,isNativeLG="webos"===globalThis.appMode,repeatingKey,repeatKeyFirstInputTime=0,lastRepeatingKeyTime=0,repeatKeyCount=0,repeatKeyLongPressed=!1,EnableRepeatWorkaround=browser.edge||isNativeTizen||isNativeLG||"android"===appMode,LongPressTimeout=500;function setEventRepeatProperty(e){try{Object.defineProperty(e,"repeat",{value:!0})}catch(err){}}function throttleRepeatingKey(key,e){var timestamp=e.timeStamp;let isRepeat=e.repeat;if(EnableRepeatWorkaround&&!isRepeat&&key===repeatingKey&&(isRepeat=!0,setEventRepeatProperty(e)),isRepeat&&key===repeatingKey){if(timestamp-lastRepeatingKeyTime<(repeatKeyCount?80:200))return e.preventDefault(),!0;repeatKeyCount++}else repeatingKey=key,repeatKeyCount=0,repeatKeyFirstInputTime=timestamp,repeatKeyLongPressed=!1;return lastRepeatingKeyTime=timestamp,!1}function isLongPress(e,key){if((throttleRepeatingKey(key,e),e.repeat&&!repeatKeyLongPressed)&&e.timeStamp-repeatKeyFirstInputTime>=LongPressTimeout)return repeatKeyLongPressed=!0;return!1}function checkForLongPress(e,key,command){if(isLongPress(e,key))return console.log("executing command "+command+" following long press of key: "+key),sendCommandFromEvent(command,e),!0}function getKeyFromKeyCode(keyCode){switch(keyCode){case 13:return"Enter";case 19:return"Pause";case 27:return"Back";case 32:return" ";case 33:return"PageUp";case 34:return"PageDown";case 37:return"ArrowLeft";case 39:return"ArrowRight";case 38:return"ArrowUp";case 40:return"ArrowDown";case 195:return"GamepadA";case 196:return"GamepadB";case 197:return"GamepadX";case 198:return"GamepadY";case 199:return"GamepadRightShoulder";case 200:return"GamepadLeftShoulder";case 201:return"GamepadLeftTrigger";case 202:return"GamepadRightTrigger";case 203:return"GamepadDPadUp";case 204:return"GamepadDPadDown";case 205:return"GamepadDPadLeft";case 206:return"GamepadDPadRight";case 207:return"GamepadMenu";case 208:return"GamepadView";case 209:return"GamepadLeftThumbstickButton";case 210:return"GamepadRightThumbstickButton";case 211:return"GamepadLeftThumbStickUp";case 212:return"GamepadLeftThumbStickDown";case 213:return"GamepadLeftThumbStickRight";case 214:return"GamepadLeftThumbStickLeft";case 403:return"ColorF0Red";case 404:return"ColorF1Green";case 405:return"ColorF2Yellow";case 406:return"ColorF3Blue";case 412:return"MediaRewind";case 413:return"Stop";case 415:return"Play";case 416:return"MediaRecord";case 417:return"MediaFastForward";case 427:return"ChannelUp";case 428:return"ChannelDown";case 447:return"VolumeUp";case 448:return"VolumeDown";case 449:return"VolumeMute";case 457:case 1056:return"Info";case 458:return"Guide";case 459:case 460:return"Subtitle";case 461:case 10009:return"Back";case 10073:return"ChannelList";case 10135:return"Tools";case 10140:return"PictureSize";case 10200:return"Teletext";case 10221:return"Caption";case 10225:return"Search";case 10232:return"MediaTrackPrevious";case 10233:return"MediaTrackNext";case 10252:return"MediaPlayPause"}if(null==keyCode)return null;switch(keyCode){case globalThis.VK_BACK_SPACE:return"Back";case globalThis.VK_LEFT:return"Left";case globalThis.VK_UP:return"Up";case globalThis.VK_RIGHT:return"Right";case globalThis.VK_DOWN:return"Down";case globalThis.VK_MENU:return"ContextMenu";case globalThis.VK_TRACK_NEXT:return"MediaTrackNext";case globalThis.VK_TRACK_PREV:return"MediaTrackPrevious";case globalThis.VK_INFO:return"Info";case globalThis.VK_STOP:return"MediaStop";case globalThis.VK_PLAY:return"MediaPlay";case globalThis.VK_PAUSE:return"MediaPause";case globalThis.VK_FAST_FWD:return"MediaFastForward";case globalThis.VK_REWIND:return"MediaRewind";default:return null}}function handleAlphaNumInput(e){var val,value=e.keyCode;(8===value||32===value||48<=value&&value<=57||65<=value&&value<=90)&&"INPUT"===(e=e.target).tagName&&e.readOnly&&(e=e,8===value?(val=e.value,e.value=val.length?val.substring(0,val.length-1):""):(-1===e.maxLength||e.value.length<e.maxLength)&&(e.value+=String.fromCharCode(value)),e.dispatchEvent(new CustomEvent("input",{bubbles:!0})))}let EnableReadOnlyInputWorkaround=isNativeTizen||isNativeLG,EnableSingleCharacterKeyWorkaround=isNativeLG;function onKeyDown(e){let key=e.resultKey||e.key;key=key||getKeyFromKeyCode(e.keyCode);var target=e.target;switch(keyDownTarget=keyDownTarget||target,key){case"ArrowUp":case"Up":case"NavigationUp":case"GamepadDPadUp":case"GamepadLeftThumbstickUp":case"GamepadLeftThumbStickUp":return isNativeTizen&&"Up"===key?void 0:throttleRepeatingKey(key,e)?void 0:void sendCommandFromEvent("up",e);case"ArrowDown":case"Down":case"NavigationDown":case"GamepadDPadDown":case"GamepadLeftThumbstickDown":case"GamepadLeftThumbStickDown":return isNativeTizen&&"Down"===key?void 0:throttleRepeatingKey(key,e)?void 0:void sendCommandFromEvent("down",e);case"ArrowLeft":case"Left":case"NavigationLeft":case"GamepadDPadLeft":case"GamepadLeftThumbStickLeft":case"GamepadLeftThumbstickLeft":return isNativeTizen&&"Left"===key?void 0:e.altKey?(e.preventDefault(),void checkForLongPress(e,key,"home")):e.shiftKey&&!isEditable(target)?void sendCommandFromEvent("rewind",e):throttleRepeatingKey(key,e)?void 0:void sendCommandFromEvent("left",e);case"ArrowRight":case"Right":case"NavigationRight":case"GamepadDPadRight":case"GamepadLeftThumbStickRight":case"GamepadLeftThumbstickRight":return isNativeTizen&&"Right"===key?void 0:e.altKey?void sendCommandFromEvent("forward",e):e.shiftKey&&!isEditable(target)?void sendCommandFromEvent("fastforward",e):throttleRepeatingKey(key,e)?void 0:void sendCommandFromEvent("right",e);case"End":return void(isEditable(target)||sendCommandFromEvent("end",e));case"Home":return void(isEditable(target)||sendCommandFromEvent("home",e));case"PageUp":return void sendCommandFromEvent("pageup",e);case"PageDown":return void sendCommandFromEvent("pagedown",e);case"Backspace":if(goBackOnBackspace&&!isEditable(target))return e.preventDefault(),void checkForLongPress(e,key,"home");break;case"Delete":case"Del":if(isEditable(target))break;return void sendCommandFromEvent("delete",e);case"GamepadA":case"GamePadA":return void onGamepadAKeyDown(e,key);case"Accept":case"NavigationAccept":case"NavigateIn":case"Open":case"Select":case"Execute":case"Link":return void sendCommandFromEvent("select",e);case"Enter":return target!==keyDownTarget?void e.preventDefault():target.classList.contains("longpress")?checkForLongPress(e,key,"menu")?void 0:void e.preventDefault():void(target.closest("button,a,select,input,textarea")||sendCommandFromEvent("select",e));case"Escape":case"Esc":return void(e.shiftKey||e.altKey||e.ctrlKey||(e.preventDefault(),checkForLongPress(e,key,"home")));case"Cancel":case"NavigationCancel":case"GamepadB":case"GamePadB":case"Exit":case"NavigateOut":case"Back":case"RCUBack":case"GoBack":case"XF86Back":return e.preventDefault(),void checkForLongPress(e,key,"home");case"ContextMenu":case"NavigationMenu":return void sendCommandFromEvent("menu",e);case"Menu":if(handleMultiMediaKeys)return void sendCommandFromEvent("menu",e);break;case"GamepadMenu":sendCommandFromEvent("menu",e);break;case"Help":case"Finish":break;case"Find":case"Search":case"XF86Search":if(handleMultiMediaKeys)return void sendCommandFromEvent("search",e);break;case"ZoomIn":case"ZoomOut":return void sendCommandFromEvent("changezoom",e);case"F8":return void(IsBrowser||sendCommandFromEvent("togglemute",e));case"F9":return void(IsBrowser||sendCommandFromEvent("volumedown",e));case"F10":return void(IsBrowser||sendCommandFromEvent("volumeup",e));case"F11":return void(IsBrowser||sendCommandFromEvent("togglefullscreen",e));case"+":if(isEditable(target))break;return void sendCommandFromEvent("channelup",e);case"ChannelUp":case"GamepadY":case"RaiseChannel":case"XF86RaiseChannel":if(handleMultiMediaKeys)return void sendCommandFromEvent("channelup",e);break;case"-":if(isEditable(target))break;return void sendCommandFromEvent("channeldown",e);case"ChannelDown":case"GamepadX":case"LowerChannel":case"XF86LowerChannel":if(handleMultiMediaKeys)return void sendCommandFromEvent("channeldown",e);break;case"MediaStepForward":case"MediaFastForward":case"FastFwd":case"GamepadRightTrigger":case"AudioNext":case"XF86AudioNext":if(handleMultiMediaKeys)return void sendCommandFromEvent("fastforward",e);break;case"Pause":case"MediaPause":case"AudioPause":case"XF86AudioPause":if(handleMultiMediaKeys)return void sendCommandFromEvent("pause",e);break;case"Play":case"MediaPlay":case"AudioPlay":case"XF86AudioPlay":if(handleMultiMediaKeys)return void sendCommandFromEvent("play",e);break;case"MediaPlayPause":case"PlayBack":case"XF86PlayBack":if(handleMultiMediaKeys)return void sendCommandFromEvent("playpause",e);break;case"MediaRecord":case"AudioRecord":case"XF86AudioRecord":if(handleMultiMediaKeys)return void sendCommandFromEvent("record",e);break;case"MediaStepBackward":case"MediaRewind":case"GamepadLeftTrigger":case"AudioRewind":case"XF86AudioRewind":if(handleMultiMediaKeys)return void sendCommandFromEvent("rewind",e);break;case"Stop":case"MediaStop":case"AudioStop":case"XF86AudioStop":case"XF86Stop":if(handleMultiMediaKeys)return void sendCommandFromEvent("stop",e);break;case"MediaTrackNext":case"MediaNextTrack":case"GamepadRightShoulder":if(handleMultiMediaKeys)return void sendCommandFromEvent("nextchapter",e);break;case"MediaTrackPrevious":case"MediaPreviousTrack":case"GamepadLeftShoulder":if(handleMultiMediaKeys)return void sendCommandFromEvent("previouschapter",e);break;case"AudioVolumeDown":case"VolumeDown":case"GamepadRightThumbStickLeft":case"GamepadRightThumbstickLeft":return void(IsBrowser||sendCommandFromEvent("volumedown",e));case"AudioVolumeUp":case"VolumeUp":case"GamepadRightThumbStickRight":case"GamepadRightThumbstickRight":return void(IsBrowser||sendCommandFromEvent("volumeup",e));case"AudioVolumeMute":case"VolumeMute":case"GamepadRightThumbStickButton":case"GamepadRightThumbstickButton":return void(IsBrowser||sendCommandFromEvent("togglemute",e));case"Red":case"XF86Red":case"ColorF0Red":return void sendCommandFromEvent("red",e);case"Green":case"XF86Green":case"ColorF1Green":return void sendCommandFromEvent("green",e);case"Yellow":case"XF86Yellow":case"ColorF2Yellow":return void sendCommandFromEvent("yellow",e);case"Blue":case"XF86Blue":case"ColorF3Blue":return void sendCommandFromEvent("blue",e);case"ColorF4Grey":return void sendCommandFromEvent("grey",e);case"ColorF5Brown":return void sendCommandFromEvent("brown",e);case"Caption":case"XF86Caption":case"ClosedCaptionToggle":return void sendCommandFromEvent("changesubtitletrack",e);case"Dimmer":return void sendCommandFromEvent("changebrightness",e);case"DVR":return void sendCommandFromEvent("guide",e);case"ChannelList":case"Guide":case"ChannelGuide":case"XF86ChannelGuide":case"GuideNextDay":case"GuidePreviousDay":return void sendCommandFromEvent("guide",e);case"Info":case"XF86Info":if(handleMultiMediaKeys)return void sendCommandFromEvent("info",e);break;case"InstantReplay":return void sendCommandFromEvent("rewind",e);case"LiveContent":return void sendCommandFromEvent("livetv",e);case"MediaAudioTrack":return void sendCommandFromEvent("changeaudiotrack",e);case"MediaLast":break;case"MediaSkipBackward":if(handleMultiMediaKeys)return void sendCommandFromEvent("previouschapter",e);break;case"MediaSkipForward":if(handleMultiMediaKeys)return void sendCommandFromEvent("nextchapter",e);break;case"MediaTopMenu":case"GamepadView":return void sendCommandFromEvent("home",e);case"NavigateNext":return void sendCommandFromEvent("next",e);case"NavigatePrevious":return void sendCommandFromEvent("previous",e);case"NextFavoriteChannel":return void sendCommandFromEvent("next",e);case"Settings":case"Tools":case"SimpleMenu":case"XF86SimpleMenu":return void sendCommandFromEvent("settings",e);case"Teletext":case"Subtitle":return void sendCommandFromEvent("changesubtitletrack",e);case"ZoomToggle":case"Zoom":case"PictureSize":case"XF86PictureSize":return void sendCommandFromEvent("changezoom",e);case"New":break;case"Save":return void sendCommandFromEvent("save",e);case"LaunchMusicPlayer":return void sendCommandFromEvent("music",e);case"LaunchScreenSaver":return void sendCommandFromEvent("screensaver",e);case"BrowserBack":if(handleMultiMediaKeys)return e.preventDefault(),void checkForLongPress(e,key,"home");break;case"BrowserFavorites":return void sendCommandFromEvent("favorites",e);case"BrowserForward":if(handleMultiMediaKeys)return void sendCommandFromEvent("forward",e);break;case"BrowserHome":if(handleMultiMediaKeys)return void sendCommandFromEvent("home",e);break;case"BrowserRefresh":if(handleMultiMediaKeys)return void sendCommandFromEvent("refresh",e);break;case"BrowserSearch":if(handleMultiMediaKeys)return void sendCommandFromEvent("search",e);break;case"BrowserStop":if(handleMultiMediaKeys)return void sendCommandFromEvent("stop",e);break;case"j":if(e.ctrlKey)return void sendCommandFromEvent("togglestats",e);break;case"g":if(e.ctrlKey)return void sendCommandFromEvent("guide",e);break;case"Add":case"Subtract":break;case"a":case"A":if(e.ctrlKey&&e.shiftKey)return void sendCommandFromEvent("changeaudiotrack",e);break;case"b":case"B":if(e.altKey&&!e.ctrlKey)return e.preventDefault(),void checkForLongPress(e,key,"home");break;case"d":case"D":if(e.ctrlKey)return void sendCommandFromEvent("menu",e);break;case"o":case"O":if(e.ctrlKey)return void sendCommandFromEvent("recordedtv",e);break;case"p":case"P":if(e.ctrlKey)return e.shiftKey?void sendCommandFromEvent("play",e):void sendCommandFromEvent("playpause",e);break;case"r":case"R":if(!IsBrowser&&e.ctrlKey)return void sendCommandFromEvent("record",e);break;case"s":case"S":if(e.ctrlKey)return e.shiftKey?void sendCommandFromEvent("stop",e):void sendCommandFromEvent("search",e);break;case"t":case"T":if(!IsBrowser&&e.ctrlKey)return void sendCommandFromEvent("livetv",e);break;case"u":case"U":if(e.ctrlKey)return void sendCommandFromEvent("changesubtitletrack",e);break;case"z":case"Z":if(e.ctrlKey&&e.shiftKey)return void sendCommandFromEvent("changezoom",e);break;case"Unidentified":if(e.resultKey=getKeyFromKeyCode(e.keyCode),e.resultKey)return onKeyDown(e);break;default:if(EnableSingleCharacterKeyWorkaround&&key&&1===key.length&&127<key.charCodeAt(0)&&(e.resultKey=getKeyFromKeyCode(e.keyCode),e.resultKey))return onKeyDown(e);EnableReadOnlyInputWorkaround&&handleAlphaNumInput(e)}notifyApp(e)}function onKeyUp(e){EnableRepeatWorkaround&&(repeatingKey=null,repeatKeyCount=0,lastRepeatingKeyTime=0);var wasLongPressed=repeatKeyLongPressed,target=(repeatKeyLongPressed=!1,repeatKeyFirstInputTime=0,e.target),lastKeyDownTarget=keyDownTarget;if(keyDownTarget=null,target===lastKeyDownTarget){let key=e.resultKey||e.key;switch(key=key||getKeyFromKeyCode(e.keyCode)){case"ArrowLeft":case"Left":case"NavigationLeft":case"GamepadDPadLeft":case"GamepadLeftThumbStickLeft":case"GamepadLeftThumbstickLeft":if(isNativeTizen&&"Left"===key)return;if(e.altKey)return e.preventDefault(),void(wasLongPressed||sendCommandFromEvent("back",e));break;case"Backspace":goBackOnBackspace&&!isEditable(target)&&(e.preventDefault(),wasLongPressed||sendCommandFromEvent("back",e));break;case"Escape":case"Esc":return void(e.shiftKey||e.altKey||e.ctrlKey||(wasLongPressed?e.preventDefault():sendCommandFromEvent("back",e)));case"Cancel":case"NavigationCancel":case"GamepadB":case"GamePadB":case"Exit":case"NavigateOut":case"Back":case"RCUBack":case"GoBack":case"XF86Back":return void(wasLongPressed?e.preventDefault():sendCommandFromEvent("back",e));case"GamepadA":case"GamePadA":return void onGamepadAKeyUp(e,wasLongPressed);case"Enter":return void(target.classList.contains("longpress")&&(wasLongPressed||sendCommandFromEvent("select",e),e.preventDefault()));case"BrowserBack":handleMultiMediaKeys&&(wasLongPressed?e.preventDefault():sendCommandFromEvent("back",e));break;case"b":case"B":e.altKey&&!e.ctrlKey&&(wasLongPressed?e.preventDefault():sendCommandFromEvent("back",e));break;case"Unidentified":if(e.resultKey=getKeyFromKeyCode(e.keyCode),e.resultKey)return keyDownTarget=lastKeyDownTarget,onKeyUp(e);break;default:if(EnableSingleCharacterKeyWorkaround&&key&&1===key.length&&127<key.charCodeAt(0)&&(e.resultKey=getKeyFromKeyCode(e.keyCode),e.resultKey))return keyDownTarget=lastKeyDownTarget,onKeyUp(e)}}}function normalizeKeyFromEvent(e){let key=e.key;switch(key=key||getKeyFromKeyCode(e.keyCode)){case"ArrowUp":case"Up":case"NavigationUp":case"GamepadDPadUp":case"GamepadLeftThumbstickUp":case"GamepadLeftThumbStickUp":return"ArrowUp";case"ArrowDown":case"Down":case"NavigationDown":case"GamepadDPadDown":case"GamepadLeftThumbstickDown":case"GamepadLeftThumbStickDown":return"ArrowDown";case"ArrowLeft":case"Left":case"NavigationLeft":case"GamepadDPadLeft":case"GamepadLeftThumbStickLeft":case"GamepadLeftThumbstickLeft":return e.shiftKey&&!isEditable(e.target)?"MediaRewind":"ArrowLeft";case"ArrowRight":case"Right":case"NavigationRight":case"GamepadDPadRight":case"GamepadLeftThumbStickRight":case"GamepadLeftThumbstickRight":return e.shiftKey&&!isEditable(e.target)?"MediaFastForward":"ArrowRight";case"Accept":case"NavigationAccept":case"NavigateIn":case"GamepadA":case"GamePadA":case"Open":case"Select":case"Execute":case"Link":case"Enter":return"Enter";case"BrowserBack":case"Close":case"Escape":case"Esc":case"Cancel":case"NavigationCancel":case"GamepadB":case"GamePadB":case"Exit":case"NavigateOut":case"Back":case"RCUBack":case"GoBack":case"XF86Back":return"Back";case"MediaStepBackward":case"MediaRewind":case"GamepadLeftTrigger":case"AudioRewind":case"XF86AudioRewind":case"InstantReplay":return"MediaRewind";case"MediaStepForward":case"MediaFastForward":case"FastFwd":case"GamepadRightTrigger":case"AudioNext":case"XF86AudioNext":return"MediaFastForward";case"Unidentified":var keyResult=getKeyFromKeyCode(e.keyCode);if(keyResult)return normalizeKeyFromEvent({key:keyResult});break;default:if(key&&1===key.length&&127<key.charCodeAt(0)){let keyResult=getKeyFromKeyCode(e.keyCode);if(keyResult)return normalizeKeyFromEvent({key:keyResult})}}return key}dom.addEventListener(window,"keydown",onKeyDown,{passive:!1}),dom.addEventListener(window,"keyup",onKeyUp,{passive:!1});export default{normalizeKeyFromEvent:normalizeKeyFromEvent};