summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Mikhaylenko <exalm7659@gmail.com>2020-07-05 20:22:59 +0500
committerMarge Bot <marge-bot@gnome.org>2021-02-27 08:52:00 +0000
commit2a71ca373bf9d2b4902e447a0b53d72432688c58 (patch)
tree6ec3175ed7d4d1c65c2c77d00f4053337f0faffd
parent91d03f1c96f6dae9c13c8fbb00cf1763bac30886 (diff)
downloadmutter-wip/exalm/unaccel.tar.gz
clutter: Add API for retrieving gesture unaccelerated deltaswip/exalm/unaccel
This will be useful for better aligning behavior between scrolling and swiping for gnome-shell swipe tracker. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1353>
-rw-r--r--clutter/clutter/clutter-event.c36
-rw-r--r--clutter/clutter/clutter-event.h21
-rw-r--r--src/backends/native/meta-seat-impl.c27
3 files changed, 75 insertions, 9 deletions
diff --git a/clutter/clutter/clutter-event.c b/clutter/clutter/clutter-event.c
index d454b2ae5..8cfa983a4 100644
--- a/clutter/clutter/clutter-event.c
+++ b/clutter/clutter/clutter-event.c
@@ -2008,6 +2008,42 @@ clutter_event_get_gesture_motion_delta (const ClutterEvent *event,
}
/**
+ * clutter_event_get_gesture_motion_delta_unaccelerated:
+ * @event: A clutter touchpad gesture event
+ * @dx: (out) (allow-none): the displacement relative to the pointer
+ * position in the X axis, or %NULL
+ * @dy: (out) (allow-none): the displacement relative to the pointer
+ * position in the Y axis, or %NULL
+ *
+ * Returns the unaccelerated gesture motion deltas relative to the current
+ * pointer position. Unlike clutter_event_get_gesture_motion_delta(),
+ * pointer acceleration is ignored.
+ **/
+void
+clutter_event_get_gesture_motion_delta_unaccelerated (const ClutterEvent *event,
+ gdouble *dx,
+ gdouble *dy)
+{
+ g_return_if_fail (event != NULL);
+ g_return_if_fail (event->type == CLUTTER_TOUCHPAD_PINCH ||
+ event->type == CLUTTER_TOUCHPAD_SWIPE);
+
+ if (event->type == CLUTTER_TOUCHPAD_PINCH)
+ {
+ if (dx)
+ *dx = event->touchpad_pinch.dx_unaccel;
+ if (dy)
+ *dy = event->touchpad_pinch.dy_unaccel;
+ }
+ else if (event->type == CLUTTER_TOUCHPAD_SWIPE)
+ {
+ if (dx)
+ *dx = event->touchpad_swipe.dx_unaccel;
+ if (dy)
+ *dy = event->touchpad_swipe.dy_unaccel;
+ }
+}
+/**
* clutter_event_get_scroll_source:
* @event: an scroll event
*
diff --git a/clutter/clutter/clutter-event.h b/clutter/clutter/clutter-event.h
index 1974c4fbe..b77e64d15 100644
--- a/clutter/clutter/clutter-event.h
+++ b/clutter/clutter/clutter-event.h
@@ -414,6 +414,10 @@ struct _ClutterTouchEvent
* @y: the Y coordinate of the pointer, relative to the stage
* @dx: movement delta of the pinch focal point in the X axis
* @dy: movement delta of the pinch focal point in the Y axis
+ * @dx_unaccel: unaccelerated movement delta of the pinch focal
+ * point in the X axis
+ * @dy_unaccel: unaccelerated movement delta of the pinch focal
+ * point in the Y axis
* @angle_delta: angle delta in degrees, clockwise rotations are
* represented by positive deltas
* @scale: the current scale
@@ -441,6 +445,8 @@ struct _ClutterTouchpadPinchEvent
gfloat y;
gfloat dx;
gfloat dy;
+ gfloat dx_unaccel;
+ gfloat dy_unaccel;
gfloat angle_delta;
gfloat scale;
guint n_fingers;
@@ -457,8 +463,12 @@ struct _ClutterTouchpadPinchEvent
* @n_fingers: the number of fingers triggering the swipe
* @x: the X coordinate of the pointer, relative to the stage
* @y: the Y coordinate of the pointer, relative to the stage
- * @dx: movement delta of the pinch focal point in the X axis
- * @dy: movement delta of the pinch focal point in the Y axis
+ * @dx: movement delta of the swipe center point in the X axis
+ * @dy: movement delta of the swipe center point in the Y axis
+ * @dx_unaccel: unaccelerated movement delta of the swipe center
+ * point in the X axis
+ * @dy_unaccel: unaccelerated movement delta of the swipe center
+ * point in the Y axis
*
* Used for touchpad swipe gesture events. The current state of the
* gesture will be determined by the @phase field.
@@ -479,6 +489,8 @@ struct _ClutterTouchpadSwipeEvent
gfloat y;
gfloat dx;
gfloat dy;
+ gfloat dx_unaccel;
+ gfloat dy_unaccel;
};
struct _ClutterPadButtonEvent
@@ -778,6 +790,11 @@ void clutter_event_get_gesture_motion_delta (const Clut
gdouble *dy);
CLUTTER_EXPORT
+void clutter_event_get_gesture_motion_delta_unaccelerated (const ClutterEvent *event,
+ gdouble *dx,
+ gdouble *dy);
+
+CLUTTER_EXPORT
ClutterScrollSource clutter_event_get_scroll_source (const ClutterEvent *event);
CLUTTER_EXPORT
diff --git a/src/backends/native/meta-seat-impl.c b/src/backends/native/meta-seat-impl.c
index da87b086b..cce7cd33c 100644
--- a/src/backends/native/meta-seat-impl.c
+++ b/src/backends/native/meta-seat-impl.c
@@ -1249,6 +1249,8 @@ notify_pinch_gesture_event (ClutterInputDevice *input_device,
uint64_t time_us,
double dx,
double dy,
+ double dx_unaccel,
+ double dy_unaccel,
double angle_delta,
double scale,
uint32_t n_fingers)
@@ -1268,6 +1270,8 @@ notify_pinch_gesture_event (ClutterInputDevice *input_device,
event->touchpad_pinch.time = us2ms (time_us);
event->touchpad_pinch.dx = dx;
event->touchpad_pinch.dy = dy;
+ event->touchpad_pinch.dx_unaccel = dx_unaccel;
+ event->touchpad_pinch.dy_unaccel = dy_unaccel;
event->touchpad_pinch.angle_delta = angle_delta;
event->touchpad_pinch.scale = scale;
event->touchpad_pinch.n_fingers = n_fingers;
@@ -1286,7 +1290,9 @@ notify_swipe_gesture_event (ClutterInputDevice *input_device,
uint64_t time_us,
uint32_t n_fingers,
double dx,
- double dy)
+ double dy,
+ double dx_unaccel,
+ double dy_unaccel)
{
MetaSeatImpl *seat_impl;
ClutterEvent *event = NULL;
@@ -1303,6 +1309,8 @@ notify_swipe_gesture_event (ClutterInputDevice *input_device,
&event->touchpad_swipe.y);
event->touchpad_swipe.dx = dx;
event->touchpad_swipe.dy = dy;
+ event->touchpad_swipe.dx_unaccel = dx_unaccel;
+ event->touchpad_swipe.dy_unaccel = dy_unaccel;
event->touchpad_swipe.n_fingers = n_fingers;
meta_xkb_translate_state (event, seat_impl->xkb, seat_impl->button_state);
@@ -2278,14 +2286,14 @@ process_device_event (MetaSeatImpl *seat_impl,
n_fingers = libinput_event_gesture_get_finger_count (gesture_event);
device = libinput_device_get_user_data (libinput_device);
time_us = libinput_event_gesture_get_time_usec (gesture_event);
- notify_pinch_gesture_event (device, phase, time_us, 0, 0, 0, 0, n_fingers);
+ notify_pinch_gesture_event (device, phase, time_us, 0, 0, 0, 0, 0, 0, n_fingers);
break;
}
case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
{
struct libinput_event_gesture *gesture_event =
libinput_event_get_gesture_event (event);
- double angle_delta, scale, dx, dy;
+ double angle_delta, scale, dx, dy, dx_unaccel, dy_unaccel;
uint32_t n_fingers;
uint64_t time_us;
@@ -2296,10 +2304,13 @@ process_device_event (MetaSeatImpl *seat_impl,
scale = libinput_event_gesture_get_scale (gesture_event);
dx = libinput_event_gesture_get_dx (gesture_event);
dy = libinput_event_gesture_get_dy (gesture_event);
+ dx_unaccel = libinput_event_gesture_get_dx_unaccelerated (gesture_event);
+ dy_unaccel = libinput_event_gesture_get_dy_unaccelerated (gesture_event);
notify_pinch_gesture_event (device,
CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE,
- time_us, dx, dy, angle_delta, scale, n_fingers);
+ time_us, dx, dy, dx_unaccel, dy_unaccel,
+ angle_delta, scale, n_fingers);
break;
}
case LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN:
@@ -2321,7 +2332,7 @@ process_device_event (MetaSeatImpl *seat_impl,
phase = libinput_event_gesture_get_cancelled (gesture_event) ?
CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL : CLUTTER_TOUCHPAD_GESTURE_PHASE_END;
- notify_swipe_gesture_event (device, phase, time_us, n_fingers, 0, 0);
+ notify_swipe_gesture_event (device, phase, time_us, n_fingers, 0, 0, 0, 0);
break;
}
case LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE:
@@ -2330,17 +2341,19 @@ process_device_event (MetaSeatImpl *seat_impl,
libinput_event_get_gesture_event (event);
uint32_t n_fingers;
uint64_t time_us;
- double dx, dy;
+ double dx, dy, dx_unaccel, dy_unaccel;
device = libinput_device_get_user_data (libinput_device);
time_us = libinput_event_gesture_get_time_usec (gesture_event);
n_fingers = libinput_event_gesture_get_finger_count (gesture_event);
dx = libinput_event_gesture_get_dx (gesture_event);
dy = libinput_event_gesture_get_dy (gesture_event);
+ dx_unaccel = libinput_event_gesture_get_dx_unaccelerated (gesture_event);
+ dy_unaccel = libinput_event_gesture_get_dy_unaccelerated (gesture_event);
notify_swipe_gesture_event (device,
CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE,
- time_us, n_fingers, dx, dy);
+ time_us, n_fingers, dx, dy, dx_unaccel, dy_unaccel);
break;
}
case LIBINPUT_EVENT_TABLET_TOOL_AXIS: