[PATCH evdev 1/2] Use monotonic timestamps for input events #59702

Chung-yih Wang cywang at chromium.org
Wed Mar 27 04:13:45 PDT 2013


From: Yufeng Shen <miletus at chromium.org>

This patch adds the support for xf86-input-evdev to turn on monotonic
timestamps if kernel supports it.

And it corrects a previous similar patch by setting the clock source
at the right place in EvdevOn() instead of EvdevCache(). EvdevCache()
is only called once when X registers the input device fd with kernel,
and if later X closes and reopens the input device fd (e.g. when the
system goes through suspend/resume cycle), the clock source setting
will be lost. EvdevOn() is the right place to set clock source since
it is called whenever X wants to open the input device and use it.

Signed-off-by: Chung-yih Wang <cywang at chromium.org>
---
 src/evdev.c | 16 ++++++++++++++++
 src/evdev.h |  1 +
 2 files changed, 17 insertions(+)

diff --git a/src/evdev.c b/src/evdev.c
index 052e9f0..bc7729e 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -43,6 +43,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <time.h>
 
 #include <xf86.h>
 #include <xf86Xinput.h>
@@ -62,6 +63,11 @@
 #define XI_PROP_VIRTUAL_DEVICE "Virtual Device"
 #endif
 
+/* Set clockid to be used for timestamps */
+#ifndef EVIOCSCLOCKID
+#define EVIOCSCLOCKID  _IOW('E', 0xa0, int)
+#endif
+
 /* removed from server, purge when dropping support for server 1.10 */
 #define XI86_SEND_DRAG_EVENTS   0x08
 
@@ -1883,6 +1889,12 @@ EvdevInit(DeviceIntPtr device)
     return Success;
 }
 
+static int
+EvdevEnableMonotonic(InputInfoPtr pInfo) {
+    unsigned int clk = CLOCK_MONOTONIC;
+    return (ioctl(pInfo->fd, EVIOCSCLOCKID, &clk) == 0) ? Success : !Success;
+}
+
 /**
  * Init all extras (wheel emulation, etc.) and grab the device.
  */
@@ -1900,6 +1912,10 @@ EvdevOn(DeviceIntPtr device)
     if (rc != Success)
         return rc;
 
+    pEvdev->is_monotonic = (EvdevEnableMonotonic(pInfo) == Success);
+    xf86IDrvMsg(pInfo, X_PROBED, "Using %s input event time stamps\n",
+                pEvdev->is_monotonic ? "monotonic" : "realtime");
+
     EvdevGrabDevice(pInfo, 1, 0);
 
     xf86FlushInput(pInfo->fd);
diff --git a/src/evdev.h b/src/evdev.h
index 63c3bfa..d55cccf 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -178,6 +178,7 @@ typedef struct {
     BOOL swap_axes;
     BOOL invert_x;
     BOOL invert_y;
+    BOOL is_monotonic;
 
     int delta[REL_CNT];
     unsigned int abs_queued, rel_queued, prox_queued;
-- 
1.8.1.3



More information about the xorg-devel mailing list