Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions lib/Gestures/Triggers/SwipeTrigger.vala
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,14 @@
* It enables touchpad and (once supported) touchscreen backends for the given actor.
*/
public class Gala.SwipeTrigger : Object, GestureTrigger {
public Clutter.Actor actor { get; construct; }
public Clutter.Orientation orientation { get; construct; }
private weak Clutter.Actor actor;

public SwipeTrigger (Clutter.Actor actor, Clutter.Orientation orientation) {
Object (actor: actor, orientation: orientation);
Object (orientation: orientation);

this.actor = actor;
actor.add_weak_pointer (&this.actor);
}

internal bool triggers (Gesture gesture) {
Expand All @@ -25,7 +28,7 @@ public class Gala.SwipeTrigger : Object, GestureTrigger {
);
}

internal void enable_backends (GestureController controller) {
internal void enable_backends (GestureController controller) requires (actor != null) {
controller.enable_backend (new ScrollBackend (actor, orientation, new GestureSettings ()));
}
}
62 changes: 62 additions & 0 deletions tests/lib/SwipeTriggerTest.vala
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
* Copyright 2026 elementary, Inc. (https://elementary.io)
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Authored by: Leonhard Kargl <leo.kargl@proton.me>
*/

public class Gala.SwipeTriggerTest : MutterTestCase {
private Clutter.Actor? actor;
private SwipeTrigger? trigger;

public SwipeTriggerTest () {
Object (name: "SwipeTriggerTest");
}

construct {
add_test ("Test finalize trigger first", test_finalize_trigger_first);
add_test ("Test finalize actor first", test_finalize_actor_first);
add_test ("Test finalize actor and enable backend", test_finalize_actor_and_enable_backend);
}

public override void set_up () {
actor = new Clutter.Actor ();
trigger = new SwipeTrigger (actor, Clutter.Orientation.HORIZONTAL);
}

public override void tear_down () {
trigger = null;
actor = null;
}

private void test_finalize_trigger_first () {
assert_finalize_object (ref trigger);
assert_finalize_object (ref actor);
}

private void test_finalize_actor_first () {
// We can finalize the actor first because the swipe trigger only holds a weak reference to it
assert_finalize_object (ref actor);
assert_finalize_object (ref trigger);
}

private void test_finalize_actor_and_enable_backend () {
// We can finalize the actor first because the swipe trigger only holds a weak reference to it
assert_finalize_object (ref actor);

// Enabling the backend after the actor has been finalized should not cause a crash
// but print a warning
Test.expect_message (null, LEVEL_CRITICAL, "*assertion 'actor != null' failed");

var controller = new GestureController (CUSTOM);
trigger.enable_backends (controller);

Test.assert_expected_messages ();

assert_finalize_object (ref trigger);
}
}

public int main (string[] args) {
return new Gala.SwipeTriggerTest ().run (args);
}
1 change: 1 addition & 0 deletions tests/lib/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ tests = [
'GestureControllerTest',
'PropertyTargetTest',
'SetupTest',
'SwipeTriggerTest',
]

foreach test : tests
Expand Down