diff --git a/src/HotCorners/Barrier.vala b/src/HotCorners/Barrier.vala index 424ebccd..7202ac1e 100644 --- a/src/HotCorners/Barrier.vala +++ b/src/HotCorners/Barrier.vala @@ -6,7 +6,7 @@ /** * A pointer barrier supporting pressured activation. */ -public class Gala.Barrier : Meta.Barrier { +public class Gala.Barrier : Object { public signal void trigger (); public bool triggered { get; set; default = false; } @@ -16,6 +16,8 @@ public class Gala.Barrier : Meta.Barrier { public int retrigger_pressure_threshold { get; construct; } public int retrigger_delay { get; construct; } + private Meta.Barrier barrier; + private uint32 triggered_time; private double pressure; @@ -26,6 +28,7 @@ public class Gala.Barrier : Meta.Barrier { * the barrier to trigger again. Set to int.MAX to disallow retrigger. */ public Barrier ( + Meta.Backend backend, int x1, int y1, int x2, @@ -37,25 +40,27 @@ public class Gala.Barrier : Meta.Barrier { int retrigger_delay ) { Object ( - x1: x1, - y1: y1, - x2: x2, - y2: y2, - directions: directions, trigger_pressure_threshold: trigger_pressure_threshold, release_pressure_threshold: release_pressure_threshold, retrigger_pressure_threshold: retrigger_pressure_threshold, retrigger_delay: retrigger_delay ); + + try { + barrier = new Meta.Barrier (backend, x1, y1, x2, y2, directions, Meta.BarrierFlags.NONE); + barrier.hit.connect (on_hit); + barrier.left.connect (on_left); + } catch (Error e) { + warning ("Failed to create Meta Barrier"); + } } - construct { - hit.connect (on_hit); - left.connect (on_left); + ~Barrier () { + barrier.destroy (); } private void on_hit (Meta.BarrierEvent event) { - if (POSITIVE_X in directions || NEGATIVE_X in directions) { + if (POSITIVE_X in barrier.directions || NEGATIVE_X in barrier.directions) { pressure += event.dx.abs (); } else { pressure += event.dy.abs (); @@ -66,7 +71,7 @@ public class Gala.Barrier : Meta.Barrier { } if (!triggered && pressure > release_pressure_threshold) { - release (event); + barrier.release (event); } if (triggered && pressure.abs () > retrigger_pressure_threshold && event.time > retrigger_delay + triggered_time) { diff --git a/src/HotCorners/HotCorner.vala b/src/HotCorners/HotCorner.vala index d5fb9d78..9f13a969 100644 --- a/src/HotCorners/HotCorner.vala +++ b/src/HotCorners/HotCorner.vala @@ -48,27 +48,23 @@ public class Gala.HotCorner : Object { private Gala.Barrier? vertical_barrier = null; private Gala.Barrier? horizontal_barrier = null; - public HotCorner (Meta.Display display, float x, float y, float scale, string hot_corner_position) { - add_barriers (display, x, y, scale, hot_corner_position); + public HotCorner (Meta.Backend backend, float x, float y, float scale, string hot_corner_position) { + add_barriers (backend, x, y, scale, hot_corner_position); } public void destroy_barriers () { - if (vertical_barrier != null) { - vertical_barrier.destroy (); - } - - if (horizontal_barrier != null) { - horizontal_barrier.destroy (); - } + vertical_barrier = null; + horizontal_barrier = null; } - private void add_barriers (Meta.Display display, float x, float y, float scale, string hot_corner_position) { + private void add_barriers (Meta.Backend backend, float x, float y, float scale, string hot_corner_position) { var vrect = get_barrier_rect (x, y, scale, hot_corner_position, Clutter.Orientation.VERTICAL); var hrect = get_barrier_rect (x, y, scale, hot_corner_position, Clutter.Orientation.HORIZONTAL); var vdir = get_barrier_direction (hot_corner_position, Clutter.Orientation.VERTICAL); var hdir = get_barrier_direction (hot_corner_position, Clutter.Orientation.HORIZONTAL); vertical_barrier = new Gala.Barrier ( + backend, vrect.x, vrect.y, vrect.x + vrect.width, vrect.y + vrect.height, vdir, TRIGGER_PRESSURE_THRESHOLD, RELEASE_PRESSURE_THRESHOLD, @@ -77,6 +73,7 @@ public class Gala.HotCorner : Object { ); horizontal_barrier = new Gala.Barrier ( + backend, hrect.x, hrect.y, hrect.x + hrect.width, hrect.y + hrect.height, hdir, TRIGGER_PRESSURE_THRESHOLD, RELEASE_PRESSURE_THRESHOLD, diff --git a/src/HotCorners/HotCornerManager.vala b/src/HotCorners/HotCornerManager.vala index 1013f244..7712c5d0 100644 --- a/src/HotCorners/HotCornerManager.vala +++ b/src/HotCorners/HotCornerManager.vala @@ -69,7 +69,7 @@ public class Gala.HotCornerManager : Object { } unowned Meta.Display display = wm.get_display (); - var hot_corner = new HotCorner (display, (int) x, (int) y, scale, hot_corner_position); + var hot_corner = new HotCorner (display.get_context ().get_backend (), (int) x, (int) y, scale, hot_corner_position); hot_corner.trigger.connect (() => { if ( diff --git a/src/ShellClients/HideTracker.vala b/src/ShellClients/HideTracker.vala index 693614b9..6498b054 100644 --- a/src/ShellClients/HideTracker.vala +++ b/src/ShellClients/HideTracker.vala @@ -171,7 +171,13 @@ public class Gala.HideTracker : Object { } private void toggle_display (bool should_hide) { - if (should_hide) { +#if HAS_MUTTER45 + hovered = panel.window.has_pointer (); +#else + hovered = window_has_pointer (); +#endif + + if (should_hide && !hovered) { // Don't hide if we have transients, e.g. an open popover, dialog, etc. var has_transients = false; panel.window.foreach_transient (() => { @@ -179,7 +185,7 @@ public class Gala.HideTracker : Object { return false; }); - if (hovered || has_transients) { + if (has_transients) { return; } diff --git a/src/ShellClients/PanelWindow.vala b/src/ShellClients/PanelWindow.vala index f2431ce5..502de646 100644 --- a/src/ShellClients/PanelWindow.vala +++ b/src/ShellClients/PanelWindow.vala @@ -184,10 +184,7 @@ public class Gala.PanelWindow : Object { } private void destroy_barrier () { - if (barrier != null) { - barrier.destroy (); - barrier = null; - } + barrier = null; } private void setup_barrier () { @@ -217,6 +214,7 @@ public class Gala.PanelWindow : Object { private void setup_barrier_top (Meta.Rectangle monitor_geom, int offset) { #endif barrier = new Barrier ( + wm.get_display ().get_context ().get_backend (), monitor_geom.x + offset, monitor_geom.y, monitor_geom.x + monitor_geom.width - offset, @@ -237,6 +235,7 @@ public class Gala.PanelWindow : Object { private void setup_barrier_bottom (Meta.Rectangle monitor_geom, int offset) { #endif barrier = new Barrier ( + wm.get_display ().get_context ().get_backend (), monitor_geom.x + offset, monitor_geom.y + monitor_geom.height, monitor_geom.x + monitor_geom.width - offset,