Better management of the extension's ready poller so we don't risk enabling twice, add the cursor delay back in
This commit is contained in:
parent
b6c913ddb2
commit
8d4da0d56e
|
|
@ -26,9 +26,22 @@ export class CursorManager {
|
||||||
this._cursorWatch = null;
|
this._cursorWatch = null;
|
||||||
this._cursorChangedConnection = null;
|
this._cursorChangedConnection = null;
|
||||||
this._cursorVisibilityChangedConnection = null;
|
this._cursorVisibilityChangedConnection = null;
|
||||||
|
this._cursorPositionInvalidatedConnection = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
enable() {
|
enable() {
|
||||||
|
// First 500ms: For some reason, starting the mouse cloning at this
|
||||||
|
// stage fails when gnome-shell is restarting on x11 and the mouse
|
||||||
|
// listener doesn't receive any events. Adding a small delay before
|
||||||
|
// starting the whole mouse cloning business helps.
|
||||||
|
this._enableTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 500, () => {
|
||||||
|
this._enableTimeoutId = null;
|
||||||
|
this._enable();
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_enable() {
|
||||||
this._enableCloningMouse();
|
this._enableCloningMouse();
|
||||||
this.startCloning();
|
this.startCloning();
|
||||||
}
|
}
|
||||||
|
|
@ -126,7 +139,8 @@ export class CursorManager {
|
||||||
this._cursorChangedConnection = this._cursorTracker.connect('cursor-changed', this._updateMouseSprite.bind(this));
|
this._cursorChangedConnection = this._cursorTracker.connect('cursor-changed', this._updateMouseSprite.bind(this));
|
||||||
this._cursorVisibilityChangedConnection = this._cursorTracker.connect('visibility-changed', this._updateMouseSprite.bind(this));
|
this._cursorVisibilityChangedConnection = this._cursorTracker.connect('visibility-changed', this._updateMouseSprite.bind(this));
|
||||||
this._cursorPositionInvalidatedConnection = this._cursorTracker.connect('position-invalidated', this._updateMouseSprite.bind(this));
|
this._cursorPositionInvalidatedConnection = this._cursorTracker.connect('position-invalidated', this._updateMouseSprite.bind(this));
|
||||||
const interval = 1000 / 100;
|
|
||||||
|
const interval = 1000 / 250;
|
||||||
this._cursorWatch = this._cursorWatcher.addWatch(interval, this._updateMousePosition.bind(this));
|
this._cursorWatch = this._cursorWatcher.addWatch(interval, this._updateMousePosition.bind(this));
|
||||||
|
|
||||||
const [x, y] = global.get_pointer();
|
const [x, y] = global.get_pointer();
|
||||||
|
|
|
||||||
|
|
@ -35,22 +35,25 @@ export default class BreezyDesktopExtension extends Extension {
|
||||||
enable() {
|
enable() {
|
||||||
Globals.extension_dir = this.path;
|
Globals.extension_dir = this.path;
|
||||||
this._monitor_manager = new MonitorManager(this.path);
|
this._monitor_manager = new MonitorManager(this.path);
|
||||||
this._monitor_manager.setChangeHook(this._monitors_changed.bind(this));
|
this._monitor_manager.setChangeHook(this._setup.bind(this));
|
||||||
this._monitor_manager.enable();
|
this._monitor_manager.enable();
|
||||||
|
|
||||||
this._poll_for_ready();
|
this._setup();
|
||||||
}
|
}
|
||||||
|
|
||||||
_poll_for_ready() {
|
_poll_for_ready() {
|
||||||
|
var target_monitor = this._target_monitor;
|
||||||
|
var is_effect_running = this._is_effect_running;
|
||||||
this._running_poller_id = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 1000, (() => {
|
this._running_poller_id = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 1000, (() => {
|
||||||
|
if (is_effect_running) return GLib.SOURCE_REMOVE;
|
||||||
|
|
||||||
const is_driver_running = this._check_driver_running();
|
const is_driver_running = this._check_driver_running();
|
||||||
if (is_driver_running && this._target_monitor) {
|
if (is_driver_running && target_monitor) {
|
||||||
console.log('Driver is running, supported monitor connected. Enabling XR effect.');
|
console.log('Driver is running, supported monitor connected. Enabling XR effect.');
|
||||||
this._effect_enable();
|
this._effect_enable();
|
||||||
this._running_poller_id = undefined;
|
|
||||||
return GLib.SOURCE_REMOVE;
|
return GLib.SOURCE_REMOVE;
|
||||||
} else {
|
} else {
|
||||||
console.log(`Not ready: driver_running ${is_driver_running}, target_monitor ${JSON.stringify(this._target_monitor)}`);
|
console.log(`Not ready: driver_running ${is_driver_running}, target_monitor ${JSON.stringify(target_monitor)}`);
|
||||||
return GLib.SOURCE_CONTINUE;
|
return GLib.SOURCE_CONTINUE;
|
||||||
}
|
}
|
||||||
}).bind(this));
|
}).bind(this));
|
||||||
|
|
@ -66,13 +69,21 @@ export default class BreezyDesktopExtension extends Extension {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_monitors_changed() {
|
_setup() {
|
||||||
if (this._is_effect_running) {
|
if (this._is_effect_running) {
|
||||||
console.log('Monitors changed, disabling effect');
|
console.log('Monitors changed, disabling XR effect');
|
||||||
this._effect_disable();
|
this._effect_disable();
|
||||||
}
|
}
|
||||||
this._target_monitor = this._find_supported_monitor();
|
this._target_monitor = this._find_supported_monitor();
|
||||||
this._poll_for_ready();
|
|
||||||
|
// if target_monitor isn't set, do nothing and wait for MonitorManager to call this again
|
||||||
|
if (this._target_monitor && this._running_poller_id === undefined) {
|
||||||
|
if (this._check_driver_running()) {
|
||||||
|
this._effect_enable();
|
||||||
|
} else {
|
||||||
|
this._poll_for_ready();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_check_driver_running() {
|
_check_driver_running() {
|
||||||
|
|
@ -81,39 +92,47 @@ export default class BreezyDesktopExtension extends Extension {
|
||||||
}
|
}
|
||||||
|
|
||||||
_effect_enable() {
|
_effect_enable() {
|
||||||
|
this._running_poller_id = undefined;
|
||||||
if (!this._is_effect_running) {
|
if (!this._is_effect_running) {
|
||||||
this._cursor_manager = new CursorManager(Main.layoutManager.uiGroup);
|
|
||||||
this._cursor_manager.enable();
|
|
||||||
|
|
||||||
this._overlay = new St.Bin({ style: 'background-color: rgba(0, 0, 0, 1);'});
|
|
||||||
this._overlay.opacity = 255;
|
|
||||||
this._overlay.set_position(this._target_monitor.x, this._target_monitor.y);
|
|
||||||
this._overlay.set_size(this._target_monitor.width, this._target_monitor.height);
|
|
||||||
|
|
||||||
const overlayContent = new Clutter.Actor({clip_to_allocation: true});
|
|
||||||
const uiClone = new Clutter.Clone({ source: Main.layoutManager.uiGroup, clip_to_allocation: true });
|
|
||||||
uiClone.x = -this._target_monitor.x;
|
|
||||||
uiClone.y = -this._target_monitor.y;
|
|
||||||
overlayContent.add_actor(uiClone);
|
|
||||||
|
|
||||||
this._overlay.set_child(overlayContent);
|
|
||||||
|
|
||||||
global.stage.insert_child_above(this._overlay, null);
|
|
||||||
Shell.util_set_hidden_from_pick(this._overlay, true);
|
|
||||||
|
|
||||||
this._xr_effect = new XREffect({
|
|
||||||
target_monitor: this._target_monitor,
|
|
||||||
target_framerate: 60
|
|
||||||
});
|
|
||||||
|
|
||||||
this._overlay.add_effect_with_name('xr-desktop', this._xr_effect);
|
|
||||||
Meta.disable_unredirect_for_display(global.display);
|
|
||||||
|
|
||||||
this._is_effect_running = true;
|
this._is_effect_running = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
this._cursor_manager = new CursorManager(Main.layoutManager.uiGroup);
|
||||||
|
this._cursor_manager.enable();
|
||||||
|
|
||||||
|
this._overlay = new St.Bin({ style: 'background-color: rgba(0, 0, 0, 1);'});
|
||||||
|
this._overlay.opacity = 255;
|
||||||
|
this._overlay.set_position(this._target_monitor.x, this._target_monitor.y);
|
||||||
|
this._overlay.set_size(this._target_monitor.width, this._target_monitor.height);
|
||||||
|
|
||||||
|
const overlayContent = new Clutter.Actor({clip_to_allocation: true});
|
||||||
|
const uiClone = new Clutter.Clone({ source: Main.layoutManager.uiGroup, clip_to_allocation: true });
|
||||||
|
uiClone.x = -this._target_monitor.x;
|
||||||
|
uiClone.y = -this._target_monitor.y;
|
||||||
|
overlayContent.add_actor(uiClone);
|
||||||
|
|
||||||
|
this._overlay.set_child(overlayContent);
|
||||||
|
|
||||||
|
global.stage.insert_child_above(this._overlay, null);
|
||||||
|
Shell.util_set_hidden_from_pick(this._overlay, true);
|
||||||
|
|
||||||
|
this._xr_effect = new XREffect({
|
||||||
|
target_monitor: this._target_monitor,
|
||||||
|
target_framerate: 60
|
||||||
|
});
|
||||||
|
|
||||||
|
this._overlay.add_effect_with_name('xr-desktop', this._xr_effect);
|
||||||
|
Meta.disable_unredirect_for_display(global.display);
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Error enabling XR effect', e);
|
||||||
|
this._effect_disable();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_effect_disable() {
|
_effect_disable() {
|
||||||
|
this._is_effect_running = false;
|
||||||
|
|
||||||
if (this._running_poller_id) GLib.source_remove(this._running_poller_id);
|
if (this._running_poller_id) GLib.source_remove(this._running_poller_id);
|
||||||
|
|
||||||
Meta.enable_unredirect_for_display(global.display);
|
Meta.enable_unredirect_for_display(global.display);
|
||||||
|
|
@ -134,7 +153,6 @@ export default class BreezyDesktopExtension extends Extension {
|
||||||
this._cursor_manager = null;
|
this._cursor_manager = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._is_effect_running = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
disable() {
|
disable() {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue