mirror of
https://github.com/redphx/better-xcloud.git
synced 2025-06-15 03:53:04 +02:00
96 lines
3.6 KiB
TypeScript
96 lines
3.6 KiB
TypeScript
import { BxEvent } from "./bx-event";
|
|
import { STATES } from "./global";
|
|
import { getPref, PrefKey } from "./preferences";
|
|
import { UserAgent } from "./user-agent";
|
|
|
|
enum InputType {
|
|
CONTROLLER = 'Controller',
|
|
MKB = 'MKB',
|
|
CUSTOM_TOUCH_OVERLAY = 'CustomTouchOverlay',
|
|
GENERIC_TOUCH = 'GenericTouch',
|
|
NATIVE_TOUCH = 'NativeTouch',
|
|
BATIVE_SENSOR = 'NativeSensor',
|
|
}
|
|
|
|
export const BxExposed = {
|
|
onPollingModeChanged: (mode: 'All' | 'None') => {
|
|
if (!STATES.isPlaying) {
|
|
return false;
|
|
}
|
|
|
|
const $screenshotBtn = document.querySelector('.bx-screenshot-button');
|
|
const $touchControllerBar = document.getElementById('bx-touch-controller-bar');
|
|
|
|
if (mode !== 'None') {
|
|
// Hide screenshot button
|
|
$screenshotBtn && $screenshotBtn.classList.add('bx-gone');
|
|
|
|
// Hide touch controller bar
|
|
$touchControllerBar && $touchControllerBar.classList.add('bx-gone');
|
|
} else {
|
|
// Show screenshot button
|
|
$screenshotBtn && $screenshotBtn.classList.remove('bx-gone');
|
|
|
|
// Show touch controller bar
|
|
$touchControllerBar && $touchControllerBar.classList.remove('bx-gone');
|
|
}
|
|
},
|
|
|
|
getTitleInfo: () => STATES.currentStream.titleInfo,
|
|
|
|
modifyTitleInfo: (titleInfo: XcloudTitleInfo): XcloudTitleInfo => {
|
|
// Clone the object since the original is read-only
|
|
titleInfo = structuredClone(titleInfo);
|
|
|
|
if (STATES.hasTouchSupport) {
|
|
let touchControllerAvailability = getPref(PrefKey.STREAM_TOUCH_CONTROLLER);
|
|
let supportedInputTypes = titleInfo.details.supportedInputTypes;
|
|
|
|
// Disable touch control when gamepad found
|
|
if (touchControllerAvailability !== 'off' && getPref(PrefKey.STREAM_TOUCH_CONTROLLER_AUTO_OFF)) {
|
|
const gamepads = window.navigator.getGamepads();
|
|
let gamepadFound = false;
|
|
|
|
for (let gamepad of gamepads) {
|
|
if (gamepad && gamepad.connected) {
|
|
gamepadFound = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
gamepadFound && (touchControllerAvailability = 'off');
|
|
}
|
|
|
|
// Remove MKB support on mobile browsers
|
|
if (UserAgent.isMobile()) {
|
|
supportedInputTypes = supportedInputTypes.filter(i => i !== InputType.MKB);
|
|
}
|
|
|
|
if (touchControllerAvailability === 'off') {
|
|
// Disable touch on all games (not native touch)
|
|
supportedInputTypes = supportedInputTypes.filter(i => i !== InputType.CUSTOM_TOUCH_OVERLAY && i !== InputType.GENERIC_TOUCH);
|
|
}
|
|
|
|
// Pre-check supported input types
|
|
titleInfo.details.hasMkbSupport = supportedInputTypes.includes(InputType.MKB);
|
|
titleInfo.details.hasTouchSupport = supportedInputTypes.includes(InputType.NATIVE_TOUCH) &&
|
|
!supportedInputTypes.includes(InputType.CUSTOM_TOUCH_OVERLAY) &&
|
|
!supportedInputTypes.includes(InputType.GENERIC_TOUCH);
|
|
|
|
if (!titleInfo.details.hasTouchSupport && touchControllerAvailability === 'all') {
|
|
// Add generic touch support for non touch-supported games
|
|
titleInfo.details.hasFakeTouchSupport = true;
|
|
supportedInputTypes.push(InputType.GENERIC_TOUCH);
|
|
}
|
|
|
|
titleInfo.details.supportedInputTypes = supportedInputTypes;
|
|
}
|
|
|
|
// Save this info in STATES
|
|
STATES.currentStream.titleInfo = titleInfo;
|
|
BxEvent.dispatch(window, BxEvent.TITLE_INFO_READY);
|
|
|
|
return titleInfo;
|
|
}
|
|
};
|