mirror of
https://github.com/X11Libre/xserver.git
synced 2026-03-25 04:09:24 +00:00
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>
156 lines
4.5 KiB
C
156 lines
4.5 KiB
C
/*
|
|
* Copyright © 2009 Red Hat, Inc.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice (including the next
|
|
* paragraph) shall be included in all copies or substantial portions of the
|
|
* Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
* DEALINGS IN THE SOFTWARE.
|
|
*
|
|
* Author: Peter Hutterer
|
|
*/
|
|
|
|
/***********************************************************************
|
|
*
|
|
* Request to allow some device events.
|
|
*
|
|
*/
|
|
|
|
#include <dix-config.h>
|
|
|
|
#include <X11/extensions/XI2.h>
|
|
#include <X11/extensions/XI2proto.h>
|
|
|
|
#include "dix/dix_priv.h"
|
|
#include "dix/exevents_priv.h"
|
|
#include "dix/input_priv.h"
|
|
#include "os/fmt.h"
|
|
|
|
#include "inputstr.h" /* DeviceIntPtr */
|
|
#include "windowstr.h" /* window structure */
|
|
#include "mi.h"
|
|
#include "eventstr.h"
|
|
#include "exglobals.h" /* BadDevice */
|
|
#include "xiallowev.h"
|
|
|
|
int _X_COLD
|
|
SProcXIAllowEvents(ClientPtr client)
|
|
{
|
|
REQUEST(xXIAllowEventsReq);
|
|
REQUEST_AT_LEAST_SIZE(xXIAllowEventsReq);
|
|
|
|
swaps(&stuff->deviceid);
|
|
swapl(&stuff->time);
|
|
if (client->req_len > 3) {
|
|
xXI2_2AllowEventsReq *req_xi22 = (xXI2_2AllowEventsReq *) stuff;
|
|
|
|
REQUEST_AT_LEAST_SIZE(xXI2_2AllowEventsReq);
|
|
swapl(&req_xi22->touchid);
|
|
swapl(&req_xi22->grab_window);
|
|
}
|
|
|
|
return ProcXIAllowEvents(client);
|
|
}
|
|
|
|
int
|
|
ProcXIAllowEvents(ClientPtr client)
|
|
{
|
|
Bool have_xi22 = FALSE;
|
|
CARD32 clientTime;
|
|
int deviceId;
|
|
int mode;
|
|
Window grabWindow = 0;
|
|
uint32_t touchId = 0;
|
|
|
|
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;
|
|
}
|
|
|
|
DeviceIntPtr dev;
|
|
int ret = dixLookupDevice(&dev, deviceId, client, DixGetAttrAccess);
|
|
if (ret != Success)
|
|
return ret;
|
|
|
|
TimeStamp time = ClientTimeToServerTime(clientTime);
|
|
|
|
switch (mode) {
|
|
case XIReplayDevice:
|
|
AllowSome(client, time, dev, GRAB_STATE_NOT_GRABBED);
|
|
break;
|
|
case XISyncDevice:
|
|
AllowSome(client, time, dev, GRAB_STATE_FREEZE_NEXT_EVENT);
|
|
break;
|
|
case XIAsyncDevice:
|
|
AllowSome(client, time, dev, GRAB_STATE_THAWED);
|
|
break;
|
|
case XIAsyncPairedDevice:
|
|
if (InputDevIsMaster(dev))
|
|
AllowSome(client, time, dev, GRAB_STATE_THAW_OTHERS);
|
|
break;
|
|
case XISyncPair:
|
|
if (InputDevIsMaster(dev))
|
|
AllowSome(client, time, dev, GRAB_STATE_FREEZE_BOTH_NEXT_EVENT);
|
|
break;
|
|
case XIAsyncPair:
|
|
if (InputDevIsMaster(dev))
|
|
AllowSome(client, time, dev, GRAB_STATE_THAWED_BOTH);
|
|
break;
|
|
case XIRejectTouch:
|
|
case XIAcceptTouch:
|
|
{
|
|
int rc;
|
|
WindowPtr win;
|
|
|
|
if (!have_xi22)
|
|
return BadValue;
|
|
|
|
rc = dixLookupWindow(&win, grabWindow, client, DixReadAccess);
|
|
if (rc != Success)
|
|
return rc;
|
|
|
|
ret = TouchAcceptReject(client, dev, mode, touchId,
|
|
grabWindow, &client->errorValue);
|
|
}
|
|
break;
|
|
default:
|
|
client->errorValue = mode;
|
|
ret = BadValue;
|
|
}
|
|
|
|
return ret;
|
|
}
|