From: Yufeng Shen <[email protected]> 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 <[email protected]> --- src/evdev.c | 16 ++++++++++++++++ src/evdev.h | 1 + 2 files changed, 17 insertions(+), 0 deletions(-) diff --git a/src/evdev.c b/src/evdev.c index 5667dc1..6564cd0 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 @@ -1792,6 +1798,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. */ @@ -1809,6 +1821,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 51b7fa0..58a3fa3 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -177,6 +177,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.7.7.3 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
