dix: don't search for grabbed devices, PickPointer does it for us now.
Follow-up to 93ee338307
.
This commit is contained in:
parent
6198bad07e
commit
b093bf3ec3
153
dix/events.c
153
dix/events.c
|
@ -1861,43 +1861,19 @@ AllowSome(ClientPtr client,
|
||||||
* Server-side protocol handling for AllowEvents request.
|
* Server-side protocol handling for AllowEvents request.
|
||||||
*
|
*
|
||||||
* Release some events from a frozen device.
|
* Release some events from a frozen device.
|
||||||
*
|
|
||||||
* In some cases, the grab the client has is not on the ClientPointer but on
|
|
||||||
* some other device (see ProcGrabPointer comments). To cover this case, we
|
|
||||||
* need to run through all devices to ensure we don't forget the device we
|
|
||||||
* actually have a grab on.
|
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
ProcAllowEvents(ClientPtr client)
|
ProcAllowEvents(ClientPtr client)
|
||||||
{
|
{
|
||||||
TimeStamp time;
|
TimeStamp time;
|
||||||
DeviceIntPtr mouse = NULL,
|
DeviceIntPtr mouse = NULL;
|
||||||
grabbed;
|
|
||||||
DeviceIntPtr keybd = NULL;
|
DeviceIntPtr keybd = NULL;
|
||||||
GrabPtr grab;
|
|
||||||
REQUEST(xAllowEventsReq);
|
REQUEST(xAllowEventsReq);
|
||||||
|
|
||||||
REQUEST_SIZE_MATCH(xAllowEventsReq);
|
REQUEST_SIZE_MATCH(xAllowEventsReq);
|
||||||
time = ClientTimeToServerTime(stuff->time);
|
time = ClientTimeToServerTime(stuff->time);
|
||||||
|
|
||||||
for (grabbed = inputInfo.devices; grabbed; grabbed = grabbed->next)
|
|
||||||
{
|
|
||||||
grab = grabbed->deviceGrab.grab;
|
|
||||||
if (grab && grab->coreGrab && SameClient(grab, client))
|
|
||||||
{
|
|
||||||
if (IsPointerDevice(grabbed))
|
|
||||||
mouse = grabbed;
|
|
||||||
else if (IsKeyboardDevice(grabbed))
|
|
||||||
keybd = grabbed;
|
|
||||||
|
|
||||||
if (mouse && keybd)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!mouse)
|
|
||||||
mouse = PickPointer(client);
|
mouse = PickPointer(client);
|
||||||
if (!keybd)
|
|
||||||
keybd = PickKeyboard(client);
|
keybd = PickKeyboard(client);
|
||||||
|
|
||||||
switch (stuff->mode)
|
switch (stuff->mode)
|
||||||
|
@ -5061,12 +5037,6 @@ ProcGetInputFocus(ClientPtr client)
|
||||||
*
|
*
|
||||||
* Sets an active grab on the client's ClientPointer and returns success
|
* Sets an active grab on the client's ClientPointer and returns success
|
||||||
* status to client.
|
* status to client.
|
||||||
*
|
|
||||||
* A special case of GrabPointer is when there is already a grab on some
|
|
||||||
* device (by the same client). In this case, this grab is overwritten, and
|
|
||||||
* the device stays as it is. This case can happen when a client has a passive
|
|
||||||
* grab and then grabs the pointer, or when the client already has an active
|
|
||||||
* grab and the ClientPointer was changed since.
|
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
ProcGrabPointer(ClientPtr client)
|
ProcGrabPointer(ClientPtr client)
|
||||||
|
@ -5080,7 +5050,6 @@ ProcGrabPointer(ClientPtr client)
|
||||||
TimeStamp time;
|
TimeStamp time;
|
||||||
Mask access_mode = DixGrabAccess;
|
Mask access_mode = DixGrabAccess;
|
||||||
int rc;
|
int rc;
|
||||||
DeviceIntPtr grabbed = NULL;
|
|
||||||
|
|
||||||
REQUEST_SIZE_MATCH(xGrabPointerReq);
|
REQUEST_SIZE_MATCH(xGrabPointerReq);
|
||||||
UpdateCurrentTime();
|
UpdateCurrentTime();
|
||||||
|
@ -5144,20 +5113,6 @@ ProcGrabPointer(ClientPtr client)
|
||||||
rep.sequenceNumber = client->sequence;
|
rep.sequenceNumber = client->sequence;
|
||||||
rep.length = 0;
|
rep.length = 0;
|
||||||
|
|
||||||
/* Check if a the client already has a grab on a device */
|
|
||||||
for(grabbed = inputInfo.devices; grabbed; grabbed = grabbed->next)
|
|
||||||
{
|
|
||||||
if (IsPointerDevice(grabbed))
|
|
||||||
{
|
|
||||||
grab = grabbed->deviceGrab.grab;
|
|
||||||
if (grab && grab->coreGrab && SameClient(grab, client))
|
|
||||||
{
|
|
||||||
device = grabbed;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
grab = device->deviceGrab.grab;
|
grab = device->deviceGrab.grab;
|
||||||
/* check for
|
/* check for
|
||||||
1. other client has a grab on the device already.
|
1. other client has a grab on the device already.
|
||||||
|
@ -5219,15 +5174,11 @@ ProcGrabPointer(ClientPtr client)
|
||||||
*
|
*
|
||||||
* Changes properties of the grab hold by the client. If the client does not
|
* Changes properties of the grab hold by the client. If the client does not
|
||||||
* hold an active grab on the device, nothing happens.
|
* hold an active grab on the device, nothing happens.
|
||||||
*
|
|
||||||
* Works on the client's ClientPointer, but in some cases the client may have
|
|
||||||
* a grab on a device that isn't the ClientPointer (see ProcGrabPointer
|
|
||||||
* comments).
|
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
ProcChangeActivePointerGrab(ClientPtr client)
|
ProcChangeActivePointerGrab(ClientPtr client)
|
||||||
{
|
{
|
||||||
DeviceIntPtr device, grabbed;
|
DeviceIntPtr device;
|
||||||
GrabPtr grab;
|
GrabPtr grab;
|
||||||
CursorPtr newCursor, oldCursor;
|
CursorPtr newCursor, oldCursor;
|
||||||
REQUEST(xChangeActivePointerGrabReq);
|
REQUEST(xChangeActivePointerGrabReq);
|
||||||
|
@ -5255,26 +5206,6 @@ ProcChangeActivePointerGrab(ClientPtr client)
|
||||||
device = PickPointer(client);
|
device = PickPointer(client);
|
||||||
grab = device->deviceGrab.grab;
|
grab = device->deviceGrab.grab;
|
||||||
|
|
||||||
if (!grab || !SameClient(grab, client))
|
|
||||||
{
|
|
||||||
/* no grab on ClientPointer, or some other client has a grab on our
|
|
||||||
* ClientPointer, let's check if we have a pointer grab on some other
|
|
||||||
* device. */
|
|
||||||
for(grabbed = inputInfo.devices; grabbed; grabbed = grabbed->next)
|
|
||||||
{
|
|
||||||
if (IsPointerDevice(grabbed))
|
|
||||||
{
|
|
||||||
grab = grabbed->deviceGrab.grab;
|
|
||||||
if (grab && grab->coreGrab && SameClient(grab, client))
|
|
||||||
{
|
|
||||||
device = grabbed;
|
|
||||||
grab = device->deviceGrab.grab;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!grab)
|
if (!grab)
|
||||||
return Success;
|
return Success;
|
||||||
if (!SameClient(grab, client))
|
if (!SameClient(grab, client))
|
||||||
|
@ -5297,17 +5228,12 @@ ProcChangeActivePointerGrab(ClientPtr client)
|
||||||
/**
|
/**
|
||||||
* Server-side protocol handling for UngrabPointer request.
|
* Server-side protocol handling for UngrabPointer request.
|
||||||
*
|
*
|
||||||
* Deletes a pointer grab on a device the client has grabbed. This should be
|
* Deletes a pointer grab on a device the client has grabbed.
|
||||||
* the ClientPointer, but may not be. So we search the device list for a
|
|
||||||
* device we have a pointer grab on and then ungrab this device. (see
|
|
||||||
* ProcGrabPointer comments). We are guaranteed that the client doesn't have
|
|
||||||
* more than one core pointer grab at a time.
|
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
ProcUngrabPointer(ClientPtr client)
|
ProcUngrabPointer(ClientPtr client)
|
||||||
{
|
{
|
||||||
DeviceIntPtr device = PickPointer(client),
|
DeviceIntPtr device = PickPointer(client);
|
||||||
grabbed;
|
|
||||||
GrabPtr grab;
|
GrabPtr grab;
|
||||||
TimeStamp time;
|
TimeStamp time;
|
||||||
REQUEST(xResourceReq);
|
REQUEST(xResourceReq);
|
||||||
|
@ -5316,30 +5242,6 @@ ProcUngrabPointer(ClientPtr client)
|
||||||
UpdateCurrentTime();
|
UpdateCurrentTime();
|
||||||
grab = device->deviceGrab.grab;
|
grab = device->deviceGrab.grab;
|
||||||
|
|
||||||
if (!grab || !grab->coreGrab || !SameClient(grab, client))
|
|
||||||
{
|
|
||||||
/* No pointer grab on ClientPointer. May be a pointer grab on some
|
|
||||||
* other device */
|
|
||||||
for(grabbed = inputInfo.devices; grabbed; grabbed = grabbed->next)
|
|
||||||
{
|
|
||||||
if (IsPointerDevice(grabbed))
|
|
||||||
{
|
|
||||||
grab = grabbed->deviceGrab.grab;
|
|
||||||
if (grab && grab->coreGrab && SameClient(grab, client))
|
|
||||||
{
|
|
||||||
device = grabbed;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* nope. no grab on any actual device */
|
|
||||||
if (!grabbed)
|
|
||||||
{
|
|
||||||
device = inputInfo.pointer;
|
|
||||||
grab = inputInfo.pointer->deviceGrab.grab;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
time = ClientTimeToServerTime(stuff->id);
|
time = ClientTimeToServerTime(stuff->id);
|
||||||
if ((CompareTimeStamps(time, currentTime) != LATER) &&
|
if ((CompareTimeStamps(time, currentTime) != LATER) &&
|
||||||
(CompareTimeStamps(time, device->deviceGrab.grabTime) != EARLIER) &&
|
(CompareTimeStamps(time, device->deviceGrab.grabTime) != EARLIER) &&
|
||||||
|
@ -5487,15 +5389,6 @@ RemoveOtherCoreGrabs(ClientPtr client, DeviceIntPtr dev)
|
||||||
* Server-side protocol handling for GrabKeyboard request.
|
* Server-side protocol handling for GrabKeyboard request.
|
||||||
*
|
*
|
||||||
* Grabs the client's keyboard and returns success status to client.
|
* Grabs the client's keyboard and returns success status to client.
|
||||||
*
|
|
||||||
* In some special cases the client may already have a grab on a keyboard that
|
|
||||||
* is not the one that is paired with the ClientPointer. This can happen when
|
|
||||||
* the client alreay has a passive grab on some keyboard device, or when the
|
|
||||||
* client actively grabbed the keyboard and the ClientPointer or keyboard
|
|
||||||
* pairing was changed since.
|
|
||||||
* Therefore, we need to run through all the keyboards available and check if
|
|
||||||
* there's already a grab on it from our client. The client will only ever
|
|
||||||
* have one core keyboard grab at a time.
|
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
ProcGrabKeyboard(ClientPtr client)
|
ProcGrabKeyboard(ClientPtr client)
|
||||||
|
@ -5503,24 +5396,10 @@ ProcGrabKeyboard(ClientPtr client)
|
||||||
xGrabKeyboardReply rep;
|
xGrabKeyboardReply rep;
|
||||||
REQUEST(xGrabKeyboardReq);
|
REQUEST(xGrabKeyboardReq);
|
||||||
int result;
|
int result;
|
||||||
DeviceIntPtr keyboard = PickKeyboard(client),
|
DeviceIntPtr keyboard = PickKeyboard(client);
|
||||||
grabbed;
|
|
||||||
GrabPtr grab;
|
|
||||||
|
|
||||||
REQUEST_SIZE_MATCH(xGrabKeyboardReq);
|
REQUEST_SIZE_MATCH(xGrabKeyboardReq);
|
||||||
|
|
||||||
for (grabbed = inputInfo.devices; grabbed; grabbed = grabbed->next)
|
|
||||||
{
|
|
||||||
if (IsKeyboardDevice(grabbed))
|
|
||||||
{
|
|
||||||
grab = grabbed->deviceGrab.grab;
|
|
||||||
if (grab && grab->coreGrab && SameClient(grab, client))
|
|
||||||
{
|
|
||||||
keyboard = grabbed;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result = GrabDevice(client, keyboard, stuff->keyboardMode,
|
result = GrabDevice(client, keyboard, stuff->keyboardMode,
|
||||||
stuff->pointerMode, stuff->grabWindow,
|
stuff->pointerMode, stuff->grabWindow,
|
||||||
stuff->ownerEvents, stuff->time,
|
stuff->ownerEvents, stuff->time,
|
||||||
|
@ -5542,16 +5421,11 @@ ProcGrabKeyboard(ClientPtr client)
|
||||||
* Server-side protocol handling for UngrabKeyboard request.
|
* Server-side protocol handling for UngrabKeyboard request.
|
||||||
*
|
*
|
||||||
* Deletes a possible grab on the client's keyboard.
|
* Deletes a possible grab on the client's keyboard.
|
||||||
*
|
|
||||||
* We may have a grab on a keyboard that isn't the ClientPointer's keyboard.
|
|
||||||
* Thus we need to check all keyboar devices for a grab. (see ProcGrabKeyboard
|
|
||||||
* comments)
|
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
ProcUngrabKeyboard(ClientPtr client)
|
ProcUngrabKeyboard(ClientPtr client)
|
||||||
{
|
{
|
||||||
DeviceIntPtr device = PickKeyboard(client),
|
DeviceIntPtr device = PickKeyboard(client);
|
||||||
grabbed;
|
|
||||||
GrabPtr grab;
|
GrabPtr grab;
|
||||||
TimeStamp time;
|
TimeStamp time;
|
||||||
REQUEST(xResourceReq);
|
REQUEST(xResourceReq);
|
||||||
|
@ -5561,21 +5435,6 @@ ProcUngrabKeyboard(ClientPtr client)
|
||||||
|
|
||||||
grab = device->deviceGrab.grab;
|
grab = device->deviceGrab.grab;
|
||||||
|
|
||||||
if (!grab || !grab->coreGrab || !SameClient(grab, client))
|
|
||||||
{
|
|
||||||
for (grabbed = inputInfo.devices; grabbed; grabbed = grabbed->next)
|
|
||||||
{
|
|
||||||
if (IsKeyboardDevice(grabbed))
|
|
||||||
{
|
|
||||||
grab = device->deviceGrab.grab;
|
|
||||||
if (grab && grab->coreGrab && SameClient(grab, client))
|
|
||||||
{
|
|
||||||
device = grabbed;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
grab = device->deviceGrab.grab;
|
grab = device->deviceGrab.grab;
|
||||||
|
|
||||||
time = ClientTimeToServerTime(stuff->id);
|
time = ClientTimeToServerTime(stuff->id);
|
||||||
|
|
Loading…
Reference in New Issue