diff --git a/gnome/src/extension.js b/gnome/src/extension.js index f2136ab..bab4c25 100644 --- a/gnome/src/extension.js +++ b/gnome/src/extension.js @@ -63,6 +63,7 @@ export default class BreezyDesktopExtension extends Extension { this._display_size_binding = null; this._look_ahead_override_binding = null; this._disable_anti_aliasing_binding = null; + this._framerate_cap_binding = null; this._optimal_monitor_config_binding = null; this._headset_as_primary_binding = null; this._actor_added_connection = null; @@ -346,10 +347,10 @@ export default class BreezyDesktopExtension extends Extension { this._start_binding = this.settings.bind('toggle-display-distance-start', this._overlay_content, 'toggle-display-distance-start', Gio.SettingsBindFlags.DEFAULT) this._end_binding = this.settings.bind('toggle-display-distance-end', this._overlay_content, 'toggle-display-distance-end', Gio.SettingsBindFlags.DEFAULT); this._display_size_binding = this.settings.bind('display-size', this._overlay_content, 'display-size', Gio.SettingsBindFlags.DEFAULT); + this._framerate_cap_binding = this.settings.bind('framerate-cap', this._overlay_content, 'framerate-cap', Gio.SettingsBindFlags.DEFAULT); // this._curved_display_binding = this.settings.bind('curved-display', this._xr_effect, 'curved-display', Gio.SettingsBindFlags.DEFAULT) - // this._display_size_binding = this.settings.bind('display-size', this._xr_effect, 'display-size', Gio.SettingsBindFlags.DEFAULT); - // this._look_ahead_override_binding = this.settings.bind('look-ahead-override', this._xr_effect, 'look-ahead-override', Gio.SettingsBindFlags.DEFAULT); - // this._disable_anti_aliasing_binding = this.settings.bind('disable-anti-aliasing', this._xr_effect, 'disable-anti-aliasing', Gio.SettingsBindFlags.DEFAULT); + this._look_ahead_override_binding = this.settings.bind('look-ahead-override', this._overlay_content, 'look-ahead-override', Gio.SettingsBindFlags.DEFAULT); + this._disable_anti_aliasing_binding = this.settings.bind('disable-anti-aliasing', this._overlay_content, 'disable-anti-aliasing', Gio.SettingsBindFlags.DEFAULT); Meta.disable_unredirect_for_display(global.display); @@ -586,11 +587,11 @@ export default class BreezyDesktopExtension extends Extension { Meta.enable_unredirect_for_display(global.display); if (this._actor_added_connection) { - Main.layoutManager.uiGroup.disconnect(this._actor_added_connection); + global.stage.disconnect(this._actor_added_connection); this._actor_added_connection = null; } if (this._actor_removed_connection) { - Main.layoutManager.uiGroup.disconnect(this._actor_removed_connection); + global.stage.disconnect(this._actor_removed_connection); this._actor_removed_connection = null; } if (this._distance_binding) { @@ -653,6 +654,10 @@ export default class BreezyDesktopExtension extends Extension { this.settings.unbind(this._disable_anti_aliasing_binding); this._disable_anti_aliasing_binding = null; } + if (this._framerate_cap_binding) { + this.settings.unbind(this._framerate_cap_binding); + this._framerate_cap_binding = null; + } if (this._overlay) { global.stage.remove_child(this._overlay); this._overlay.destroy(); diff --git a/gnome/src/virtualmonitorsactor.js b/gnome/src/virtualmonitorsactor.js index 992eb4a..b1e548a 100644 --- a/gnome/src/virtualmonitorsactor.js +++ b/gnome/src/virtualmonitorsactor.js @@ -397,6 +397,13 @@ export const VirtualMonitorEffect = GObject.registerClass({ 'Whether this monitor is the closest to the camera', GObject.ParamFlags.READWRITE, false + ), + 'disable-anti-aliasing': GObject.ParamSpec.boolean( + 'disable-anti-aliasing', + 'Disable anti-aliasing', + 'Disable anti-aliasing for the effect', + GObject.ParamFlags.READWRITE, + false ) } }, class VirtualMonitorEffect extends Shell.GLSLEffect { @@ -612,11 +619,15 @@ export const VirtualMonitorEffect = GObject.registerClass({ this.set_uniform_float(this.get_uniform_location('u_look_ahead_ms'), 1, [lookAheadMS(this.imu_snapshots.timestamp_ms, 5)]); this.set_uniform_matrix(this.get_uniform_location("u_imu_data"), false, 4, this.imu_snapshots.imu_data); - this.get_pipeline().set_layer_filters( - 0, - Cogl.PipelineFilter.LINEAR_MIPMAP_LINEAR, - Cogl.PipelineFilter.LINEAR - ); + + if (!this.disable_anti_aliasing) { + // improves sampling quality for smooth text and edges + this.get_pipeline().set_layer_filters( + 0, + Cogl.PipelineFilter.LINEAR_MIPMAP_LINEAR, + Cogl.PipelineFilter.LINEAR + ); + } super.vfunc_paint_target(node, paintContext); } @@ -719,12 +730,28 @@ export const VirtualMonitorsActor = GObject.registerClass({ 2.5, 1.05 ), - 'target-framerate': GObject.ParamSpec.double( - 'target-framerate', - 'Target Framerate', - 'Target framerate for the virtual monitors', + 'framerate-cap': GObject.ParamSpec.double( + 'framerate-cap', + 'Framerate Cap', + 'Maximum framerate to render at', GObject.ParamFlags.READWRITE, - 1.0, 120.0, 60.0 + 1.0, 240.0, 60.0 + ), + 'look-ahead-override': GObject.ParamSpec.int( + 'look-ahead-override', + 'Look ahead override', + 'Override the look ahead value', + GObject.ParamFlags.READWRITE, + -1, + 45, + -1 + ), + 'disable-anti-aliasing': GObject.ParamSpec.boolean( + 'disable-anti-aliasing', + 'Disable anti-aliasing', + 'Disable anti-aliasing for the effect', + GObject.ParamFlags.READWRITE, + false ) } }, class VirtualMonitorsActor extends Clutter.Actor { @@ -733,7 +760,7 @@ export const VirtualMonitorsActor = GObject.registerClass({ this.width = this.target_monitor.width; this.height = this.target_monitor.height; - this._frametime_ms = Math.floor(1000 / (this.target_framerate ?? 60.0)); + this._cap_frametime_ms = Math.floor(1000 / this.framerate_cap); this._all_monitors = [ this.target_monitor, @@ -796,6 +823,7 @@ export const VirtualMonitorsActor = GObject.registerClass({ this.bind_property('imu-snapshots', effect, 'imu-snapshots', GObject.BindingFlags.DEFAULT); this.bind_property('focused-monitor-index', effect, 'focused-monitor-index', GObject.BindingFlags.DEFAULT); this.bind_property('display-distance', effect, 'display-distance', GObject.BindingFlags.DEFAULT); + this.bind_property('disable-anti-aliasing', effect, 'disable-anti-aliasing', GObject.BindingFlags.DEFAULT); const updateEffectDistanceDefault = (() => { effect.display_distance_default = this._display_distance_default(); @@ -828,7 +856,7 @@ export const VirtualMonitorsActor = GObject.registerClass({ this._redraw_timeline = Clutter.Timeline.new_for_actor(this, 1000); this._redraw_timeline.connect('new-frame', (() => { // let's try to cap the forced redraw rate - if (this._last_redraw !== undefined && Date.now() - this._last_redraw < this._frametime_ms) return; + if (this._last_redraw !== undefined && Date.now() - this._last_redraw < this._cap_frametime_ms) return; Globals.data_stream.refresh_data(); this.imu_snapshots = Globals.data_stream.imu_snapshots; diff --git a/ui/data/com.xronlinux.BreezyDesktop.gschema.xml b/ui/data/com.xronlinux.BreezyDesktop.gschema.xml index 34230c0..df81db5 100644 --- a/ui/data/com.xronlinux.BreezyDesktop.gschema.xml +++ b/ui/data/com.xronlinux.BreezyDesktop.gschema.xml @@ -225,6 +225,15 @@ Custom monitor product + + + + 0 + + Framerate cap + + Framerate cap + diff --git a/ui/src/connecteddevice.py b/ui/src/connecteddevice.py index 682d8eb..7600311 100644 --- a/ui/src/connecteddevice.py +++ b/ui/src/connecteddevice.py @@ -32,7 +32,8 @@ class ConnectedDevice(Gtk.Box): # widescreen_mode_switch = Gtk.Template.Child() # widescreen_mode_row = Gtk.Template.Child() # curved_display_switch = Gtk.Template.Child() - add_virtual_display_button = Gtk.Template.Child() + add_virtual_display_button_1080p = Gtk.Template.Child() + add_virtual_display_button_1440p = Gtk.Template.Child() set_toggle_display_distance_start_button = Gtk.Template.Child() set_toggle_display_distance_end_button = Gtk.Template.Child() reassign_toggle_xr_effect_shortcut_button = Gtk.Template.Child() @@ -70,7 +71,8 @@ class ConnectedDevice(Gtk.Box): # self.follow_mode_switch, # self.follow_threshold_scale, # self.curved_display_switch, - # self.add_virtual_display_button, + self.add_virtual_display_button_1080p, + self.add_virtual_display_button_1440p, self.set_toggle_display_distance_start_button, self.set_toggle_display_distance_end_button, self.movement_look_ahead_scale, @@ -114,7 +116,8 @@ class ConnectedDevice(Gtk.Box): self.set_toggle_display_distance_start_button, self.set_toggle_display_distance_end_button ]) - self.add_virtual_display_button.connect('clicked', self.on_add_virtual_display) + self.add_virtual_display_button_1080p.connect('clicked', lambda *args: self.on_add_virtual_display(1920, 1080)) + self.add_virtual_display_button_1440p.connect('clicked', lambda *args: self.on_add_virtual_display(2560, 1440)) self.state_manager = StateManager.get_instance() # self.state_manager.bind_property('follow-mode', self.follow_mode_switch, 'active', GObject.BindingFlags.DEFAULT) @@ -202,8 +205,8 @@ class ConnectedDevice(Gtk.Box): widget.connect('clicked', lambda *args, widget=widget: on_set_display_distance_toggle(widget)) reload_display_distance_toggle_button(widget) - def on_add_virtual_display(self, widget): - VirtualMonitor(1920, 1080, self.on_virtual_display_ready).create() + def on_add_virtual_display(self, width, height): + VirtualMonitor(width, height, self.on_virtual_display_ready).create() def on_virtual_display_ready(self): logger.info("Virtual display ready") diff --git a/ui/src/gtk/connected-device.ui b/ui/src/gtk/connected-device.ui index a28c64a..367942e 100644 --- a/ui/src/gtk/connected-device.ui +++ b/ui/src/gtk/connected-device.ui @@ -54,11 +54,26 @@ Virtual monitors 2 + 2 - - add-virtual-display - 3 - Add + + 30 + 150 + 30 + + + add-virtual-display + 3 + Add 1080p + + + + + add-virtual-display + 3 + Add 1440p + +