mirror of
https://github.com/X11Libre/xserver.git
synced 2026-04-14 17:18:09 +00:00
Xi: ProcXIAllowEvents(): untwist request header handling
The Xi protocol has some pretty unclean design aspect: instead of adding a new sub-request type, version 2.2 introduced a different request structure with some extra fields. So depending on which version the client has selected, we need to operate on separate structs. In the current implementation, there's a unclean hack by using the extended structure and only accessing the extra fields when using v2.2 or above. Even though this works, it's making the code unnecessarily complicated and blocking the use if canonical request parsing macros (which are coming with subsequent commits). Thus, it's time to clean it up and only use the exactly correct structs in the two different cases. The trick is just branching by version and pick out the the interesting values from the corresponding structs, so they can later be used in the (mostly) version independent part. Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
committed by
Enrico Weigelt
parent
8c90875c3d
commit
6efd1a85e8
@@ -68,32 +68,46 @@ SProcXIAllowEvents(ClientPtr client)
|
||||
int
|
||||
ProcXIAllowEvents(ClientPtr client)
|
||||
{
|
||||
TimeStamp time;
|
||||
DeviceIntPtr dev;
|
||||
int ret = Success;
|
||||
XIClientPtr xi_client;
|
||||
Bool have_xi22 = FALSE;
|
||||
CARD32 clientTime;
|
||||
int deviceId;
|
||||
int mode;
|
||||
Window grabWindow = 0;
|
||||
uint32_t touchId = 0;
|
||||
|
||||
REQUEST(xXI2_2AllowEventsReq);
|
||||
|
||||
xi_client = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
|
||||
XIClientPtr xi_client = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
|
||||
if (!xi_client)
|
||||
return BadImplementation;
|
||||
|
||||
if (version_compare(xi_client->major_version,
|
||||
xi_client->minor_version, 2, 2) >= 0) {
|
||||
// Xi >= v2.2 request
|
||||
REQUEST(xXI2_2AllowEventsReq);
|
||||
REQUEST_AT_LEAST_SIZE(xXI2_2AllowEventsReq);
|
||||
have_xi22 = TRUE;
|
||||
clientTime = stuff->time;
|
||||
deviceId = stuff->deviceid;
|
||||
mode = stuff->mode;
|
||||
grabWindow = stuff->grab_window;
|
||||
touchId = stuff->touchid;
|
||||
}
|
||||
else {
|
||||
// Xi < v2.2 request
|
||||
REQUEST(xXIAllowEventsReq);
|
||||
REQUEST_AT_LEAST_SIZE(xXIAllowEventsReq);
|
||||
clientTime = stuff->time;
|
||||
deviceId = stuff->deviceid;
|
||||
mode = stuff->mode;
|
||||
}
|
||||
|
||||
ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
|
||||
DeviceIntPtr dev;
|
||||
int ret = dixLookupDevice(&dev, deviceId, client, DixGetAttrAccess);
|
||||
if (ret != Success)
|
||||
return ret;
|
||||
|
||||
time = ClientTimeToServerTime(stuff->time);
|
||||
TimeStamp time = ClientTimeToServerTime(clientTime);
|
||||
|
||||
switch (stuff->mode) {
|
||||
switch (mode) {
|
||||
case XIReplayDevice:
|
||||
AllowSome(client, time, dev, GRAB_STATE_NOT_GRABBED);
|
||||
break;
|
||||
@@ -124,16 +138,16 @@ ProcXIAllowEvents(ClientPtr client)
|
||||
if (!have_xi22)
|
||||
return BadValue;
|
||||
|
||||
rc = dixLookupWindow(&win, stuff->grab_window, client, DixReadAccess);
|
||||
rc = dixLookupWindow(&win, grabWindow, client, DixReadAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
ret = TouchAcceptReject(client, dev, stuff->mode, stuff->touchid,
|
||||
stuff->grab_window, &client->errorValue);
|
||||
ret = TouchAcceptReject(client, dev, mode, touchId,
|
||||
grabWindow, &client->errorValue);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
client->errorValue = stuff->mode;
|
||||
client->errorValue = mode;
|
||||
ret = BadValue;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user