An attempt at fixing a bug involving DGA and mouse buttons

Ville Syrjälä syrjala at sci.fi
Wed Aug 22 06:04:46 PDT 2012


On Sat, Aug 18, 2012 at 08:46:01PM -0500, Steven Elliott wrote:
> I'd like to describe a bug I've encountered involving mouse events and
> DGA as well as my attempt at fixing it.  Hopefully either my patch is
> acceptable, or people will have ideas about how it can be improved.
> I'll mention some specifics about my setup at the end.
> 
> Recently I debugged a problem where an application I used seemed to
> break the X Server so that it was no longer possible to cause windows to
> gain focus by clicking on them.  The application is MCEdit.  It's a
> pygame based python program that edits Minecraft maps.
> 
> In MCEdit clicking the right mouse button engages a freelook mode so
> that moving the mouse changes the user's perspective instead of moving
> the mouse pointer.  Engaging freelook mode in MCEdit causes the problem
> which persists after MCEdit has been shutdown.
> 
> Debugging has revealed that the reason I'm no longer able cause windows
> to gain focus by clicking on them once freelook mode has been used in
> MCEdit is that device->button->buttonsDown ("buttonsDown" only occurs in
> one structure) is not decremented when the mouse button is released
> which causes CheckDeviceGrabs() to return early instead of sending the
> mouse button event to the window being clicked on.
> 
> Further debugging revealed that the reason buttonsDown is not
> decremented when the mouse is released has to do with the fact that DGA
> mode is active during freelook mode.  When DGA mode is active  (when it
> has registered a hook that is called for events so that DGAHandleEvent()
> is called for keyboard and mouse events instead of
> ProcessKeyboardEvent() and ProcessPointerEvent()) the following seems to
> be true:
>   1) DGAProcessPointerEvent() calls UpdateDeviceState() with mouse
> button events where ev.detail.key is not set.
>   2) DGAHandleEvent() refuses to process events that are not master
> events:
>         if (!IsMaster(device))
>             return;
>      which causes UpdateDeviceState() to ignore the master event as it
> thinks the child event has not been processed.

I added this early return because otherwise I would get multiple DGA
events for each button/key press/release.

Unfortunately I don't know the input code very well, so I can't say
whether your patch is he right approach or not. But I wonder if it
would be enough to move the master check to happen inside
DGAProcessKeyboardEvent() and DGAProcessPointerEvent(), after
they've called UpdateDeviceState().

-- 
Ville Syrjälä
syrjala at sci.fi
http://www.sci.fi/~syrjala/


More information about the xorg-devel mailing list