Xi: add the hooks for passive touch grabs
Co-authored-by: Daniel Stone <daniel@fooishbar.org> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
This commit is contained in:
parent
bb0af002dc
commit
4469430b10
|
@ -2253,12 +2253,14 @@ CheckGrabValues(ClientPtr client, GrabParameters* param)
|
|||
}
|
||||
|
||||
if ((param->this_device_mode != GrabModeSync) &&
|
||||
(param->this_device_mode != GrabModeAsync)) {
|
||||
(param->this_device_mode != GrabModeAsync) &&
|
||||
(param->this_device_mode != XIGrabModeTouch)) {
|
||||
client->errorValue = param->this_device_mode;
|
||||
return BadValue;
|
||||
}
|
||||
if ((param->other_devices_mode != GrabModeSync) &&
|
||||
(param->other_devices_mode != GrabModeAsync)) {
|
||||
(param->other_devices_mode != GrabModeAsync) &&
|
||||
(param->other_devices_mode != XIGrabModeTouch)) {
|
||||
client->errorValue = param->other_devices_mode;
|
||||
return BadValue;
|
||||
}
|
||||
|
@ -2423,6 +2425,34 @@ GrabWindow(ClientPtr client, DeviceIntPtr dev, int type,
|
|||
return AddPassiveGrabToList(client, grab);
|
||||
}
|
||||
|
||||
/* Touch grab */
|
||||
int
|
||||
GrabTouch(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr mod_dev,
|
||||
GrabParameters *param, GrabMask *mask)
|
||||
{
|
||||
WindowPtr pWin;
|
||||
GrabPtr grab;
|
||||
int rc;
|
||||
|
||||
rc = CheckGrabValues(client, param);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGrabAccess);
|
||||
if (rc != Success)
|
||||
return rc;
|
||||
|
||||
grab = CreateGrab(client->index, dev, mod_dev, pWin, XI2,
|
||||
mask, param, XI_TouchBegin, 0, NullWindow, NullCursor);
|
||||
if (!grab)
|
||||
return BadAlloc;
|
||||
|
||||
return AddPassiveGrabToList(client, grab);
|
||||
}
|
||||
|
||||
int
|
||||
SelectForWindow(DeviceIntPtr dev, WindowPtr pWin, ClientPtr client,
|
||||
Mask mask, Mask exclusivemasks)
|
||||
|
|
|
@ -108,19 +108,29 @@ ProcXIPassiveGrabDevice(ClientPtr client)
|
|||
if (stuff->grab_type != XIGrabtypeButton &&
|
||||
stuff->grab_type != XIGrabtypeKeycode &&
|
||||
stuff->grab_type != XIGrabtypeEnter &&
|
||||
stuff->grab_type != XIGrabtypeFocusIn)
|
||||
stuff->grab_type != XIGrabtypeFocusIn &&
|
||||
stuff->grab_type != XIGrabtypeTouchBegin)
|
||||
{
|
||||
client->errorValue = stuff->grab_type;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
if ((stuff->grab_type == XIGrabtypeEnter ||
|
||||
stuff->grab_type == XIGrabtypeFocusIn) && stuff->detail != 0)
|
||||
stuff->grab_type == XIGrabtypeFocusIn ||
|
||||
stuff->grab_type == XIGrabtypeTouchBegin) && stuff->detail != 0)
|
||||
{
|
||||
client->errorValue = stuff->detail;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
if (stuff->grab_type == XIGrabtypeTouchBegin &&
|
||||
(stuff->grab_mode != XIGrabModeTouch ||
|
||||
stuff->paired_device_mode != GrabModeAsync))
|
||||
{
|
||||
client->errorValue = stuff->grab_mode;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
if (XICheckInvalidMaskBits(client, (unsigned char*)&stuff[1],
|
||||
stuff->mask_len * 4) != Success)
|
||||
return BadValue;
|
||||
|
@ -194,6 +204,9 @@ ProcXIPassiveGrabDevice(ClientPtr client)
|
|||
status = GrabWindow(client, dev, stuff->grab_type,
|
||||
¶m, &mask);
|
||||
break;
|
||||
case XIGrabtypeTouchBegin:
|
||||
status = GrabTouch(client, dev, mod_dev, ¶m, &mask);
|
||||
break;
|
||||
}
|
||||
|
||||
if (status != GrabSuccess)
|
||||
|
|
|
@ -221,6 +221,14 @@ GrabWindow(
|
|||
GrabParameters* /* param */,
|
||||
GrabMask* /* eventMask */);
|
||||
|
||||
extern int
|
||||
GrabTouch(
|
||||
ClientPtr /* client */,
|
||||
DeviceIntPtr /* dev */,
|
||||
DeviceIntPtr /* mod_dev */,
|
||||
GrabParameters* /* param */,
|
||||
GrabMask* /* eventMask */);
|
||||
|
||||
extern int
|
||||
SelectForWindow(
|
||||
DeviceIntPtr /* dev */,
|
||||
|
|
Loading…
Reference in New Issue