Add "Xbox button > Press" shortcut

This commit is contained in:
redphx 2024-12-09 17:42:11 +07:00
parent 7206c9e8bc
commit 5381575048
6 changed files with 74 additions and 7 deletions

View File

@ -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',

View File

@ -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')],

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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;
}
}
}

View File

@ -27,6 +27,8 @@ export const SUPPORTED_LANGUAGES = {
};
const Texts = {
"button-xbox": "Xbox button",
"press": "Press",
"activate": "Activate",
"activated": "Activated",
"active": "Active",