Add better display size awareness to smooth follow

This commit is contained in:
wheaney 2025-03-05 14:01:58 -08:00
parent e81004d136
commit 5f20d11a5b
2 changed files with 27 additions and 3 deletions

View File

@ -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;

View File

@ -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];
}
}