diff --git a/src/enums/shortcut-actions.ts b/src/enums/shortcut-actions.ts index fde7f99..7c7cfb7 100755 --- a/src/enums/shortcut-actions.ts +++ b/src/enums/shortcut-actions.ts @@ -1,6 +1,8 @@ export const enum ShortcutAction { BETTER_XCLOUD_SETTINGS_SHOW = 'bx.settings.show', + CONTROLLER_XBOX_BUTTON_PRESS = 'controller.xbox.press', + STREAM_VIDEO_TOGGLE = 'stream.video.toggle', STREAM_SCREENSHOT_CAPTURE = 'stream.screenshot.capture', diff --git a/src/modules/shortcuts/shortcut-actions.ts b/src/modules/shortcuts/shortcut-actions.ts index ea0d8d4..4541804 100755 --- a/src/modules/shortcuts/shortcut-actions.ts +++ b/src/modules/shortcuts/shortcut-actions.ts @@ -16,6 +16,17 @@ export const SHORTCUT_ACTIONS: ShortcutActions = { [ShortcutAction.BETTER_XCLOUD_SETTINGS_SHOW]: [t('settings'), t('show')], }, + // MKB + ...(STATES.browser.capabilities.mkb ? { + [t('mouse-and-keyboard')]: { + [ShortcutAction.MKB_TOGGLE]: [t('toggle')], + }, + } : {}), + + [t('controller')]: { + [ShortcutAction.CONTROLLER_XBOX_BUTTON_PRESS]: [t('button-xbox'), t('press')], + }, + // Device ...(!!AppInterface ? { [t('device')]: { @@ -45,13 +56,6 @@ export const SHORTCUT_ACTIONS: ShortcutActions = { [ShortcutAction.STREAM_MICROPHONE_TOGGLE]: [t('microphone'), t('toggle')], }, - // MKB - ...(STATES.browser.capabilities.mkb ? { - [t('mouse-and-keyboard')]: { - [ShortcutAction.MKB_TOGGLE]: [t('toggle')], - }, - } : {}), - // Other [t('other')]: { [ShortcutAction.TRUE_ACHIEVEMENTS_OPEN]: [t('true-achievements'), t('show')], diff --git a/src/modules/shortcuts/virtual-controller-shortcut.ts b/src/modules/shortcuts/virtual-controller-shortcut.ts new file mode 100644 index 0000000..ed1ca73 --- /dev/null +++ b/src/modules/shortcuts/virtual-controller-shortcut.ts @@ -0,0 +1,21 @@ +import { generateVirtualControllerMapping } from "@/utils/gamepad"; + +export class VirtualControllerShortcut { + static pressXboxButton(): void { + const streamSession = window.BX_EXPOSED.streamSession; + if (!streamSession) { + return; + } + + const released = generateVirtualControllerMapping(); + const pressed = generateVirtualControllerMapping({ + Nexus: 1, + VirtualPhysicality: 1024, // Home + }); + + streamSession.onVirtualGamepadInput('systemMenu', performance.now(), [pressed]); + setTimeout(() => { + streamSession.onVirtualGamepadInput('systemMenu', performance.now(), [released]); + }, 100); + } +} diff --git a/src/utils/gamepad.ts b/src/utils/gamepad.ts index ec44a56..3f46a67 100755 --- a/src/utils/gamepad.ts +++ b/src/utils/gamepad.ts @@ -57,3 +57,36 @@ export function hasGamepad() { return false; } + +export function generateVirtualControllerMapping(override: {}={}) { + const mapping = { + GamepadIndex: 0, + A: 0, + B: 0, + X: 0, + Y: 0, + LeftShoulder: 0, + RightShoulder: 0, + LeftTrigger: 0, + RightTrigger: 0, + View: 0, + Menu: 0, + LeftThumb: 0, + RightThumb: 0, + DPadUp: 0, + DPadDown: 0, + DPadLeft: 0, + DPadRight: 0, + Nexus: 0, + LeftThumbXAxis: 0, + LeftThumbYAxis: 0, + RightThumbXAxis: 0, + RightThumbYAxis: 0, + PhysicalPhysicality: 0, + VirtualPhysicality: 0, + Dirty: false, + Virtual: false, + }; + + return Object.assign({}, mapping, override); +} diff --git a/src/utils/shortcut-handler.ts b/src/utils/shortcut-handler.ts index 6cfe966..4529db1 100755 --- a/src/utils/shortcut-handler.ts +++ b/src/utils/shortcut-handler.ts @@ -10,6 +10,7 @@ import { EmulatedMkbHandler } from "@/modules/mkb/mkb-handler"; import { RendererShortcut } from "@/modules/shortcuts/renderer-shortcut"; import { TrueAchievements } from "./true-achievements"; import { NativeMkbHandler } from "@/modules/mkb/native-mkb-handler"; +import { VirtualControllerShortcut } from "@/modules/shortcuts/virtual-controller-shortcut"; export class ShortcutHandler { static runAction(action: ShortcutAction) { @@ -69,6 +70,10 @@ export class ShortcutHandler { case ShortcutAction.TRUE_ACHIEVEMENTS_OPEN: TrueAchievements.getInstance().open(false); break; + + case ShortcutAction.CONTROLLER_XBOX_BUTTON_PRESS: + VirtualControllerShortcut.pressXboxButton(); + break; } } } diff --git a/src/utils/translation.ts b/src/utils/translation.ts index 3c1ff08..9b167cd 100755 --- a/src/utils/translation.ts +++ b/src/utils/translation.ts @@ -27,6 +27,8 @@ export const SUPPORTED_LANGUAGES = { }; const Texts = { + "button-xbox": "Xbox button", + "press": "Press", "activate": "Activate", "activated": "Activated", "active": "Active",