diff options
author | Daniel Stone <daniel@fooishbar.org> | 2010-03-11 14:19:04 +0200 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2010-03-12 13:06:22 +1000 |
commit | a2ea8c2f2cc53607d57d60f41c879380ea70cd02 (patch) | |
tree | 59c25a61febbeff6e7a26ed33da1517984b96b9d | |
parent | f2eacb4646beb25d055de22868f93e6b24f229b6 (diff) |
Record: Avoid duplicates from replaying frozen events
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@fooishbar.org>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | Xi/exevents.c | 2 | ||||
-rw-r--r-- | dix/events.c | 28 | ||||
-rw-r--r-- | include/inputstr.h | 30 |
3 files changed, 32 insertions, 28 deletions
diff --git a/Xi/exevents.c b/Xi/exevents.c index a63b65b6b..e680f6fb8 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 8af8c5ac7..0e9bc3131 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; +EventSyncInfoRec syncEvents; /** * The root window the given device is currently on. diff --git a/include/inputstr.h b/include/inputstr.h index 29ad5a814..15184d071 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. + */ +typedef struct _EventSyncInfo { + 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; +} EventSyncInfoRec, *EventSyncInfoPtr; + +extern EventSyncInfoRec syncEvents; + #endif /* INPUTSTRUCT_H */ |