On Mon, Oct 29, 2012 at 06:33:50PM +0100, Carlos Garnacho wrote: > From: Carlos Garnacho <[email protected]> > > The emulated motion event that happens before TouchBegin/ButtonPress should > contain no buttons set in the mask, as it virtually happens at a time when > the button is not yet pressed. This is known to confuse GTK+ and Abiword > to different degrees, as enclosing button press/release events are expected > around changes in the button mask. > > Signed-off-by: Carlos Garnacho <[email protected]>
thanks, patch does what it should, but unfortunately this this only fixes part of the problem. Have a look at the test cases here: http://cgit.freedesktop.org/~whot/xorg-integration-tests/commit/?h=carlos-update-device-state-fix&id=d1fc25e162d2e52395ae0032230b73f95701a680 Your patch fixes the problem of the motion event having the wrong state, but ButtonPress and ButtonRelease too have the wrong state. - XI2 button press event has button down (bad) - XI2 button release event has state 0 (bad, should have button 1 mask set) Filed https://bugs.freedesktop.org/56558 - core events are completely broken, we never see button events on the root window Filed https://bugs.freedesktop.org/56557 So, pointer emulation is pretty much broken, and those were only the issues I found with the first couple of simple tests... :( I'll hold out on this patch for now until we've figured out what the complete patch would be Cheers, Peter > --- > Xi/exevents.c | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) > > diff --git a/Xi/exevents.c b/Xi/exevents.c > index 6ed4991..8a2f7ee 100644 > --- a/Xi/exevents.c > +++ b/Xi/exevents.c > @@ -1568,15 +1568,16 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev) > else > touchid = ev->device_event.touchid; > > - if (emulate_pointer) > - UpdateDeviceState(dev, &ev->device_event); > - > if (type == ET_TouchBegin) { > ti = TouchBeginTouch(dev, ev->device_event.sourceid, touchid, > emulate_pointer); > } > - else > + else { > + if (emulate_pointer) > + UpdateDeviceState(dev, &ev->device_event); > + > ti = TouchFindByClientID(dev, touchid); > + } > > /* Under the following circumstances we create a new touch record for an > * existing touch: > @@ -1615,8 +1616,12 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev) > /* if emulate_pointer is set, emulate the motion event right > * here, so we can ignore it for button event emulation. TouchUpdate > * events which _only_ emulate motion just work normally */ > - if (emulate_pointer && ev->any.type != ET_TouchUpdate) > + if (emulate_pointer && ev->any.type != ET_TouchUpdate) { > DeliverEmulatedMotionEvent(dev, ti, ev); > + > + if (ev->any.type == ET_TouchBegin) > + UpdateDeviceState(dev, &ev->device_event); > + } > if (emulate_pointer && IsMaster(dev)) > CheckMotion(&ev->device_event, dev); > > -- > 1.7.11.7 > > _______________________________________________ > [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
