diff --git a/gnome/src/extension.js b/gnome/src/extension.js index 8430c7a..b647f24 100644 --- a/gnome/src/extension.js +++ b/gnome/src/extension.js @@ -35,6 +35,7 @@ export default class BreezyDesktopExtension extends Extension { this._data_stream_bindings = []; this._show_banner_connection = null; this._distance_connection = null; + this._focused_monitor_distance_connection = null; this._follow_threshold_connection = null; this._breezy_desktop_running_connection = null; @@ -288,6 +289,8 @@ export default class BreezyDesktopExtension extends Extension { ); this._distance_connection = this.settings.connect('changed::display-distance', this._update_display_distance.bind(this)); + this._focused_monitor_distance_connection = + this._virtual_displays_actor.connect('notify::focused-monitor-details', this._update_display_distance.bind(this)); this._follow_threshold_connection = this.settings.connect('changed::follow-threshold', this._update_follow_threshold.bind(this)); Meta.Compositor?.disable_unredirect?.() ?? Meta.disable_unredirect_for_display(global.display); @@ -378,10 +381,19 @@ export default class BreezyDesktopExtension extends Extension { return state; } - _update_display_distance(settings, event) { - const value = settings.get_double('display-distance'); + _update_display_distance(object, event) { + const value = this.settings.get_double('display-distance'); Globals.logger.log_debug(`BreezyDesktopExtension _update_display_distance ${value}`); - if (value !== undefined) this._write_control('breezy_desktop_display_distance', value); + if (value !== undefined) { + let focusedMonitorSizeAdjustment = 1.0; + if (this._virtual_displays_actor?.focused_monitor_details && this._target_monitor) { + const fovMonitor = this._target_monitor.monitor; + const focusedMonitor = this._virtual_displays_actor.focused_monitor_details; + focusedMonitorSizeAdjustment = + Math.max(focusedMonitor.width / fovMonitor.width, focusedMonitor.height / fovMonitor.height); + } + this._write_control('breezy_desktop_display_distance', value / focusedMonitorSizeAdjustment); + } } _update_follow_threshold(settings, event) { @@ -541,6 +553,10 @@ export default class BreezyDesktopExtension extends Extension { this.settings.disconnect(this._distance_connection); this._distance_connection = null; } + if (this._focused_monitor_distance_connection) { + this._virtual_displays_actor.disconnect(this._focused_monitor_distance_connection); + this._focused_monitor_distance_connection = null; + } if (this._follow_threshold_connection) { this.settings.disconnect(this._follow_threshold_connection); this._follow_threshold_connection = null; diff --git a/gnome/src/virtualdisplaysactor.js b/gnome/src/virtualdisplaysactor.js index 87fac17..cab3c47 100644 --- a/gnome/src/virtualdisplaysactor.js +++ b/gnome/src/virtualdisplaysactor.js @@ -452,6 +452,12 @@ export const VirtualDisplaysActor = GObject.registerClass({ GObject.ParamFlags.READWRITE, -1, 100, -1 ), + 'focused-monitor-details': GObject.ParamSpec.jsobject( + 'focused-monitor-details', + 'Focused Monitor Details', + 'Details about the monitor that is currently focused', + GObject.ParamFlags.READWRITE + ), 'display-size': GObject.ParamSpec.double( 'display-size', 'Display size', @@ -700,6 +706,7 @@ export const VirtualDisplaysActor = GObject.registerClass({ if (this.show_banner) { this.focused_monitor_index = -1; + this.focused_monitor_details = null; } else if (this.imu_snapshots && (!this._smooth_follow_slerping || this.focused_monitor_index === -1)) { // if smooth follow is enabled, use the origin IMU data to inform the initial focused monitor // since it reflects where the user is looking in relation to the original monitor positions @@ -720,6 +727,7 @@ export const VirtualDisplaysActor = GObject.registerClass({ if (this.focused_monitor_index !== focusedMonitorIndex) { Globals.logger.log_debug(`Switching to monitor ${focusedMonitorIndex}`); this.focused_monitor_index = focusedMonitorIndex; + this.focused_monitor_details = this._sorted_monitors[focusedMonitorIndex]; } }