diff --git a/src/HotCorners/Barrier.vala b/src/HotCorners/Barrier.vala index 1ebb42d07..1398eb6e8 100644 --- a/src/HotCorners/Barrier.vala +++ b/src/HotCorners/Barrier.vala @@ -1,5 +1,5 @@ /* - * Copyright 2024 elementary, Inc. (https://elementary.io) + * Copyright 2024-2025 elementary, Inc. (https://elementary.io) * SPDX-License-Identifier: GPL-3.0-or-later */ @@ -9,7 +9,12 @@ public class Gala.Barrier : Object { public signal void trigger (); - public bool triggered { get; set; default = false; } + public bool triggered { get; private set; default = false; } + /** + * Automatically release barrier events. + * May be useful for disabling barrier's pointer 'grabbing' when moving it between monitors. + */ + public bool release_events { get; set; default = false; } public double trigger_pressure_threshold { get; construct; } public double release_pressure_threshold { get; construct; } @@ -66,21 +71,20 @@ public class Gala.Barrier : Object { pressure += event.dy.abs (); } - if (!triggered && pressure > trigger_pressure_threshold) { + if ( + !triggered && pressure > trigger_pressure_threshold || + triggered && pressure.abs () > retrigger_pressure_threshold && event.time > retrigger_delay + triggered_time + ) { emit_trigger (event.time); } - if (!triggered && pressure > release_pressure_threshold) { - barrier.release (event); - } - - if (triggered && event.time - triggered_time > 150) { + if ( + release_events || + !triggered && pressure > release_pressure_threshold || + triggered && event.time - triggered_time > 150 + ) { barrier.release (event); } - - if (triggered && pressure.abs () > retrigger_pressure_threshold && event.time > retrigger_delay + triggered_time) { - emit_trigger (event.time); - } } private void emit_trigger (uint32 time) { diff --git a/src/ShellClients/HideTracker.vala b/src/ShellClients/HideTracker.vala index 7daa51983..35e824125 100644 --- a/src/ShellClients/HideTracker.vala +++ b/src/ShellClients/HideTracker.vala @@ -1,5 +1,5 @@ /* - * Copyright 2024 elementary, Inc. (https://elementary.io) + * Copyright 2024-2025 elementary, Inc. (https://elementary.io) * SPDX-License-Identifier: GPL-3.0-or-later * * Authored by: Leonhard Kargl @@ -15,6 +15,7 @@ public class Gala.HideTracker : Object { public Meta.Display display { get; construct; } public unowned PanelWindow panel { get; construct; } + public bool release_barrier_events { get; set; default = false; } private static GLib.Settings behavior_settings; @@ -176,6 +177,10 @@ public class Gala.HideTracker : Object { warning ("Barrier side not supported yet"); break; } + + if (barrier != null) { + bind_property ("release-barrier-events", barrier, "release-events", DEFAULT); + } } private void setup_barrier_top (Mtk.Rectangle monitor_geom, int offset) { diff --git a/src/ShellClients/PanelWindow.vala b/src/ShellClients/PanelWindow.vala index 3153d5013..61c3d0f27 100644 --- a/src/ShellClients/PanelWindow.vala +++ b/src/ShellClients/PanelWindow.vala @@ -66,8 +66,8 @@ public class Gala.PanelWindow : ShellWindow, RootTarget { }; hide_tracker = new HideTracker (wm.get_display (), this); - hide_tracker.hide.connect (hide); - hide_tracker.show.connect (show); + hide_tracker.hide.connect (() => user_gesture_controller.goto (1)); + hide_tracker.show.connect (() => user_gesture_controller.goto (0)); workspace_gesture_controller = new GestureController (CUSTOM, wm) { progress = 1.0 @@ -143,14 +143,10 @@ public class Gala.PanelWindow : ShellWindow, RootTarget { public override void propagate (GestureTarget.UpdateType update_type, GestureAction action, double progress) { workspace_hide_tracker.update (update_type, action, progress); base.propagate (update_type, action, progress); - } - - private void hide () { - user_gesture_controller.goto (1); - } - private void show () { - user_gesture_controller.goto (0); + // Forcefully release barrier events when we are fully visible + // to avoid interference with multiple monitors workflow + hide_tracker.release_barrier_events = get_hidden_progress () == 1.0; } private bool update_overlap (Meta.Workspace workspace) {