[PATCH] Record: Avoid duplicates from replaying frozen events
Peter Hutterer
peter.hutterer at who-t.net
Mon Mar 1 17:53:50 PST 2010
On Fri, Feb 26, 2010 at 02:06:00PM +0200, Daniel Stone wrote:
> Reintroduce a check which used to be there in the old
> ProcessKeyboardEvent/ProcessPointerEvent codepath, which avoids us
> recording events subject to a grab twice: once when it's first processed
> in EnqueueEvent, and then again when it's thawed and being replayed.
>
> This required a tiny amount of code motion to expose syncEvents.
>
> Signed-off-by: Daniel Stone <daniel at fooishbar.org>
> ---
> Xi/exevents.c | 2 +-
> dix/events.c | 28 +---------------------------
> include/inputstr.h | 30 ++++++++++++++++++++++++++++++
> 3 files changed, 32 insertions(+), 28 deletions(-)
>
> diff --git a/Xi/exevents.c b/Xi/exevents.c
> index a63b65b..e680f6f 100644
> --- a/Xi/exevents.c
> +++ b/Xi/exevents.c
> @@ -1051,7 +1051,7 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
> break;
> }
>
> - if (DeviceEventCallback) {
> + if (DeviceEventCallback && !syncEvents.playingEvents) {
> DeviceEventInfoRec eventinfo;
> SpritePtr pSprite = device->spriteInfo->sprite;
>
> diff --git a/dix/events.c b/dix/events.c
> index 2e94726..2568259 100644
> --- a/dix/events.c
> +++ b/dix/events.c
> @@ -253,33 +253,7 @@ extern BOOL EventIsKeyRepeat(xEvent *event);
> */
> InputInfo inputInfo;
>
> -/**
> - * syncEvents is the global structure for queued events.
> - *
> - * Devices can be frozen through GrabModeSync pointer grabs. If this is the
> - * case, events from these devices are added to "pending" instead of being
> - * processed normally. When the device is unfrozen, events in "pending" are
> - * replayed and processed as if they would come from the device directly.
> - */
> -static struct {
> - QdEventPtr pending, /**< list of queued events */
> - *pendtail; /**< last event in list */
> - /** The device to replay events for. Only set in AllowEvents(), in which
> - * case it is set to the device specified in the request. */
> - DeviceIntPtr replayDev; /* kludgy rock to put flag for */
> -
> - /**
> - * The window the events are supposed to be replayed on.
> - * This window may be set to the grab's window (but only when
> - * Replay{Pointer|Keyboard} is given in the XAllowEvents()
> - * request. */
> - WindowPtr replayWin; /* ComputeFreezes */
> - /**
> - * Flag to indicate whether we're in the process of
> - * replaying events. Only set in ComputeFreezes(). */
> - Bool playingEvents;
> - TimeStamp time;
> -} syncEvents;
> +struct event_sync_info syncEvents;
most of the DIX code uses a notation in the form of EventSyncRec and
EventSyncPtr. Not pretty, but I'd prefer it that way for consistency.
other than that
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
Cheers,
Peter
> /**
> * The root window the given device is currently on.
> diff --git a/include/inputstr.h b/include/inputstr.h
> index 29ad5a8..82beb9f 100644
> --- a/include/inputstr.h
> +++ b/include/inputstr.h
> @@ -557,4 +557,34 @@ typedef struct _QdEvent {
> InternalEvent *event;
> } QdEventRec;
>
> +/**
> + * syncEvents is the global structure for queued events.
> + *
> + * Devices can be frozen through GrabModeSync pointer grabs. If this is the
> + * case, events from these devices are added to "pending" instead of being
> + * processed normally. When the device is unfrozen, events in "pending" are
> + * replayed and processed as if they would come from the device directly.
> + */
> +struct event_sync_info {
> + QdEventPtr pending, /**< list of queued events */
> + *pendtail; /**< last event in list */
> + /** The device to replay events for. Only set in AllowEvents(), in which
> + * case it is set to the device specified in the request. */
> + DeviceIntPtr replayDev; /* kludgy rock to put flag for */
> +
> + /**
> + * The window the events are supposed to be replayed on.
> + * This window may be set to the grab's window (but only when
> + * Replay{Pointer|Keyboard} is given in the XAllowEvents()
> + * request. */
> + WindowPtr replayWin; /* ComputeFreezes */
> + /**
> + * Flag to indicate whether we're in the process of
> + * replaying events. Only set in ComputeFreezes(). */
> + Bool playingEvents;
> + TimeStamp time;
> +} syncEvents;
> +
> +extern struct event_sync_info syncEvents;
> +
> #endif /* INPUTSTRUCT_H */
> --
> 1.6.2.5
>
More information about the xorg-devel
mailing list