From bcf2910959d6bc224c8aa325a08bdfcaa260b8dd Mon Sep 17 00:00:00 2001 From: wheaney <42350981+wheaney@users.noreply.github.com> Date: Sat, 20 Dec 2025 13:04:46 -0800 Subject: [PATCH] Update display size so it's relative to distance, update UI to better represent this --- gnome/src/extension.js | 11 +++++-- gnome/src/virtualdisplayeffect.js | 6 ++-- gnome/src/virtualdisplaysactor.js | 18 +++++++----- ui/src/connecteddevice.py | 24 --------------- ui/src/displaydistancedialog.py | 8 +---- ui/src/displaydistancedialogcontent.py | 29 +------------------ ui/src/gtk/display-distance-dialog-content.ui | 7 ++++- ui/src/gtk/display-distance-dialog.ui | 9 ------ 8 files changed, 31 insertions(+), 81 deletions(-) diff --git a/gnome/src/extension.js b/gnome/src/extension.js index 7052fea..85588d5 100644 --- a/gnome/src/extension.js +++ b/gnome/src/extension.js @@ -402,15 +402,20 @@ export default class BreezyDesktopExtension extends Extension { _update_display_distance(object, event) { const distance = this.settings.get_double('display-distance'); + const defaultDistance = Math.max( + distance, + this.settings.get_double('toggle-display-distance-start'), + this.settings.get_double('toggle-display-distance-end') + ); const size = this.settings.get_double('display-size'); Globals.logger.log_debug(`BreezyDesktopExtension _update_display_distance ${distance} ${size}`); if (distance !== undefined && size !== undefined) { - let focusedMonitorSizeAdjustment = 1.0; + let focusedMonitorSizeAdjustment = size * defaultDistance; 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(size * focusedMonitor.width / fovMonitor.width, size * focusedMonitor.height / fovMonitor.height); + focusedMonitorSizeAdjustment *= + Math.max(focusedMonitor.width / fovMonitor.width, focusedMonitor.height / fovMonitor.height); } this._write_control('breezy_desktop_display_distance', distance / focusedMonitorSizeAdjustment); } diff --git a/gnome/src/virtualdisplayeffect.js b/gnome/src/virtualdisplayeffect.js index 679e8e4..621c010 100644 --- a/gnome/src/virtualdisplayeffect.js +++ b/gnome/src/virtualdisplayeffect.js @@ -389,6 +389,8 @@ export const VirtualDisplayEffect = GObject.registerClass({ // follow_ease transitions this from a rotated display (progress 0.0) to a centered/focused display (progress 1.0) _update_display_position() { + const distance_adjusted_size = this.display_distance_default * this.display_size; + // this is in NWU coordinates const monitorPlacement = this.monitor_placements[this.monitor_index]; const noRotationVector = monitorPlacement.centerNoRotate.map(coord => coord * this._current_display_distance / this.display_distance_default); @@ -400,8 +402,8 @@ export const VirtualDisplayEffect = GObject.registerClass({ finalPositionVector[0] = noRotationVector[0]; } const resizedMonitorDetails = { - width: this.monitor_details.width * this.display_size, - height: this.monitor_details.height * this.display_size + width: this.monitor_details.width * distance_adjusted_size, + height: this.monitor_details.height * distance_adjusted_size }; this._vertices = createVertexMesh(this.fov_details, resizedMonitorDetails, finalPositionVector); diff --git a/gnome/src/virtualdisplaysactor.js b/gnome/src/virtualdisplaysactor.js index 718ed53..d06f2d9 100644 --- a/gnome/src/virtualdisplaysactor.js +++ b/gnome/src/virtualdisplaysactor.js @@ -851,8 +851,8 @@ export const VirtualDisplaysActor = GObject.registerClass({ // distance of a display at the default (most zoomed out) distance, plus the lens distance constant const lensToScreenDistance = this.target_monitor.height / 2 / Math.tan(defaultDistanceVerticalRadians / 2); const completeScreenDistancePixels = lensToScreenDistance + lensDistancePixels; - const sizeAdjustedWidthPixels = this.target_monitor.width * this.display_size; - const sizeAdjustedHeightPixels = this.target_monitor.height * this.display_size; + const sizeAdjustedWidthPixels = this.target_monitor.width * this._distance_adjusted_size; + const sizeAdjustedHeightPixels = this.target_monitor.height * this._distance_adjusted_size; return { widthPixels: this.target_monitor.width, @@ -923,6 +923,8 @@ export const VirtualDisplaysActor = GObject.registerClass({ } _handle_display_distance_properties_change() { + this._distance_adjusted_size = this._display_distance_default() * this.display_size; + const distance_from_end = Math.abs(this.display_distance - this.toggle_display_distance_end); const distance_from_start = Math.abs(this.display_distance - this.toggle_display_distance_start); this._is_display_distance_at_end = distance_from_end < distance_from_start; @@ -930,14 +932,16 @@ export const VirtualDisplaysActor = GObject.registerClass({ } _handle_display_size_change(update_placements = true) { - const sizeComplement = (1.0 - this.display_size) / 2.0; + this._distance_adjusted_size = this._display_distance_default() * this.display_size; + + const sizeComplement = (1.0 - this._distance_adjusted_size) / 2.0; const sizeViewportOffsetX = sizeComplement * this.target_monitor.width; const sizeViewportOffsetY = sizeComplement * this.target_monitor.height; this._all_monitors = this._all_monitors_unmodified.map(monitor => ({ - x: monitor.x * this.display_size + sizeViewportOffsetX, - y: monitor.y * this.display_size + sizeViewportOffsetY, - width: monitor.width * this.display_size, - height: monitor.height * this.display_size + x: monitor.x * this._distance_adjusted_size + sizeViewportOffsetX, + y: monitor.y * this._distance_adjusted_size + sizeViewportOffsetY, + width: monitor.width * this._distance_adjusted_size, + height: monitor.height * this._distance_adjusted_size })); if (update_placements) this._update_monitor_placements(); } diff --git a/ui/src/connecteddevice.py b/ui/src/connecteddevice.py index 271cf76..2fa6a4d 100644 --- a/ui/src/connecteddevice.py +++ b/ui/src/connecteddevice.py @@ -183,7 +183,6 @@ class ConnectedDevice(Gtk.Box): self.follow_mode_switch.connect('notify::active', self._refresh_follow_mode) self.effect_enable_switch.connect('notify::active', self._handle_switch_enabled_state) - self.display_size_scale.set_format_value_func(lambda scale, val: self._format_size(val)) self.state_manager.connect('notify::connected-device-full-size-cm', self._handle_metric_change) self.state_manager.connect('notify::connected-device-full-distance-cm', self._handle_metric_change) self.settings.connect('changed::units', self._handle_units_changed) @@ -255,22 +254,13 @@ class ConnectedDevice(Gtk.Box): self.settings.set_string('units', active_id) def _handle_units_changed(self, *args): - self._refresh_display_size_scale_value() self._set_all_displays_distance(self.settings.get_double('toggle-display-distance-end')) self._set_focused_display_distance(self.settings.get_double('toggle-display-distance-start')) def _handle_metric_change(self, *args): - self._refresh_display_size_scale_value() self._set_all_displays_distance(self.settings.get_double('toggle-display-distance-end')) self._set_focused_display_distance(self.settings.get_double('toggle-display-distance-start')) - def _refresh_display_size_scale_value(self): - if self.display_size_scale.get_draw_value(): - self.display_size_scale.set_draw_value(False) - self.display_size_scale.set_draw_value(True) - else: - self.display_size_scale.queue_draw() - def _handle_monitor_wrapping_scheme_setting_changed(self, settings, val): self.monitor_wrapping_scheme_menu.set_active_id(val) @@ -374,18 +364,6 @@ class ConnectedDevice(Gtk.Box): return f"{inches:.2f} in" return f"{cm:.1f} cm" - def _format_size(self, normalized): - sm = getattr(self, 'state_manager', None) or StateManager.get_instance() - full_cm = float(sm.get_property('connected-device-full-size-cm') or 0.0) - if full_cm <= 0: - # Fallback to normalized display if metric unknown - return f"{round(normalized, 2)}" - cm = normalized * full_cm - if self._get_units() == 'in': - inches = cm / 2.54 - return f"{inches:.2f} in" - return f"{cm:.1f} cm" - def _on_display_distance_preset_change_button_clicked(self, widget, settings_key, on_save_callback, title, subtitle, lower_limit, upper_limit): dialog = DisplayDistanceDialog(settings_key, on_save_callback, title, subtitle, lower_limit, upper_limit) dialog.set_transient_for(widget.get_ancestor(Gtk.Window)) @@ -393,7 +371,6 @@ class ConnectedDevice(Gtk.Box): def _on_set_all_displays_distance(self, prev_distance, distance): focused_display_distance = self.settings.get_double('toggle-display-distance-start') - all_displays_distance = self.settings.get_double('toggle-display-distance-end') if (distance < focused_display_distance): self._set_focused_display_distance(distance) @@ -403,7 +380,6 @@ class ConnectedDevice(Gtk.Box): self.settings.set_double('display-distance', prev_distance) def _on_set_focused_display_distance(self, prev_distance, distance): - focused_display_distance = self.settings.get_double('toggle-display-distance-start') all_displays_distance = self.settings.get_double('toggle-display-distance-end') if (distance > all_displays_distance): self._set_all_displays_distance(distance) diff --git a/ui/src/displaydistancedialog.py b/ui/src/displaydistancedialog.py index 9f02baa..e2a62a6 100644 --- a/ui/src/displaydistancedialog.py +++ b/ui/src/displaydistancedialog.py @@ -5,7 +5,6 @@ from .displaydistancedialogcontent import DisplayDistanceDialogContent class DisplayDistanceDialog(Gtk.Dialog): __gtype_name__ = 'DisplayDistanceDialog' - show_full_scale_button = Gtk.Template.Child() save_button = Gtk.Template.Child() def __init__(self, settings_key, on_save_callback, title, subtitle, lower_limit, upper_limit): @@ -15,14 +14,9 @@ class DisplayDistanceDialog(Gtk.Dialog): self.on_save_callback = on_save_callback self.set_title(title) - self.content = DisplayDistanceDialogContent(settings_key, self.show_full_scale_button, self.save_button, self._on_save_callback, subtitle, lower_limit, upper_limit) + self.content = DisplayDistanceDialogContent(settings_key, self.save_button, self._on_save_callback, subtitle, lower_limit, upper_limit) self.get_content_area().append(self.content) - self.show_full_scale_button.connect('clicked', self._on_show_full_scale_button_clicked) - - def _on_show_full_scale_button_clicked(self, button): - self.show_full_scale_button.set_visible(False) - def _on_save_callback(self, prev_distance, distance): self.on_save_callback(prev_distance, distance) self.close() \ No newline at end of file diff --git a/ui/src/displaydistancedialogcontent.py b/ui/src/displaydistancedialogcontent.py index 22555f9..6a84d61 100644 --- a/ui/src/displaydistancedialogcontent.py +++ b/ui/src/displaydistancedialogcontent.py @@ -15,7 +15,7 @@ class DisplayDistanceDialogContent(Gtk.Box): display_distance_scale = Gtk.Template.Child() display_distance_adjustment = Gtk.Template.Child() - def __init__(self, settings_key, show_full_scale_button, save_button, on_save_callback, subtitle, lower_limit, upper_limit): + def __init__(self, settings_key, save_button, on_save_callback, subtitle, lower_limit, upper_limit): super(Gtk.Box, self).__init__() self.init_template() @@ -26,40 +26,13 @@ class DisplayDistanceDialogContent(Gtk.Box): self.state_manager = StateManager.get_instance() self.prev_distance = self.settings.get_double('display-distance') - self.lower_limit_orig = self.display_distance_adjustment.get_lower() - self.upper_limit_orig = self.display_distance_adjustment.get_upper() - - self._add_marks(lower_limit, upper_limit) - self.settings.bind('display-distance', self.display_distance_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT) self.display_distance_scale.set_format_value_func(lambda scale, val: self._format_distance(val)) self.state_manager.connect('notify::connected-device-full-distance-cm', lambda *args: self.display_distance_scale.queue_draw()) self.settings.connect('changed::units', lambda *args: self.display_distance_scale.queue_draw()) - - show_full_scale_button.connect('clicked', self._on_show_full_scale_button_clicked) save_button.connect('clicked', self._on_save_button_clicked) - def _add_marks(self, lower_limit, upper_limit): - self.display_distance_scale.clear_marks() - - if self.lower_limit_orig == lower_limit: - self.display_distance_scale.add_mark(self.lower_limit_orig, Gtk.PositionType.BOTTOM, _("closer")) - else: - self.display_distance_adjustment.set_lower(lower_limit) - - self.display_distance_scale.add_mark(1.0, Gtk.PositionType.BOTTOM, _("fullscreen")) - - if self.upper_limit_orig == upper_limit: - self.display_distance_scale.add_mark(self.upper_limit_orig, Gtk.PositionType.BOTTOM, _("farther")) - else: - self.display_distance_adjustment.set_upper(upper_limit) - - def _on_show_full_scale_button_clicked(self, button): - self._add_marks(self.lower_limit_orig, self.upper_limit_orig) - self.display_distance_adjustment.set_lower(self.lower_limit_orig) - self.display_distance_adjustment.set_upper(self.upper_limit_orig) - def _on_save_button_clicked(self, button): self.on_save_callback(self.prev_distance, self.display_distance_adjustment.get_value()) diff --git a/ui/src/gtk/display-distance-dialog-content.ui b/ui/src/gtk/display-distance-dialog-content.ui index 0160d84..715e88d 100644 --- a/ui/src/gtk/display-distance-dialog-content.ui +++ b/ui/src/gtk/display-distance-dialog-content.ui @@ -26,11 +26,16 @@ 0.1 - 2.5 + 1.5 0.01 1.05 + + closer + default + farther + diff --git a/ui/src/gtk/display-distance-dialog.ui b/ui/src/gtk/display-distance-dialog.ui index 1ac5219..8bd3ee8 100644 --- a/ui/src/gtk/display-distance-dialog.ui +++ b/ui/src/gtk/display-distance-dialog.ui @@ -4,15 +4,6 @@