[PATCH] Record: Avoid duplicates from replaying frozen events

Peter Hutterer peter.hutterer at who-t.net
Thu Mar 11 04:21:32 PST 2010


On Thu, Mar 11, 2010 at 02:19:04PM +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..7ad64ca 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 29ad5a8..15184d0 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 */
> -- 
> 1.6.2.5

Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

Cheers,
  Peter


More information about the xorg-devel mailing list