[PATCH xserver] dix: Don't update current time in the middle of input event processing
Peter Hutterer
peter.hutterer at who-t.net
Wed Jun 1 06:56:14 UTC 2016
On Fri, May 27, 2016 at 05:49:52PM -0700, Keith Packard wrote:
> In patch 137ac094e7ab8c871f3b36e40ad826ac797f0e26, Adam moved an
> expensive call to UpdateCurrentTime out of the main dispatch
> loop. That's a good change as the original fix from Chase was a bit
> expensive. However, it breaks grab processing and so a couple of the
> calls to UpdateCurrenTime need to be removed.
>
> Input event processing can generate a stream of events; a button press
> that activates a grab will send a press followed by a sequence of
> enter/leave events. All of these should have the same time stamp on
> the wire as they occur at the 'same' time.
>
> More importantly, the grab time recorded in the device is pulled from
> currentTime after all of the events are delivered, so if currentTime
> doesn't match the time in the device event, then future grab
> modifications will fail as the time marked in the device will be
> 'later' than the grab time known to the client (which is defined as
> the timestamp from the activating input event).
>
> A bit of history here -- it used to be that currentTime was driven
> *entirely* by input events; those timestamps didn't even have to be
> related to the system time in any way. Then we started doing ICCCM
> stuff and people got confused when PropertyNotify events would have
> the same timestamp even when delivered minutes apart because no input
> events were delivered.
>
> We added code in the server to go update the time, but only if no
> input events were pending (so that the clock "wouldn't" go
> backwards). The only places where this is necessary is in request
> processing which may generate an event with a timestamp, and there
> only at the very top of the request processing code so that the whole
> request would be processed at the 'same time', just like events.
>
> cc: Chase Douglas <chase.douglas at canonical.com>
> cc: Peter Hutterer <peter.hutterer at who-t.net>
> cc: Adam Jackson <ajax at redhat.com>
> Signed-off-by: Keith Packard <keithp at keithp.com>
Acked-by: Peter Hutterer <peter.hutterer at who-t.net>
Cheers,
Peter
> ---
> dix/enterleave.c | 1 -
> dix/events.c | 1 -
> 2 files changed, 2 deletions(-)
>
> diff --git a/dix/enterleave.c b/dix/enterleave.c
> index 0c6c616..1b341f2 100644
> --- a/dix/enterleave.c
> +++ b/dix/enterleave.c
> @@ -782,7 +782,6 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
> DeviceIntPtr mouse;
> int btlen, len, i;
>
> - UpdateCurrentTimeIf();
> mouse = IsFloating(dev) ? dev : GetMaster(dev, MASTER_POINTER);
>
> /* XI 2 event */
> diff --git a/dix/events.c b/dix/events.c
> index 0404eba..8efdf18 100644
> --- a/dix/events.c
> +++ b/dix/events.c
> @@ -2242,7 +2242,6 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
> this mask is the mask of the grab. */
> int type = pEvents->u.u.type;
>
> - UpdateCurrentTimeIf();
> /* Deliver to window owner */
> if ((filter == CantBeFiltered) || core_get_type(pEvents) != 0) {
> enum EventDeliveryState rc;
> --
> 2.8.1
>
More information about the xorg-devel
mailing list