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 <[email protected]> > --- > 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 <[email protected]> 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 > _______________________________________________ xorg-devel mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-devel
