diff --git a/lib/Gestures/GestureBackend.vala b/lib/Gestures/GestureBackend.vala index b7b0e1261..bf5f05feb 100644 --- a/lib/Gestures/GestureBackend.vala +++ b/lib/Gestures/GestureBackend.vala @@ -6,11 +6,18 @@ */ private interface Gala.GestureBackend : Object { + public enum DeviceType { + TOUCHPAD, + TOUCHSCREEN + } + public signal bool on_gesture_detected (Gesture gesture, uint32 timestamp); public signal void on_begin (double percentage, uint64 time); public signal void on_update (double percentage, uint64 time); public signal void on_end (double percentage, uint64 time); + public abstract DeviceType device_type { get; } + public virtual void prepare_gesture_handling () { } /** diff --git a/lib/Gestures/GestureController.vala b/lib/Gestures/GestureController.vala index 625bf0e9c..b5a3497eb 100644 --- a/lib/Gestures/GestureController.vala +++ b/lib/Gestures/GestureController.vala @@ -44,6 +44,7 @@ public class Gala.GestureController : Object { public GestureAction action { get; construct; } public WindowManager wm { get; construct; } public Group group { get; construct; } + public bool follow_natural_scroll_settings { get; construct; } private unowned RootTarget? _target; public RootTarget target { @@ -87,6 +88,8 @@ public class Gala.GestureController : Object { public bool recognizing { get; private set; } + private static GLib.Settings touchpad_settings = new GLib.Settings ("org.gnome.desktop.peripherals.touchpad"); + private ToucheggBackend? touchegg_backend; private TouchpadBackend? touchpad_backend; private ScrollBackend? scroll_backend; @@ -101,8 +104,8 @@ public class Gala.GestureController : Object { private SpringTimeline? timeline; - public GestureController (GestureAction action, WindowManager wm, Group group = NONE) { - Object (action: action, wm: wm, group: group); + public GestureController (GestureAction action, WindowManager wm, Group group = NONE, bool follow_natural_scroll_settings = false) { + Object (action: action, wm: wm, group: group, follow_natural_scroll_settings: follow_natural_scroll_settings); } /** @@ -185,6 +188,8 @@ public class Gala.GestureController : Object { prepare (); + handle_natural_scroll_settings (ref percentage); + gesture_progress = progress; previous_percentage = percentage; previous_time = elapsed_time; @@ -195,6 +200,8 @@ public class Gala.GestureController : Object { return; } + handle_natural_scroll_settings (ref percentage); + var updated_delta = previous_delta; if (elapsed_time != previous_time) { double distance = percentage - previous_percentage; @@ -222,6 +229,7 @@ public class Gala.GestureController : Object { recognizing = false; + handle_natural_scroll_settings (ref percentage); update_gesture_progress (percentage, previous_delta); var to = progress; @@ -291,6 +299,25 @@ public class Gala.GestureController : Object { _action_info = null; } + private void handle_natural_scroll_settings (ref double percentage) requires (recognizing_backend != null) { + if (!follow_natural_scroll_settings) { + return; + } + + var multiplier = 1.0; + + switch (recognizing_backend.device_type) { + case TOUCHPAD: + multiplier = touchpad_settings.get_boolean ("natural-scroll") ? 1.0 : -1.0; + break; + case TOUCHSCREEN: + multiplier = 1.0; + break; + } + + percentage *= multiplier; + } + /** * Animates to the given progress value. * If the gesture is currently recognizing, it will do nothing. diff --git a/lib/Gestures/ScrollBackend.vala b/lib/Gestures/ScrollBackend.vala index 1cf079293..883e942a7 100644 --- a/lib/Gestures/ScrollBackend.vala +++ b/lib/Gestures/ScrollBackend.vala @@ -26,6 +26,8 @@ private class Gala.ScrollBackend : Object, GestureBackend { private const double FINISH_DELTA_HORIZONTAL = 40; private const double FINISH_DELTA_VERTICAL = 30; + public GestureBackend.DeviceType device_type { get { return TOUCHPAD; }} + public Clutter.Orientation orientation { get; construct; } public GestureSettings settings { get; construct; } diff --git a/lib/Gestures/ToucheggBackend.vala b/lib/Gestures/ToucheggBackend.vala index 86cfefd11..bae2cfd5f 100644 --- a/lib/Gestures/ToucheggBackend.vala +++ b/lib/Gestures/ToucheggBackend.vala @@ -76,6 +76,8 @@ private class Gala.ToucheggBackend : Object, GestureBackend { */ private const double DELTA_MULTIPLIER = 0.01; + public GestureBackend.DeviceType device_type { get { return TOUCHPAD; }} + /** * Single instance of the class. */ diff --git a/lib/Gestures/TouchpadBackend.vala b/lib/Gestures/TouchpadBackend.vala index f7883c5c5..c76c8f8e7 100644 --- a/lib/Gestures/TouchpadBackend.vala +++ b/lib/Gestures/TouchpadBackend.vala @@ -18,6 +18,8 @@ private class Gala.TouchpadBackend : Object, GestureBackend { ONGOING } + public GestureBackend.DeviceType device_type { get { return TOUCHPAD; }} + public Clutter.Actor actor { get; construct; } public GestureController.Group group { get; construct; } diff --git a/src/Widgets/MultitaskingView/MultitaskingView.vala b/src/Widgets/MultitaskingView/MultitaskingView.vala index 80fc679f8..49c803937 100644 --- a/src/Widgets/MultitaskingView/MultitaskingView.vala +++ b/src/Widgets/MultitaskingView/MultitaskingView.vala @@ -65,7 +65,7 @@ public class Gala.MultitaskingView : ActorTarget, RootTarget, ActivatableCompone workspaces = new WorkspaceRow (display); - workspaces_gesture_controller = new GestureController (SWITCH_WORKSPACE, wm, MULTITASKING_VIEW) { + workspaces_gesture_controller = new GestureController (SWITCH_WORKSPACE, wm, MULTITASKING_VIEW, true) { overshoot_upper_clamp = 0.1 }; workspaces_gesture_controller.enable_touchpad (wm.stage);