derekf pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=33439865de327c5bac1c9a531070514e63fe3a04

commit 33439865de327c5bac1c9a531070514e63fe3a04
Author: Derek Foreman <[email protected]>
Date:   Fri Jul 28 16:48:38 2017 -0500

    elput: Fix synthetic relative motion events based on abs events
    
    libinput won't actually give us this info, and logs an error instead.
    We can't synthesize based on pointer position due to pointer
    warping.
    
    So we must track abs reports and use previous abs reports to
    synthesize rel events.
---
 src/lib/elput/elput_evdev.c   | 30 +++++++++++++++++++++++++++---
 src/lib/elput/elput_private.h |  2 ++
 2 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/src/lib/elput/elput_evdev.c b/src/lib/elput/elput_evdev.c
index 454b4a85de..1199a09798 100644
--- a/src/lib/elput/elput_evdev.c
+++ b/src/lib/elput/elput_evdev.c
@@ -881,6 +881,23 @@ _pointer_motion_send(Elput_Device *edev)
 }
 
 static void
+_pointer_motion_relative_fake(struct libinput_event_pointer *event, double dx, 
double dy)
+{
+   Elput_Event_Pointer_Motion *ev;
+
+   ev = calloc(1, sizeof(Elput_Event_Pointer_Motion));
+   EINA_SAFETY_ON_NULL_RETURN(ev);
+
+   ev->time_usec = libinput_event_pointer_get_time_usec(event);
+   ev->dx = dx;
+   ev->dy = dy;
+   ev->dx_unaccel = dx;
+   ev->dy_unaccel = dy;
+
+   ecore_event_add(ELPUT_EVENT_POINTER_MOTION, ev, NULL, NULL);
+}
+
+static void
 _pointer_motion_relative(struct libinput_event_pointer *event)
 {
    Elput_Event_Pointer_Motion *ev;
@@ -937,6 +954,7 @@ _pointer_motion_abs(struct libinput_device *idev, struct 
libinput_event_pointer
 {
    Elput_Device *edev;
    Elput_Pointer *ptr;
+   double x, y;
 
    edev = libinput_device_get_user_data(idev);
    if (!edev) return EINA_FALSE;
@@ -944,16 +962,22 @@ _pointer_motion_abs(struct libinput_device *idev, struct 
libinput_event_pointer
    ptr = _evdev_pointer_get(edev->seat);
    if (!ptr) return EINA_FALSE;
 
-   ptr->seat->pointer.x =
+   x = edev->absx;
+   edev->absx =
      libinput_event_pointer_get_absolute_x_transformed(event, edev->ow);
-   ptr->seat->pointer.y =
+   ptr->seat->pointer.x = edev->absx;
+
+   y = edev->absy;
+   edev->absy =
      libinput_event_pointer_get_absolute_y_transformed(event, edev->oh);
+   ptr->seat->pointer.y = edev->absy;
+
    ptr->timestamp = libinput_event_pointer_get_time(event);
 
    /* TODO: these needs to run a matrix transform based on output */
 
    _pointer_motion_send(edev);
-   _pointer_motion_relative(event);
+   _pointer_motion_relative_fake(event, edev->absx - x, edev->absy - y);
 
    return EINA_TRUE;
 }
diff --git a/src/lib/elput/elput_private.h b/src/lib/elput/elput_private.h
index 709871c368..f5bc425182 100644
--- a/src/lib/elput/elput_private.h
+++ b/src/lib/elput/elput_private.h
@@ -231,6 +231,8 @@ struct _Elput_Device
 
    uint32_t ow, oh;
 
+   double absx, absy;
+
    const char *path;
    const char *output_name;
    struct libinput_device *device;

-- 


Reply via email to