diff --git a/dist/better-xcloud.user.js b/dist/better-xcloud.user.js index fa7f6ad..6778575 100644 --- a/dist/better-xcloud.user.js +++ b/dist/better-xcloud.user.js @@ -506,6 +506,7 @@ var Texts = { "clarity-boost-warning": "These settings don't work when the Clarity Boost mode is ON", clear: "Clear", close: "Close", + "close-ap": "Close app", "combine-audio-video-streams": "Combine audio & video streams", "combine-audio-video-streams-summary": "May fix the laggy audio problem", "conditional-formatting": "Conditional formatting text color", @@ -559,6 +560,7 @@ var Texts = { "hide-scrollbar": "Hide web page's scrollbar", "hide-system-menu-icon": "Hide System menu's icon", "hide-touch-controller": "Hide touch controller", + "horizontal-scroll-sensitivity": "Horizontal scroll sensitivity", "horizontal-sensitivity": "Horizontal sensitivity", ignore: "Ignore", import: "Import", @@ -579,6 +581,7 @@ var Texts = { "mkb-click-to-activate": "Click to activate", "mkb-disclaimer": "Using this feature when playing online could be viewed as cheating", "mouse-and-keyboard": "Mouse & Keyboard", + "mouse-wheel": "Mouse wheel", muted: "Muted", name: "Name", "native-mkb": "Native Mouse & Keyboard", @@ -601,11 +604,11 @@ var Texts = { "press-key-to-toggle-mkb": [ (e) => `Press ${e.key} to toggle this feature`, , + (e) => `${e.key}: Funktion an-/ausschalten`, , , , - , - , + (e) => `Premi ${e.key} per attivare questa funzionalità`, (e) => `${e.key} でこの機能を切替`, , , @@ -613,7 +616,7 @@ var Texts = { , , (e) => `Etkinleştirmek için ${e.key} tuşuna basın`, - , + (e) => `Натисніть ${e.key} щоб перемкнути цю функцію`, (e) => `Nhấn ${e.key} để bật/tắt tính năng này`, , ], @@ -716,6 +719,7 @@ var Texts = { unmuted: "Unmuted", "use-mouse-absolute-position": "Use mouse's absolute position", "user-agent-profile": "User-Agent profile", + "vertical-scroll-sensitivity": "Vertical scroll sensitivity", "vertical-sensitivity": "Vertical sensitivity", "vibration-intensity": "Vibration intensity", "vibration-status": "Vibration", @@ -1398,6 +1402,8 @@ var PrefKey; PrefKey2["CONTROLLER_DEVICE_VIBRATION"] = "controller_device_vibration"; PrefKey2["CONTROLLER_VIBRATION_INTENSITY"] = "controller_vibration_intensity"; PrefKey2["NATIVE_MKB_ENABLED"] = "native_mkb_enabled"; + PrefKey2["NATIVE_MKB_SCROLL_HORIZONTAL_SENSITIVITY"] = "native_mkb_scroll_x_sensitivity"; + PrefKey2["NATIVE_MKB_SCROLL_VERTICAL_SENSITIVITY"] = "native_mkb_scroll_y_sensitivity"; PrefKey2["MKB_ENABLED"] = "mkb_enabled"; PrefKey2["MKB_HIDE_IDLE_CURSOR"] = "mkb_hide_idle_cursor"; PrefKey2["MKB_ABSOLUTE_MOUSE"] = "mkb_absolute_mouse"; @@ -1662,7 +1668,6 @@ class Preferences { } else { return (value / 1024000).toFixed(1) + " Mb/s"; } - return null; } }, migrate: function(savedPrefs, value) { @@ -1765,6 +1770,40 @@ class Preferences { } } }, + [PrefKey.NATIVE_MKB_SCROLL_HORIZONTAL_SENSITIVITY]: { + label: t("horizontal-scroll-sensitivity"), + type: SettingElementType.NUMBER_STEPPER, + default: 0, + min: 0, + max: 1e4, + steps: 10, + params: { + exactTicks: 2000, + customTextValue: (value) => { + if (!value) { + return t("default"); + } + return (value / 100).toFixed(1) + "x"; + } + } + }, + [PrefKey.NATIVE_MKB_SCROLL_VERTICAL_SENSITIVITY]: { + label: t("vertical-scroll-sensitivity"), + type: SettingElementType.NUMBER_STEPPER, + default: 0, + min: 0, + max: 1e4, + steps: 10, + params: { + exactTicks: 2000, + customTextValue: (value) => { + if (!value) { + return t("default"); + } + return (value / 100).toFixed(1) + "x"; + } + } + }, [PrefKey.MKB_DEFAULT_PRESET_ID]: { default: 0 }, @@ -2338,11 +2377,8 @@ var display_default = "\n \n \n \n \n \n \n \n\n"; // src/assets/svg/new.svg var new_default = "\n \n\n"; @@ -2371,6 +2407,9 @@ var touch_control_enable_default = "\n \n \n \n \n \n \n \n \n\n"; + // src/assets/svg/caret-left.svg var caret_left_default = "\n \n\n"; @@ -2412,14 +2451,14 @@ var BxIcon = { CONTROLLER: controller_default, DISPLAY: display_default, HOME: home_default, - MOUSE: mouse_default, - MOUSE_SETTINGS: mouse_settings_default, + NATIVE_MKB: native_mkb_default, NEW: new_default, COPY: copy_default, TRASH: trash_default, CURSOR_TEXT: cursor_text_default, QUESTION: question_default, REFRESH: refresh_default, + VIRTUAL_CONTROLLER: virtual_controller_default, REMOTE_PLAY: remote_play_default, CARET_LEFT: caret_left_default, CARET_RIGHT: caret_right_default, @@ -3067,6 +3106,8 @@ class NativeMkbHandler extends MkbHandler { #mouseButtonsPressed = 0; #mouseWheelX = 0; #mouseWheelY = 0; + #mouseVerticalMultiply = 0; + #mouseHorizontalMultiply = 0; #inputSink; #$message; static getInstance() { @@ -3156,6 +3197,8 @@ class NativeMkbHandler extends MkbHandler { } catch (e) { Toast.show("Cannot enable Mouse & Keyboard feature"); } + this.#mouseVerticalMultiply = getPref(PrefKey.NATIVE_MKB_SCROLL_VERTICAL_SENSITIVITY); + this.#mouseHorizontalMultiply = getPref(PrefKey.NATIVE_MKB_SCROLL_HORIZONTAL_SENSITIVITY); window.addEventListener("keyup", this); window.addEventListener(BxEvent.XCLOUD_DIALOG_SHOWN, this); window.addEventListener(BxEvent.POINTER_LOCK_REQUESTED, this); @@ -3240,8 +3283,14 @@ class NativeMkbHandler extends MkbHandler { } handleMouseWheel(data) { const { vertical, horizontal } = data; - this.#mouseWheelX = horizontal * 50; - this.#mouseWheelY = vertical * 50; + this.#mouseWheelX = horizontal; + if (this.#mouseHorizontalMultiply && this.#mouseHorizontalMultiply !== 1) { + this.#mouseWheelX *= this.#mouseHorizontalMultiply; + } + this.#mouseWheelY = vertical; + if (this.#mouseVerticalMultiply && this.#mouseVerticalMultiply !== 1) { + this.#mouseWheelY *= this.#mouseVerticalMultiply; + } this.#sendMouseInput({ X: 0, Y: 0, @@ -3251,6 +3300,12 @@ class NativeMkbHandler extends MkbHandler { }); return true; } + setVerticalScrollMultiplier(vertical) { + this.#mouseVerticalMultiply = vertical; + } + setHorizontalScrollMultiplier(horizontal) { + this.#mouseHorizontalMultiply = horizontal; + } waitForMouseData(enabled) { } isEnabled() { @@ -3365,7 +3420,7 @@ class PointerLockMouseDataProvider extends MouseDataProvider { class EmulatedMkbHandler extends MkbHandler { static #instance; - static get INSTANCE() { + static getInstance() { if (!EmulatedMkbHandler.#instance) { EmulatedMkbHandler.#instance = new EmulatedMkbHandler; } @@ -3640,7 +3695,6 @@ class EmulatedMkbHandler extends MkbHandler { this.waitForMouseData(false); } }), createButton({ - icon: BxIcon.MOUSE_SETTINGS, label: t("edit"), onClick: (e) => { e.preventDefault(); @@ -3774,7 +3828,7 @@ class EmulatedMkbHandler extends MkbHandler { } } else if (getPref(PrefKey.MKB_ENABLED) && (AppInterface || !UserAgent.isMobile())) { BxLogger.info(LOG_TAG2, "Emulate MKB"); - EmulatedMkbHandler.INSTANCE.init(); + EmulatedMkbHandler.getInstance().init(); } }); } @@ -4653,7 +4707,7 @@ class MkbRemapper { this.#STATE.currentPresetId = parseInt(Object.keys(presets)[0]); defaultPresetId = this.#STATE.currentPresetId; setPref(PrefKey.MKB_DEFAULT_PRESET_ID, defaultPresetId); - EmulatedMkbHandler.INSTANCE.refreshPresetData(); + EmulatedMkbHandler.getInstance().refreshPresetData(); } else { defaultPresetId = getPref(PrefKey.MKB_DEFAULT_PRESET_ID); } @@ -4809,7 +4863,7 @@ class MkbRemapper { style: ButtonStyle.PRIMARY, onClick: (e) => { setPref(PrefKey.MKB_DEFAULT_PRESET_ID, this.#STATE.currentPresetId); - EmulatedMkbHandler.INSTANCE.refreshPresetData(); + EmulatedMkbHandler.getInstance().refreshPresetData(); this.#refresh(); } })), CE("div", {}, createButton({ @@ -4827,7 +4881,7 @@ class MkbRemapper { updatedPreset.data = this.#STATE.editingPresetData; LocalDb.INSTANCE.updatePreset(updatedPreset).then((id2) => { if (id2 === getPref(PrefKey.MKB_DEFAULT_PRESET_ID)) { - EmulatedMkbHandler.INSTANCE.refreshPresetData(); + EmulatedMkbHandler.getInstance().refreshPresetData(); } this.#toggleEditing(false); this.#refresh(); @@ -5228,18 +5282,6 @@ var getVideoPlayerFilterStyle = function() { var setupStreamSettingsDialog = function() { const isSafari = UserAgent.isSafari(); const SETTINGS_UI = [ - getPref(PrefKey.MKB_ENABLED) && { - icon: BxIcon.MOUSE, - group: "mkb", - items: [ - { - group: "mkb", - label: t("virtual-controller"), - help_url: "https://better-xcloud.github.io/mouse-and-keyboard/", - content: MkbRemapper.INSTANCE.render() - } - ] - }, { icon: BxIcon.DISPLAY, group: "stream", @@ -5375,6 +5417,42 @@ var setupStreamSettingsDialog = function() { } ] }, + getPref(PrefKey.MKB_ENABLED) && { + icon: BxIcon.VIRTUAL_CONTROLLER, + group: "mkb", + items: [ + { + group: "mkb", + label: t("virtual-controller"), + help_url: "https://better-xcloud.github.io/mouse-and-keyboard/", + content: MkbRemapper.INSTANCE.render() + } + ] + }, + AppInterface && getPref(PrefKey.NATIVE_MKB_ENABLED) === "on" && { + icon: BxIcon.NATIVE_MKB, + group: "native-mkb", + items: [ + { + group: "native-mkb", + label: t("native-mkb"), + items: [ + { + pref: PrefKey.NATIVE_MKB_SCROLL_VERTICAL_SENSITIVITY, + onChange: (e, value) => { + NativeMkbHandler.getInstance().setVerticalScrollMultiplier(value / 100); + } + }, + { + pref: PrefKey.NATIVE_MKB_SCROLL_HORIZONTAL_SENSITIVITY, + onChange: (e, value) => { + NativeMkbHandler.getInstance().setHorizontalScrollMultiplier(value / 100); + } + } + ] + } + ] + }, { icon: BxIcon.COMMAND, group: "shortcuts", @@ -9385,12 +9463,12 @@ var unload = function() { if (!STATES.isPlaying) { return; } + EmulatedMkbHandler.getInstance().destroy(); + NativeMkbHandler.getInstance().destroy(); STATES.isPlaying = false; STATES.currentStream = {}; window.BX_EXPOSED.shouldShowSensorControls = false; window.BX_EXPOSED.stopTakRendering = false; - EmulatedMkbHandler.INSTANCE.destroy(); - NativeMkbHandler.getInstance().destroy(); const $streamSettingsDialog = document.querySelector(".bx-stream-settings-dialog"); if ($streamSettingsDialog) { $streamSettingsDialog.classList.add("bx-gone"); @@ -9578,7 +9656,9 @@ window.addEventListener(BxEvent.STREAM_ERROR_PAGE, (e) => { BxEvent.dispatch(window, BxEvent.STREAM_STOPPED); }); window.addEventListener(BxEvent.STREAM_STOPPED, unload); -window.addEventListener("beforeunload", unload); +window.addEventListener("pagehide", (e) => { + BxEvent.dispatch(window, BxEvent.STREAM_STOPPED); +}); window.addEventListener(BxEvent.CAPTURE_SCREENSHOT, (e) => { Screenshot.takeScreenshot(); });