On Tue, Jan 8, 2013 at 11:51 AM, Peter Hutterer <[email protected]> wrote: > DGA only handles master devices but it does intercept slave device events as > well (since the event handlers are per event type, not per device). > > The DGA code must thus call into UpdateDeviceState to reset the button/key > state on the slave device before it discards the remainder of the event. > > Test case: > - Passive GrabModeSync on VCP > - Press button > - Enable DGA after ButtonPress > - AllowEvents(SyncPointer) > - Release button > > The button release is handled by DGAProcessPointerEvent but the device state > is never updated, so the slave ends up with the button permanently down. > And since the master's button state is the union of the slave states, the > master has the button permanently down. > > X.Org Bug 59100 <http://bugs.freedesktop.org/show_bug.cgi?id=59100> > > Reported-by: Steven Elliott <[email protected]> > Signed-off-by: Peter Hutterer <[email protected]>
LGTM, Reviewed-by: Dave Airlie <[email protected]> > --- > hw/xfree86/common/xf86DGA.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c > index c10dd32..6a05ce5 100644 > --- a/hw/xfree86/common/xf86DGA.c > +++ b/hw/xfree86/common/xf86DGA.c > @@ -1033,6 +1033,9 @@ DGAProcessKeyboardEvent(ScreenPtr pScreen, DGAEvent * > event, DeviceIntPtr keybd) > > UpdateDeviceState(keybd, &ev); > > + if (!IsMaster(keybd)) > + return; > + > /* > * Deliver the DGA event > */ > @@ -1084,6 +1087,9 @@ DGAProcessPointerEvent(ScreenPtr pScreen, DGAEvent * > event, DeviceIntPtr mouse) > > UpdateDeviceState(mouse, &ev); > > + if (!IsMaster(mouse)) > + return; > + > /* > * Deliver the DGA event > */ > @@ -1191,9 +1197,6 @@ DGAHandleEvent(int screen_num, InternalEvent *ev, > DeviceIntPtr device) > if (!pScreenPriv) > return; > > - if (!IsMaster(device)) > - return; > - > switch (event->subtype) { > case KeyPress: > case KeyRelease: > -- > 1.8.1 > > _______________________________________________ > [email protected]: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: http://lists.x.org/mailman/listinfo/xorg-devel _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
