Input: Store passive-activating key in CheckDeviceGrabs
CheckDeviceGrabs will activate a passive grab for KeyPress and ButtonPress events. GrabInfoRec::activatingKey contains the keycode which activated the passive grab, so we can deactivate it later in ProcessOtherEvents. Previously, CheckDeviceGrabs relied on its callers to set activatingKey, which not all callers were doing (I'm looking at you, ComputeFreezes). Just set it in CheckDeviceGrabs instead. Signed-off-by: Daniel Stone <daniel@fooishbar.org> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
0f9c6f2f82
commit
da39d57a20
|
@ -1047,10 +1047,8 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
|
|||
switch(event->type)
|
||||
{
|
||||
case ET_KeyPress:
|
||||
if (!grab && CheckDeviceGrabs(device, event, 0)) {
|
||||
device->deviceGrab.activatingKey = key;
|
||||
if (!grab && CheckDeviceGrabs(device, event, 0))
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case ET_KeyRelease:
|
||||
if (grab && device->deviceGrab.fromPassiveGrab &&
|
||||
|
|
20
dix/events.c
20
dix/events.c
|
@ -3582,6 +3582,7 @@ CheckDeviceGrabs(DeviceIntPtr device, DeviceEvent *event, WindowPtr ancestor)
|
|||
WindowPtr pWin = NULL;
|
||||
FocusClassPtr focus = IsPointerEvent((InternalEvent*)event) ? NULL : device->focus;
|
||||
BOOL sendCore = (IsMaster(device) && device->coreEvents);
|
||||
Bool ret = FALSE;
|
||||
|
||||
if (event->type != ET_ButtonPress &&
|
||||
event->type != ET_KeyPress)
|
||||
|
@ -3601,7 +3602,7 @@ CheckDeviceGrabs(DeviceIntPtr device, DeviceEvent *event, WindowPtr ancestor)
|
|||
if (device->spriteInfo->sprite->spriteTrace[i++] == ancestor)
|
||||
break;
|
||||
if (i == device->spriteInfo->sprite->spriteTraceGood)
|
||||
return FALSE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (focus)
|
||||
|
@ -3610,23 +3611,32 @@ CheckDeviceGrabs(DeviceIntPtr device, DeviceEvent *event, WindowPtr ancestor)
|
|||
{
|
||||
pWin = focus->trace[i];
|
||||
if (CheckPassiveGrabsOnWindow(pWin, device, event, sendCore, TRUE))
|
||||
return TRUE;
|
||||
{
|
||||
ret = TRUE;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if ((focus->win == NoneWin) ||
|
||||
(i >= device->spriteInfo->sprite->spriteTraceGood) ||
|
||||
(pWin && pWin != device->spriteInfo->sprite->spriteTrace[i-1]))
|
||||
return FALSE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (; i < device->spriteInfo->sprite->spriteTraceGood; i++)
|
||||
{
|
||||
pWin = device->spriteInfo->sprite->spriteTrace[i];
|
||||
if (CheckPassiveGrabsOnWindow(pWin, device, event, sendCore, TRUE))
|
||||
return TRUE;
|
||||
{
|
||||
ret = TRUE;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
out:
|
||||
if (ret == TRUE && event->type == ET_KeyPress)
|
||||
device->deviceGrab.activatingKey = event->detail.key;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue
Block a user