Update better-xcloud.user.js

This commit is contained in:
redphx
2024-06-05 21:37:38 +07:00
committed by GitHub
parent e8e37aa575
commit fb1ce5306d

View File

@@ -3099,6 +3099,9 @@ class NativeMkbHandler extends MkbHandler {
this.#$message.classList.add("bx-offscreen"); this.#$message.classList.add("bx-offscreen");
} }
}; };
#onDialogShown = () => {
document.pointerLockElement && document.exitPointerLock();
};
#initMessage() { #initMessage() {
if (!this.#$message) { if (!this.#$message) {
this.#$message = CE("div", { class: "bx-mkb-pointer-lock-msg" }, CE("div", {}, CE("p", {}, t("native-mkb")), CE("p", {}, t("press-key-to-toggle-mkb", { key: "F8" }))), CE("div", { "data-type": "native" }, createButton({ this.#$message = CE("div", { class: "bx-mkb-pointer-lock-msg" }, CE("div", {}, CE("p", {}, t("native-mkb")), CE("p", {}, t("press-key-to-toggle-mkb", { key: "F8" }))), CE("div", { "data-type": "native" }, createButton({
@@ -3127,6 +3130,7 @@ class NativeMkbHandler extends MkbHandler {
this.#pointerClient = PointerClient.getInstance(); this.#pointerClient = PointerClient.getInstance();
this.#connected = false; this.#connected = false;
this.#inputSink = window.BX_EXPOSED.inputSink; this.#inputSink = window.BX_EXPOSED.inputSink;
this.#updateInputConfigurationAsync(false);
try { try {
this.#pointerClient.start(this); this.#pointerClient.start(this);
this.#connected = true; this.#connected = true;
@@ -3134,6 +3138,7 @@ class NativeMkbHandler extends MkbHandler {
Toast.show("Cannot enable Mouse & Keyboard feature"); Toast.show("Cannot enable Mouse & Keyboard feature");
} }
window.addEventListener("keyup", this.#onKeyboardEvent.bind(this)); window.addEventListener("keyup", this.#onKeyboardEvent.bind(this));
window.addEventListener(BxEvent.XCLOUD_DIALOG_SHOWN, this.#onDialogShown.bind(this));
window.addEventListener(BxEvent.POINTER_LOCK_REQUESTED, this.#onPointerLockRequested.bind(this)); window.addEventListener(BxEvent.POINTER_LOCK_REQUESTED, this.#onPointerLockRequested.bind(this));
window.addEventListener(BxEvent.POINTER_LOCK_EXITED, this.#onPointerLockExited.bind(this)); window.addEventListener(BxEvent.POINTER_LOCK_EXITED, this.#onPointerLockExited.bind(this));
window.addEventListener(BxEvent.XCLOUD_POLLING_MODE_CHANGED, this.#onPollingModeChanged); window.addEventListener(BxEvent.XCLOUD_POLLING_MODE_CHANGED, this.#onPollingModeChanged);
@@ -3153,32 +3158,30 @@ class NativeMkbHandler extends MkbHandler {
setEnable = !this.#enabled; setEnable = !this.#enabled;
} }
if (setEnable) { if (setEnable) {
document.body.requestPointerLock(); document.documentElement.requestPointerLock();
Toast.show(t("native-mkb"), t("enabled"), { instant: true });
} else { } else {
document.exitPointerLock(); document.exitPointerLock();
Toast.show(t("native-mkb"), t("disabled"), { instant: true });
} }
} }
#updateInputConfigurationAsync(enabled) {
window.BX_EXPOSED.streamSession.updateInputConfigurationAsync({
enableKeyboardInput: enabled,
enableMouseInput: enabled,
enableTouchInput: false
});
}
start() { start() {
this.#resetMouseInput(); this.#resetMouseInput();
this.#enabled = true; this.#enabled = true;
window.BX_EXPOSED.streamSession.updateInputConfigurationAsync({ this.#updateInputConfigurationAsync(true);
enableKeyboardInput: true,
enableMouseInput: true,
enableTouchInput: false
});
window.BX_EXPOSED.stopTakRendering = true; window.BX_EXPOSED.stopTakRendering = true;
this.#$message?.classList.add("bx-gone"); this.#$message?.classList.add("bx-gone");
Toast.show(t("native-mkb"), t("enabled"), { instant: true });
} }
stop() { stop() {
this.#resetMouseInput(); this.#resetMouseInput();
this.#enabled = false; this.#enabled = false;
window.BX_EXPOSED.streamSession.updateInputConfigurationAsync({ this.#updateInputConfigurationAsync(false);
enableKeyboardInput: false,
enableMouseInput: false,
enableTouchInput: false
});
this.#$message?.classList.remove("bx-gone"); this.#$message?.classList.remove("bx-gone");
} }
destroy() { destroy() {
@@ -3186,6 +3189,7 @@ class NativeMkbHandler extends MkbHandler {
window.removeEventListener(BxEvent.POINTER_LOCK_REQUESTED, this.#onPointerLockRequested); window.removeEventListener(BxEvent.POINTER_LOCK_REQUESTED, this.#onPointerLockRequested);
window.removeEventListener(BxEvent.POINTER_LOCK_EXITED, this.#onPointerLockExited); window.removeEventListener(BxEvent.POINTER_LOCK_EXITED, this.#onPointerLockExited);
window.removeEventListener(BxEvent.XCLOUD_POLLING_MODE_CHANGED, this.#onPollingModeChanged); window.removeEventListener(BxEvent.XCLOUD_POLLING_MODE_CHANGED, this.#onPollingModeChanged);
window.removeEventListener(BxEvent.XCLOUD_DIALOG_SHOWN, this.#onDialogShown);
this.#$message?.classList.add("bx-gone"); this.#$message?.classList.add("bx-gone");
this.#connected && this.#pointerClient?.stop(); this.#connected && this.#pointerClient?.stop();
} }
@@ -3272,13 +3276,6 @@ class WebSocketMouseDataProvider extends MouseDataProvider {
destroy() { destroy() {
this.#connected && this.#pointerClient?.stop(); this.#connected && this.#pointerClient?.stop();
} }
toggle(enabled) {
if (!this.#connected) {
enabled = false;
}
enabled ? this.mkbHandler.start() : this.mkbHandler.stop();
this.mkbHandler.waitForMouseData(!enabled);
}
} }
class PointerLockMouseDataProvider extends MouseDataProvider { class PointerLockMouseDataProvider extends MouseDataProvider {
@@ -3286,13 +3283,8 @@ class PointerLockMouseDataProvider extends MouseDataProvider {
super(...arguments); super(...arguments);
} }
init() { init() {
document.addEventListener("pointerlockchange", this.#onPointerLockChange);
document.addEventListener("pointerlockerror", this.#onPointerLockError);
} }
start() { start() {
if (!document.pointerLockElement) {
document.body.requestPointerLock();
}
window.addEventListener("mousemove", this.#onMouseMoveEvent); window.addEventListener("mousemove", this.#onMouseMoveEvent);
window.addEventListener("mousedown", this.#onMouseEvent); window.addEventListener("mousedown", this.#onMouseEvent);
window.addEventListener("mouseup", this.#onMouseEvent); window.addEventListener("mouseup", this.#onMouseEvent);
@@ -3308,22 +3300,7 @@ class PointerLockMouseDataProvider extends MouseDataProvider {
window.removeEventListener("contextmenu", this.#disableContextMenu); window.removeEventListener("contextmenu", this.#disableContextMenu);
} }
destroy() { destroy() {
document.removeEventListener("pointerlockchange", this.#onPointerLockChange);
document.removeEventListener("pointerlockerror", this.#onPointerLockError);
} }
toggle(enabled) {
enabled ? this.mkbHandler.start() : this.mkbHandler.stop();
this.mkbHandler.waitForMouseData(!enabled);
}
#onPointerLockChange = () => {
if (this.mkbHandler.isEnabled() && !document.pointerLockElement) {
this.mkbHandler.stop();
}
};
#onPointerLockError = (e) => {
console.log(e);
this.stop();
};
#onMouseMoveEvent = (e) => { #onMouseMoveEvent = (e) => {
this.mkbHandler.handleMouseMove({ this.mkbHandler.handleMouseMove({
movementX: e.movementX, movementX: e.movementX,
@@ -3575,8 +3552,11 @@ class EmulatedMkbHandler extends MkbHandler {
} else { } else {
this.#enabled = !this.#enabled; this.#enabled = !this.#enabled;
} }
Toast.show(t("virtual-controller"), t(this.#enabled ? "enabled" : "disabled"), { instant: true }); if (this.#enabled) {
this.#mouseDataProvider?.toggle(this.#enabled); document.body.requestPointerLock();
} else {
document.pointerLockElement && document.exitPointerLock();
}
}; };
#getCurrentPreset = () => { #getCurrentPreset = () => {
return new Promise((resolve) => { return new Promise((resolve) => {
@@ -3606,6 +3586,9 @@ class EmulatedMkbHandler extends MkbHandler {
this.#$message.classList.add("bx-offscreen"); this.#$message.classList.add("bx-offscreen");
} }
}; };
#onDialogShown = () => {
document.pointerLockElement && document.exitPointerLock();
};
#initMessage = () => { #initMessage = () => {
if (!this.#$message) { if (!this.#$message) {
this.#$message = CE("div", { class: "bx-mkb-pointer-lock-msg bx-gone" }, CE("div", {}, CE("p", {}, t("virtual-controller")), CE("p", {}, t("press-key-to-toggle-mkb", { key: "F8" }))), CE("div", { "data-type": "virtual" }, createButton({ this.#$message = CE("div", { class: "bx-mkb-pointer-lock-msg bx-gone" }, CE("div", {}, CE("p", {}, t("virtual-controller")), CE("p", {}, t("press-key-to-toggle-mkb", { key: "F8" }))), CE("div", { "data-type": "virtual" }, createButton({
@@ -3614,7 +3597,7 @@ class EmulatedMkbHandler extends MkbHandler {
onClick: ((e) => { onClick: ((e) => {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
this.start(); this.toggle(true);
}).bind(this) }).bind(this)
}), CE("div", {}, createButton({ }), CE("div", {}, createButton({
label: t("ignore"), label: t("ignore"),
@@ -3639,6 +3622,23 @@ class EmulatedMkbHandler extends MkbHandler {
document.documentElement.appendChild(this.#$message); document.documentElement.appendChild(this.#$message);
} }
}; };
#onPointerLockChange = () => {
if (document.pointerLockElement) {
this.start();
} else {
this.stop();
}
};
#onPointerLockError = (e) => {
console.log(e);
this.stop();
};
#onPointerLockRequested = () => {
this.start();
};
#onPointerLockExited = () => {
this.#mouseDataProvider?.stop();
};
init = () => { init = () => {
this.refreshPresetData(); this.refreshPresetData();
this.#enabled = false; this.#enabled = false;
@@ -3651,6 +3651,14 @@ class EmulatedMkbHandler extends MkbHandler {
window.addEventListener("keydown", this.#onKeyboardEvent); window.addEventListener("keydown", this.#onKeyboardEvent);
window.addEventListener("keyup", this.#onKeyboardEvent); window.addEventListener("keyup", this.#onKeyboardEvent);
window.addEventListener(BxEvent.XCLOUD_POLLING_MODE_CHANGED, this.#onPollingModeChanged); window.addEventListener(BxEvent.XCLOUD_POLLING_MODE_CHANGED, this.#onPollingModeChanged);
window.addEventListener(BxEvent.XCLOUD_DIALOG_SHOWN, this.#onDialogShown);
if (AppInterface) {
window.addEventListener(BxEvent.POINTER_LOCK_REQUESTED, this.#onPointerLockRequested.bind(this));
window.addEventListener(BxEvent.POINTER_LOCK_EXITED, this.#onPointerLockExited.bind(this));
} else {
document.addEventListener("pointerlockchange", this.#onPointerLockChange);
document.addEventListener("pointerlockerror", this.#onPointerLockError);
}
this.#initMessage(); this.#initMessage();
this.#$message?.classList.add("bx-gone"); this.#$message?.classList.add("bx-gone");
if (AppInterface) { if (AppInterface) {
@@ -3668,6 +3676,15 @@ class EmulatedMkbHandler extends MkbHandler {
document.pointerLockElement && document.exitPointerLock(); document.pointerLockElement && document.exitPointerLock();
window.removeEventListener("keydown", this.#onKeyboardEvent); window.removeEventListener("keydown", this.#onKeyboardEvent);
window.removeEventListener("keyup", this.#onKeyboardEvent); window.removeEventListener("keyup", this.#onKeyboardEvent);
if (AppInterface) {
window.removeEventListener(BxEvent.POINTER_LOCK_REQUESTED, this.#onPointerLockRequested.bind(this));
window.removeEventListener(BxEvent.POINTER_LOCK_EXITED, this.#onPointerLockExited.bind(this));
} else {
document.removeEventListener("pointerlockchange", this.#onPointerLockChange);
document.removeEventListener("pointerlockerror", this.#onPointerLockError);
}
window.removeEventListener(BxEvent.XCLOUD_POLLING_MODE_CHANGED, this.#onPollingModeChanged);
window.removeEventListener(BxEvent.XCLOUD_DIALOG_SHOWN, this.#onDialogShown);
this.#mouseDataProvider?.destroy(); this.#mouseDataProvider?.destroy();
window.removeEventListener(BxEvent.XCLOUD_POLLING_MODE_CHANGED, this.#onPollingModeChanged); window.removeEventListener(BxEvent.XCLOUD_POLLING_MODE_CHANGED, this.#onPollingModeChanged);
}; };
@@ -3689,19 +3706,22 @@ class EmulatedMkbHandler extends MkbHandler {
gamepad: virtualGamepad gamepad: virtualGamepad
}); });
window.BX_EXPOSED.stopTakRendering = true; window.BX_EXPOSED.stopTakRendering = true;
Toast.show(t("virtual-controller"), t("enabled"), { instant: true });
}; };
stop = () => { stop = () => {
this.#enabled = false; this.#enabled = false;
this.#isPolling = false; this.#isPolling = false;
this.#escKeyDownTime = -1; this.#escKeyDownTime = -1;
this.#resetGamepad();
const virtualGamepad = this.#getVirtualGamepad(); const virtualGamepad = this.#getVirtualGamepad();
virtualGamepad.connected = false; if (virtualGamepad.connected) {
virtualGamepad.timestamp = performance.now(); this.#resetGamepad();
BxEvent.dispatch(window, "gamepaddisconnected", { virtualGamepad.connected = false;
gamepad: virtualGamepad virtualGamepad.timestamp = performance.now();
}); BxEvent.dispatch(window, "gamepaddisconnected", {
window.navigator.getGamepads = this.#nativeGetGamepads; gamepad: virtualGamepad
});
window.navigator.getGamepads = this.#nativeGetGamepads;
}
this.waitForMouseData(true); this.waitForMouseData(true);
this.#mouseDataProvider?.stop(); this.#mouseDataProvider?.stop();
}; };
@@ -9097,13 +9117,22 @@ function patchPointerLockApi() {
HTMLElement.prototype.requestFullscreen = function(options) { HTMLElement.prototype.requestFullscreen = function(options) {
return Promise.resolve(); return Promise.resolve();
}; };
let pointerLockElement = null;
Object.defineProperty(document, "pointerLockElement", {
configurable: true,
get() {
return pointerLockElement;
}
});
const nativeRequestPointerLock = HTMLElement.prototype.requestPointerLock; const nativeRequestPointerLock = HTMLElement.prototype.requestPointerLock;
HTMLElement.prototype.requestPointerLock = function() { HTMLElement.prototype.requestPointerLock = function() {
pointerLockElement = document.documentElement;
window.dispatchEvent(new Event(BxEvent.POINTER_LOCK_REQUESTED)); window.dispatchEvent(new Event(BxEvent.POINTER_LOCK_REQUESTED));
nativeRequestPointerLock.apply(this, arguments); nativeRequestPointerLock.apply(this, arguments);
}; };
const nativeExitPointerLock = Document.prototype.exitPointerLock; const nativeExitPointerLock = Document.prototype.exitPointerLock;
Document.prototype.exitPointerLock = function() { Document.prototype.exitPointerLock = function() {
pointerLockElement = null;
window.dispatchEvent(new Event(BxEvent.POINTER_LOCK_EXITED)); window.dispatchEvent(new Event(BxEvent.POINTER_LOCK_EXITED));
nativeExitPointerLock.apply(this); nativeExitPointerLock.apply(this);
}; };
@@ -9371,7 +9400,7 @@ var main = function() {
interceptHttpRequests(); interceptHttpRequests();
patchVideoApi(); patchVideoApi();
patchCanvasContext(); patchCanvasContext();
getPref(PrefKey.NATIVE_MKB_ENABLED) === "on" && patchPointerLockApi(); AppInterface && patchPointerLockApi();
getPref(PrefKey.AUDIO_ENABLE_VOLUME_CONTROL) && patchAudioContext(); getPref(PrefKey.AUDIO_ENABLE_VOLUME_CONTROL) && patchAudioContext();
getPref(PrefKey.BLOCK_TRACKING) && patchMeControl(); getPref(PrefKey.BLOCK_TRACKING) && patchMeControl();
STATES.hasTouchSupport && TouchController.updateCustomList(); STATES.hasTouchSupport && TouchController.updateCustomList();