From e02dabdc2cb2e18eddcb252ad49bded00da5a4a7 Mon Sep 17 00:00:00 2001 From: wheaney <42350981+wheaney@users.noreply.github.com> Date: Wed, 19 Feb 2025 09:58:02 -0800 Subject: [PATCH] Add automatic recenter on effect start, fix banner case, update XRDriverIPC, fix how we write to the control flags file so it's atomic --- .gitmodules | 1 + gnome/src/devicedatastream.js | 6 ++--- gnome/src/extension.js | 45 ++++++++++++++++++++++--------- gnome/src/virtualmonitorsactor.js | 6 ++--- modules/XRLinuxDriver | 2 +- ui/modules/PyXRLinuxDriverIPC | 2 +- 6 files changed, 41 insertions(+), 21 deletions(-) diff --git a/.gitmodules b/.gitmodules index e7a2906..32df75b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -11,3 +11,4 @@ [submodule "ui/modules/PyXRLinuxDriverIPC"] path = ui/modules/PyXRLinuxDriverIPC url = https://github.com/wheaney/PyXRLinuxDriverIPC.git + branch = v1.1 diff --git a/gnome/src/devicedatastream.js b/gnome/src/devicedatastream.js index fe6085c..66b8725 100644 --- a/gnome/src/devicedatastream.js +++ b/gnome/src/devicedatastream.js @@ -177,11 +177,11 @@ export const DeviceDataStream = GObject.registerClass({ if (dataView.byteLength === DATA_VIEW_LENGTH) { let imuDateMs = dataViewBigUint(dataView, EPOCH_MS); const validKeepalive = isValidKeepAlive(toSec(imuDateMs)); - let imuData = dataViewFloatArray(dataView, IMU_QUAT_DATA); - const imuResetState = validKeepalive && imuData[0] === 0.0 && imuData[1] === 0.0 && imuData[2] === 0.0 && imuData[3] === 1.0; - const customBannerEnabled = dataViewUint8(dataView, CUSTOM_BANNER_ENABLED) !== 0; const version = dataViewUint8(dataView, VERSION); const enabled = dataViewUint8(dataView, ENABLED) !== 0 && version === DATA_LAYOUT_VERSION && validKeepalive; + let imuData = dataViewFloatArray(dataView, IMU_QUAT_DATA); + const imuResetState = enabled && validKeepalive && imuData[0] === 0.0 && imuData[1] === 0.0 && imuData[2] === 0.0 && imuData[3] === 1.0; + const customBannerEnabled = dataViewUint8(dataView, CUSTOM_BANNER_ENABLED) !== 0; const sbsEnabled = dataViewUint8(dataView, SBS_ENABLED) !== 0; // trigger "notify::" events for properties we want to check on every cycle diff --git a/gnome/src/extension.js b/gnome/src/extension.js index 0972ee9..b762ee9 100644 --- a/gnome/src/extension.js +++ b/gnome/src/extension.js @@ -49,6 +49,7 @@ export default class BreezyDesktopExtension extends Extension { this._is_effect_running = false; this._distance_binding = null; this._show_banner_binding = null; + this._show_banner_connection = null; this._custom_banner_enabled_binding = null; this._monitor_wrapping_scheme_binding = null; this._viewport_offset_x_binding = null; @@ -253,7 +254,7 @@ export default class BreezyDesktopExtension extends Extension { this._cursor_manager.enable(); // use rgba(255, 4, 144, 1) for chroma key background - this._overlay = new St.Bin({ style: 'background-color: rgba(0, 0, 0, 1);', reactive: false, clip_to_allocation: true }); + this._overlay = new St.Bin({ style: 'background-color: rgba(0, 0, 0, 1);', clip_to_allocation: true }); this._overlay.opacity = 255; this._overlay.set_position(targetMonitor.x, targetMonitor.y); this._overlay.set_size(targetMonitor.width, targetMonitor.height); @@ -275,8 +276,7 @@ export default class BreezyDesktopExtension extends Extension { framerate_cap: this.settings.get_double('framerate-cap'), imu_snapshots: Globals.data_stream.imu_snapshots, show_banner: Globals.data_stream.show_banner, - custom_banner_enabled: Globals.data_stream.custom_banner_enabled, - reactive: false, + custom_banner_enabled: Globals.data_stream.custom_banner_enabled }); this._overlay.set_child(this._overlay_content); @@ -305,6 +305,11 @@ export default class BreezyDesktopExtension extends Extension { // this._widescreen_mode_effect_state_connection = this._xr_effect.connect('notify::widescreen-mode-state', this._update_widescreen_mode_from_state.bind(this)); this._show_banner_binding = Globals.data_stream.bind_property('show-banner', this._overlay_content, 'show-banner', Gio.SettingsBindFlags.DEFAULT); + this._show_banner_connection = Globals.data_stream.connect('notify::show-banner', this._handle_show_banner_update.bind(this)); + this._was_show_banner = Globals.data_stream.show_banner; + Globals.logger.log_debug(`BreezyDesktopExtension _effect_enable - show_banner: ${this._was_show_banner}`); + if (!this._was_show_banner) this._recenter_display(); + this._custom_banner_enabled_binding = Globals.data_stream.bind_property('custom-banner-enabled', this._overlay_content, 'custom-banner-enabled', Gio.SettingsBindFlags.DEFAULT); this._monitor_wrapping_scheme_binding = this.settings.bind('monitor-wrapping-scheme', this._overlay_content, 'monitor-wrapping-scheme', Gio.SettingsBindFlags.DEFAULT); @@ -378,10 +383,15 @@ export default class BreezyDesktopExtension extends Extension { _write_control(key, value) { try { - const file = Gio.file_new_for_path('/dev/shm/xr_driver_control'); - const stream = file.replace(null, false, Gio.FileCreateFlags.NONE, null); - stream.write(`${key}=${value}`, null); - stream.close(null); + Globals.logger.log_debug(`BreezyDesktopExtension _write_control ${key} ${value}`); + let proc = Gio.Subprocess.new( + ['bash', '-c', `echo "${key}=${value}" > /dev/shm/xr_driver_control`], + Gio.SubprocessFlags.STDOUT_PIPE | Gio.SubprocessFlags.STDERR_PIPE + ); + + let [success, stdout, stderr] = proc.communicate_utf8(null, null); + if (!success || !!stderr) + throw new Error(`Failed to write control: ${stderr}`); } catch (e) { Globals.logger.log(`[ERROR] BreezyDesktopExtension _write_control ${e.message}\n${e.stack}`); } @@ -489,15 +499,22 @@ export default class BreezyDesktopExtension extends Extension { this._setup(); } - _handle_breezy_desktop_running_change(effect, _pspec) { - Globals.logger.log_debug(`BreezyDesktopExtension _handle_breezy_desktop_running_change ${effect.breezy_desktop_running}`); + _handle_breezy_desktop_running_change(datastream, _pspec) { + Globals.logger.log_debug(`BreezyDesktopExtension _handle_breezy_desktop_running_change ${datastream.breezy_desktop_running}`); - if (effect.breezy_desktop_running !== this._is_effect_running) { - if (!effect.breezy_desktop_running) Globals.logger.log('Breezy desktop disabled'); - this._setup(!effect.breezy_desktop_running); + if (datastream.breezy_desktop_running !== this._is_effect_running) { + if (!datastream.breezy_desktop_running) Globals.logger.log('Breezy desktop disabled'); + this._setup(!datastream.breezy_desktop_running); } } + _handle_show_banner_update(datastream, _pspec) { + Globals.logger.log_debug(`BreezyDesktopExtension _handle_show_banner_update ${datastream.show_banner}`); + if (this._was_show_banner && !datastream.show_banner) this._recenter_display(); + + this._was_show_banner = datastream.show_banner; + } + _toggle_xr_effect() { if (!this._cli_file) return; @@ -582,6 +599,10 @@ export default class BreezyDesktopExtension extends Extension { this._show_banner_binding.unbind(); this._show_banner_binding = null; } + if (this._show_banner_connection) { + Globals.data_stream.disconnect(this._show_banner_connection); + this._show_banner_connection = null; + } if (this._custom_banner_enabled_binding) { this._custom_banner_enabled_binding.unbind(); this._custom_banner_enabled_binding = null; diff --git a/gnome/src/virtualmonitorsactor.js b/gnome/src/virtualmonitorsactor.js index 223cc63..0635d5c 100644 --- a/gnome/src/virtualmonitorsactor.js +++ b/gnome/src/virtualmonitorsactor.js @@ -929,14 +929,12 @@ export const VirtualMonitorsActor = GObject.registerClass({ const containerActor = new Clutter.Actor({ width: this.target_monitor.width, - height: this.target_monitor.height, - reactive: false, + height: this.target_monitor.height }); // Create a clone of the stage content for this monitor const monitorClone = new Clutter.Clone({ - source: Main.layoutManager.uiGroup, - reactive: false, + source: Main.layoutManager.uiGroup, x: -monitor.x, y: -monitor.y }); diff --git a/modules/XRLinuxDriver b/modules/XRLinuxDriver index 6c051c2..831a016 160000 --- a/modules/XRLinuxDriver +++ b/modules/XRLinuxDriver @@ -1 +1 @@ -Subproject commit 6c051c245a81216434b90193844c817bc1218ba5 +Subproject commit 831a016d71f638b683157f9d85d5ffc34848a1c1 diff --git a/ui/modules/PyXRLinuxDriverIPC b/ui/modules/PyXRLinuxDriverIPC index c3b0dda..b012396 160000 --- a/ui/modules/PyXRLinuxDriverIPC +++ b/ui/modules/PyXRLinuxDriverIPC @@ -1 +1 @@ -Subproject commit c3b0ddab302e11e517b57b621ff334faf03173de +Subproject commit b01239646d7ea6f78a823f591946855b880f0484