From 01dd625018d5ccdaf2ba37981faafda39e4f47d0 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Tue, 13 Feb 2024 23:59:11 +0100 Subject: [PATCH 1/2] Separate Gala.Barrier --- src/HotCorners/Barrier.vala | 70 +++++++++++++++++++++ src/HotCorners/HotCorner.vala | 111 +++++++++++++++++----------------- src/meson.build | 1 + 3 files changed, 125 insertions(+), 57 deletions(-) create mode 100644 src/HotCorners/Barrier.vala diff --git a/src/HotCorners/Barrier.vala b/src/HotCorners/Barrier.vala new file mode 100644 index 000000000..6f56e1b88 --- /dev/null +++ b/src/HotCorners/Barrier.vala @@ -0,0 +1,70 @@ +public class Gala.Barrier : Meta.Barrier { + /** + * In order to avoid accidental triggers, don't trigger the hot corner until + * this threshold is reached. + */ + private const int TRIGGER_PRESSURE_THRESHOLD = 50; + + /** + * When the mouse pointer pressures the barrier without activating the hot corner, + * release it when this threshold is reached. + */ + private const int RELEASE_PRESSURE_THRESHOLD = 100; + + /** + * When the mouse pointer pressures the hot corner after activation, trigger the + * action again when this threshold is reached. + * Only retrigger after a minimum delay (milliseconds) since original trigger. + */ + private const int RETRIGGER_PRESSURE_THRESHOLD = 500; + private const int RETRIGGER_DELAY = 1000; + + public signal void trigger (); + + public bool triggered { get; set; default = false; } + public uint32 triggered_time { get; set; default = 0; } + + private double pressure; + + public Barrier (Meta.Display display, int x1, int y1, int x2, int y2, Meta.BarrierDirection directions) { + Object (display: display, x1: x1, y1: y1, x2: x2, y2: y2, directions: directions); + } + + construct { + hit.connect (on_hit); + left.connect (on_left); + } + + private void on_hit (Meta.BarrierEvent event) { + if (POSITIVE_X in directions || NEGATIVE_X in directions) { + pressure += event.dx.abs (); + } else { + pressure += event.dy.abs (); + } + + if (!triggered && pressure > TRIGGER_PRESSURE_THRESHOLD) { + emit_trigger (); + } + + if (!triggered && pressure > RELEASE_PRESSURE_THRESHOLD) { + release (event); + } + + if (triggered && pressure.abs () > RETRIGGER_PRESSURE_THRESHOLD && event.time > RETRIGGER_DELAY + triggered_time) { + emit_trigger (); + } + } + + private void emit_trigger () { + triggered = true; + pressure = 0; + + trigger (); + } + + private void on_left (Meta.BarrierEvent event) { + pressure = 0; + + triggered = false; + } +} diff --git a/src/HotCorners/HotCorner.vala b/src/HotCorners/HotCorner.vala index 8a21807ec..7e559fc17 100644 --- a/src/HotCorners/HotCorner.vala +++ b/src/HotCorners/HotCorner.vala @@ -16,18 +16,6 @@ * along with this program. If not, see . */ - - -private class Gala.Barrier : Meta.Barrier { - public bool is_hit { get; set; default = false; } - public double pressure_x { get; set; default = 0; } - public double pressure_y { get; set; default = 0; } - - public Barrier (Meta.Display display, int x1, int y1, int x2, int y2, Meta.BarrierDirection directions) { - Object (display: display, x1: x1, y1: y1, x2: x2, y2: y2, directions: directions); - } -} - public class Gala.HotCorner : Object { public const string POSITION_TOP_LEFT = "hotcorner-topleft"; public const string POSITION_TOP_RIGHT = "hotcorner-topright"; @@ -85,11 +73,14 @@ public class Gala.HotCorner : Object { vertical_barrier = new Gala.Barrier (display, vrect.x, vrect.y, vrect.x + vrect.width, vrect.y + vrect.height, vdir); horizontal_barrier = new Gala.Barrier (display, hrect.x, hrect.y, hrect.x + hrect.width, hrect.y + hrect.height, hdir); - vertical_barrier.hit.connect ((event) => on_barrier_hit (vertical_barrier, event)); - horizontal_barrier.hit.connect ((event) => on_barrier_hit (horizontal_barrier, event)); + vertical_barrier.trigger.connect (on_barrier_trigger); + horizontal_barrier.trigger.connect (on_barrier_trigger); - vertical_barrier.left.connect ((event) => on_barrier_left (vertical_barrier, event)); - horizontal_barrier.left.connect ((event) => on_barrier_left (horizontal_barrier, event)); + // vertical_barrier.hit.connect ((event) => on_barrier_hit (vertical_barrier, event)); + // horizontal_barrier.hit.connect ((event) => on_barrier_hit (horizontal_barrier, event)); + + // vertical_barrier.left.connect ((event) => on_barrier_left (vertical_barrier, event)); + // horizontal_barrier.left.connect ((event) => on_barrier_left (horizontal_barrier, event)); } private static Meta.BarrierDirection get_barrier_direction (string hot_corner_position, Clutter.Orientation orientation) { @@ -143,48 +134,54 @@ public class Gala.HotCorner : Object { return { x1, y1, x2 - x1, y2 - y1 }; } - private void on_barrier_hit (Gala.Barrier barrier, Meta.BarrierEvent event) { - barrier.is_hit = true; - barrier.pressure_x += event.dx; - barrier.pressure_y += event.dy; - - var pressure = (barrier == vertical_barrier) ? - barrier.pressure_x.abs () : - barrier.pressure_y.abs (); - - if (!triggered && vertical_barrier.is_hit && horizontal_barrier.is_hit) { - if (pressure.abs () > TRIGGER_PRESSURE_THRESHOLD) { - trigger_hot_corner (); - pressure = 0; - triggered_time = event.time; - } - } - - if (!triggered && pressure.abs () > RELEASE_PRESSURE_THRESHOLD) { - barrier.release (event); - } - - if (triggered && pressure.abs () > RETRIGGER_PRESSURE_THRESHOLD && event.time > RETRIGGER_DELAY + triggered_time) { - trigger_hot_corner (); - } - } - - private void on_barrier_left (Gala.Barrier barrier, Meta.BarrierEvent event) { - barrier.is_hit = false; - barrier.pressure_x = 0; - barrier.pressure_y = 0; - - if (!vertical_barrier.is_hit && !horizontal_barrier.is_hit) { - triggered = false; + // private void on_barrier_hit (Gala.Barrier barrier, Meta.BarrierEvent event) { + // barrier.is_hit = true; + // barrier.pressure_x += event.dx; + // barrier.pressure_y += event.dy; + + // var pressure = (barrier == vertical_barrier) ? + // barrier.pressure_x.abs () : + // barrier.pressure_y.abs (); + + // if (!triggered && vertical_barrier.is_hit && horizontal_barrier.is_hit) { + // if (pressure.abs () > TRIGGER_PRESSURE_THRESHOLD) { + // trigger_hot_corner (); + // pressure = 0; + // triggered_time = event.time; + // } + // } + + // if (!triggered && pressure.abs () > RELEASE_PRESSURE_THRESHOLD) { + // barrier.release (event); + // } + + // if (triggered && pressure.abs () > RETRIGGER_PRESSURE_THRESHOLD && event.time > RETRIGGER_DELAY + triggered_time) { + // trigger_hot_corner (); + // } + // } + + // private void on_barrier_left (Gala.Barrier barrier, Meta.BarrierEvent event) { + // barrier.is_hit = false; + // barrier.pressure_x = 0; + // barrier.pressure_y = 0; + + // if (!vertical_barrier.is_hit && !horizontal_barrier.is_hit) { + // triggered = false; + // } + // } + + private void on_barrier_trigger () { + if (vertical_barrier.triggered && horizontal_barrier.triggered) { + trigger (); } } - private void trigger_hot_corner () { - triggered = true; - vertical_barrier.pressure_x = 0; - vertical_barrier.pressure_y = 0; - horizontal_barrier.pressure_x = 0; - horizontal_barrier.pressure_y = 0; - trigger (); - } + // private void trigger_hot_corner () { + // triggered = true; + // vertical_barrier.pressure_x = 0; + // vertical_barrier.pressure_y = 0; + // horizontal_barrier.pressure_x = 0; + // horizontal_barrier.pressure_y = 0; + // trigger (); + // } } diff --git a/src/meson.build b/src/meson.build index c1d56ef18..1d011875e 100644 --- a/src/meson.build +++ b/src/meson.build @@ -34,6 +34,7 @@ gala_bin_sources = files( 'Gestures/GestureTracker.vala', 'Gestures/ScrollBackend.vala', 'Gestures/ToucheggBackend.vala', + 'HotCorners/Barrier.vala', 'HotCorners/HotCorner.vala', 'HotCorners/HotCornerManager.vala', 'Widgets/DwellClickTimer.vala', From e2dd849f7cad1dddf41dd0aa2090e68f542e2071 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Wed, 14 Feb 2024 00:13:35 +0100 Subject: [PATCH 2/2] Add docs and misc fixes --- src/HotCorners/Barrier.vala | 83 ++++++++++++++++++++++------------- src/HotCorners/HotCorner.vala | 70 +++++++---------------------- 2 files changed, 67 insertions(+), 86 deletions(-) diff --git a/src/HotCorners/Barrier.vala b/src/HotCorners/Barrier.vala index 6f56e1b88..53fed6a5b 100644 --- a/src/HotCorners/Barrier.vala +++ b/src/HotCorners/Barrier.vala @@ -1,33 +1,54 @@ -public class Gala.Barrier : Meta.Barrier { - /** - * In order to avoid accidental triggers, don't trigger the hot corner until - * this threshold is reached. - */ - private const int TRIGGER_PRESSURE_THRESHOLD = 50; - - /** - * When the mouse pointer pressures the barrier without activating the hot corner, - * release it when this threshold is reached. - */ - private const int RELEASE_PRESSURE_THRESHOLD = 100; - - /** - * When the mouse pointer pressures the hot corner after activation, trigger the - * action again when this threshold is reached. - * Only retrigger after a minimum delay (milliseconds) since original trigger. - */ - private const int RETRIGGER_PRESSURE_THRESHOLD = 500; - private const int RETRIGGER_DELAY = 1000; +/* + * Copyright 2024 elementary, Inc. (https://elementary.io) + * SPDX-License-Identifier: GPL-3.0-or-later + */ + /** + * A pointer barrier supporting pressured activation. + */ +public class Gala.Barrier : Meta.Barrier { public signal void trigger (); public bool triggered { get; set; default = false; } - public uint32 triggered_time { get; set; default = 0; } + public int trigger_pressure_threshold { get; construct; } + public int release_pressure_threshold { get; construct; } + public int retrigger_pressure_threshold { get; construct; } + public int retrigger_delay { get; construct; } + + private uint32 triggered_time; private double pressure; - public Barrier (Meta.Display display, int x1, int y1, int x2, int y2, Meta.BarrierDirection directions) { - Object (display: display, x1: x1, y1: y1, x2: x2, y2: y2, directions: directions); + /** + * @param trigger_pressure_threshold The amount of pixels to travel additionally for + * the barrier to trigger. Set to 0 to immediately activate. + * @param retrigger_pressure_threshold The amount of pixels to travel additionally for + * the barrier to trigger again. Set to int.MAX to disallow retrigger. + */ + public Barrier ( + Meta.Display display, + int x1, + int y1, + int x2, + int y2, + Meta.BarrierDirection directions, + int trigger_pressure_threshold, + int release_pressure_threshold, + int retrigger_pressure_threshold, + int retrigger_delay + ) { + Object ( + display: display, + 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 + ); } construct { @@ -42,29 +63,29 @@ public class Gala.Barrier : Meta.Barrier { pressure += event.dy.abs (); } - if (!triggered && pressure > TRIGGER_PRESSURE_THRESHOLD) { - emit_trigger (); + if (!triggered && pressure > trigger_pressure_threshold) { + emit_trigger (event.time); } - if (!triggered && pressure > RELEASE_PRESSURE_THRESHOLD) { + if (!triggered && pressure > release_pressure_threshold) { release (event); } - if (triggered && pressure.abs () > RETRIGGER_PRESSURE_THRESHOLD && event.time > RETRIGGER_DELAY + triggered_time) { - emit_trigger (); + if (triggered && pressure.abs () > retrigger_pressure_threshold && event.time > retrigger_delay + triggered_time) { + emit_trigger (event.time); } } - private void emit_trigger () { + private void emit_trigger (uint32 time) { triggered = true; pressure = 0; + triggered_time = time; trigger (); } - private void on_left (Meta.BarrierEvent event) { + private void on_left () { pressure = 0; - triggered = false; } } diff --git a/src/HotCorners/HotCorner.vala b/src/HotCorners/HotCorner.vala index 7e559fc17..c3f87d58c 100644 --- a/src/HotCorners/HotCorner.vala +++ b/src/HotCorners/HotCorner.vala @@ -47,8 +47,6 @@ public class Gala.HotCorner : Object { private Gala.Barrier? vertical_barrier = null; private Gala.Barrier? horizontal_barrier = null; - private bool triggered = false; - private uint32 triggered_time; public HotCorner (Meta.Display display, float x, float y, float scale, string hot_corner_position) { add_barriers (display, x, y, scale, hot_corner_position); @@ -70,17 +68,24 @@ public class Gala.HotCorner : Object { 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 (display, vrect.x, vrect.y, vrect.x + vrect.width, vrect.y + vrect.height, vdir); - horizontal_barrier = new Gala.Barrier (display, hrect.x, hrect.y, hrect.x + hrect.width, hrect.y + hrect.height, hdir); + vertical_barrier = new Gala.Barrier ( + display, vrect.x, vrect.y, vrect.x + vrect.width, vrect.y + vrect.height, vdir, + TRIGGER_PRESSURE_THRESHOLD, + RELEASE_PRESSURE_THRESHOLD, + RETRIGGER_PRESSURE_THRESHOLD, + RETRIGGER_DELAY + ); + + horizontal_barrier = new Gala.Barrier ( + display, hrect.x, hrect.y, hrect.x + hrect.width, hrect.y + hrect.height, hdir, + TRIGGER_PRESSURE_THRESHOLD, + RELEASE_PRESSURE_THRESHOLD, + RETRIGGER_PRESSURE_THRESHOLD, + RETRIGGER_DELAY + ); vertical_barrier.trigger.connect (on_barrier_trigger); horizontal_barrier.trigger.connect (on_barrier_trigger); - - // vertical_barrier.hit.connect ((event) => on_barrier_hit (vertical_barrier, event)); - // horizontal_barrier.hit.connect ((event) => on_barrier_hit (horizontal_barrier, event)); - - // vertical_barrier.left.connect ((event) => on_barrier_left (vertical_barrier, event)); - // horizontal_barrier.left.connect ((event) => on_barrier_left (horizontal_barrier, event)); } private static Meta.BarrierDirection get_barrier_direction (string hot_corner_position, Clutter.Orientation orientation) { @@ -134,54 +139,9 @@ public class Gala.HotCorner : Object { return { x1, y1, x2 - x1, y2 - y1 }; } - // private void on_barrier_hit (Gala.Barrier barrier, Meta.BarrierEvent event) { - // barrier.is_hit = true; - // barrier.pressure_x += event.dx; - // barrier.pressure_y += event.dy; - - // var pressure = (barrier == vertical_barrier) ? - // barrier.pressure_x.abs () : - // barrier.pressure_y.abs (); - - // if (!triggered && vertical_barrier.is_hit && horizontal_barrier.is_hit) { - // if (pressure.abs () > TRIGGER_PRESSURE_THRESHOLD) { - // trigger_hot_corner (); - // pressure = 0; - // triggered_time = event.time; - // } - // } - - // if (!triggered && pressure.abs () > RELEASE_PRESSURE_THRESHOLD) { - // barrier.release (event); - // } - - // if (triggered && pressure.abs () > RETRIGGER_PRESSURE_THRESHOLD && event.time > RETRIGGER_DELAY + triggered_time) { - // trigger_hot_corner (); - // } - // } - - // private void on_barrier_left (Gala.Barrier barrier, Meta.BarrierEvent event) { - // barrier.is_hit = false; - // barrier.pressure_x = 0; - // barrier.pressure_y = 0; - - // if (!vertical_barrier.is_hit && !horizontal_barrier.is_hit) { - // triggered = false; - // } - // } - private void on_barrier_trigger () { if (vertical_barrier.triggered && horizontal_barrier.triggered) { trigger (); } } - - // private void trigger_hot_corner () { - // triggered = true; - // vertical_barrier.pressure_x = 0; - // vertical_barrier.pressure_y = 0; - // horizontal_barrier.pressure_x = 0; - // horizontal_barrier.pressure_y = 0; - // trigger (); - // } }