[PATCH evdev 1/2] Use monotonic timestamps for input events #59702
Peter Hutterer
peter.hutterer at who-t.net
Thu Jan 24 20:39:22 PST 2013
On Tue, Jan 22, 2013 at 05:50:00PM +0800, Chung-yih Wang wrote:
> 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>
> ---
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
Cheers,
Peter
> 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
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list