Passive touch grab on master device and touch event mask on slave device breaks pointer emulation
Submitted by Daniel d'Andrada
Assigned to Peter Hutterer @whot
Description
It happens on Ubuntu running on laptop with a touchscreen.
Scenario:
-
There's a small window whose client called XISelectEvents on it for the touchscreen slave device with mask=XI_TouchBegin|XI_TouchUpdate|XI_TouchEnd (client[5290, /usr/lib/x86_64-linux-gnu/qt5/bin/qmlscene qml-demo-minimal-client.qml] in the logs).
-
compiz and nautilus (which handles the desktop background) have selections and/or grabs on the master device
Actions:
1- user taps the qmlscene window. Touch events are reported to both qmlscene (from the slave device) and to compiz (from the master device). compiz rejects the touch sequence and it's not delivered to anyone else
2- user now presses on the desktop background. TouchBegin, TouchOwnership and further TouchUpdates are sent to compiz.
3- compiz rejects the touch sequence. TouchPuntToNextOwner fails to emulate a pointer and pass it to nautilus as it still thinks that touch 1 is active. And as per pointer emulation rules, only the oldest active touch is used for touch emulation. From the logs, the lines are:
""" [ 9223.917] (II) TouchPuntToNextOwner: touch 2 [ 9223.917] (II) - Not all older pointer emulated touches have been seen yet. Oldest touch(client_id=1, active=1, pending_finish=0, emulate_pointer=1). """
4- user lifts his finger
So that scenario on touch 1 clearly left xserver in an inconsistent, buggy, state.