mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-02-18 17:40:39 +01:00
dix: release all buttons and keys before reattaching a device (#34182)
Testcase:
xinput float <keyboard name>
results in the keyboard's enter key being repeated as the device is detached
while the key is still physically down. To avoid this, release all keys and
buttons before reattaching the device.
X.Org Bug 34182 <http://bugs.freedesktop.org/show_bug.cgi?id=34182>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Fernando Carrijo <fcarrijo@freedesktop.org>
(cherry picked from commit 9d23459415)
This commit is contained in:
parent
49afcc76a1
commit
81fbb96c54
1 changed files with 42 additions and 0 deletions
|
|
@ -2379,6 +2379,46 @@ RecalculateMasterButtons(DeviceIntPtr slave)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate release events for all keys/button currently down on this
|
||||
* device.
|
||||
*/
|
||||
static void
|
||||
ReleaseButtonsAndKeys(DeviceIntPtr dev)
|
||||
{
|
||||
EventListPtr eventlist = InitEventList(GetMaximumEventsNum());
|
||||
ButtonClassPtr b = dev->button;
|
||||
KeyClassPtr k = dev->key;
|
||||
int i, j, nevents;
|
||||
|
||||
if (!eventlist) /* no release events for you */
|
||||
return;
|
||||
|
||||
/* Release all buttons */
|
||||
for (i = 0; b && i < b->numButtons; i++)
|
||||
{
|
||||
if (BitIsOn(b->down, i))
|
||||
{
|
||||
nevents = GetPointerEvents(eventlist, dev, ButtonRelease, i, 0, NULL);
|
||||
for (j = 0; j < nevents; j++)
|
||||
mieqProcessDeviceEvent(dev, (InternalEvent*)(eventlist+j)->event, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* Release all keys */
|
||||
for (i = 0; k && i < MAP_LENGTH; i++)
|
||||
{
|
||||
if (BitIsOn(k->down, i))
|
||||
{
|
||||
nevents = GetKeyboardEvents(eventlist, dev, KeyRelease, i);
|
||||
for (j = 0; j < nevents; j++)
|
||||
mieqProcessDeviceEvent(dev, (InternalEvent*)(eventlist+j)->event, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
FreeEventList(eventlist, GetMaximumEventsNum());
|
||||
}
|
||||
|
||||
/**
|
||||
* Attach device 'dev' to device 'master'.
|
||||
* Client is set to the client that issued the request, or NULL if it comes
|
||||
|
|
@ -2412,6 +2452,8 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
|
|||
free(dev->spriteInfo->sprite);
|
||||
}
|
||||
|
||||
ReleaseButtonsAndKeys(dev);
|
||||
|
||||
oldmaster = dev->u.master;
|
||||
dev->u.master = master;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue