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) &&
|
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;
|
client->errorValue = param->this_device_mode;
|
||||||
return BadValue;
|
return BadValue;
|
||||||
}
|
}
|
||||||
if ((param->other_devices_mode != GrabModeSync) &&
|
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;
|
client->errorValue = param->other_devices_mode;
|
||||||
return BadValue;
|
return BadValue;
|
||||||
}
|
}
|
||||||
|
@ -2423,6 +2425,34 @@ GrabWindow(ClientPtr client, DeviceIntPtr dev, int type,
|
||||||
return AddPassiveGrabToList(client, grab);
|
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
|
int
|
||||||
SelectForWindow(DeviceIntPtr dev, WindowPtr pWin, ClientPtr client,
|
SelectForWindow(DeviceIntPtr dev, WindowPtr pWin, ClientPtr client,
|
||||||
Mask mask, Mask exclusivemasks)
|
Mask mask, Mask exclusivemasks)
|
||||||
|
|
|
@ -108,19 +108,29 @@ ProcXIPassiveGrabDevice(ClientPtr client)
|
||||||
if (stuff->grab_type != XIGrabtypeButton &&
|
if (stuff->grab_type != XIGrabtypeButton &&
|
||||||
stuff->grab_type != XIGrabtypeKeycode &&
|
stuff->grab_type != XIGrabtypeKeycode &&
|
||||||
stuff->grab_type != XIGrabtypeEnter &&
|
stuff->grab_type != XIGrabtypeEnter &&
|
||||||
stuff->grab_type != XIGrabtypeFocusIn)
|
stuff->grab_type != XIGrabtypeFocusIn &&
|
||||||
|
stuff->grab_type != XIGrabtypeTouchBegin)
|
||||||
{
|
{
|
||||||
client->errorValue = stuff->grab_type;
|
client->errorValue = stuff->grab_type;
|
||||||
return BadValue;
|
return BadValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((stuff->grab_type == XIGrabtypeEnter ||
|
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;
|
client->errorValue = stuff->detail;
|
||||||
return BadValue;
|
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],
|
if (XICheckInvalidMaskBits(client, (unsigned char*)&stuff[1],
|
||||||
stuff->mask_len * 4) != Success)
|
stuff->mask_len * 4) != Success)
|
||||||
return BadValue;
|
return BadValue;
|
||||||
|
@ -194,6 +204,9 @@ ProcXIPassiveGrabDevice(ClientPtr client)
|
||||||
status = GrabWindow(client, dev, stuff->grab_type,
|
status = GrabWindow(client, dev, stuff->grab_type,
|
||||||
¶m, &mask);
|
¶m, &mask);
|
||||||
break;
|
break;
|
||||||
|
case XIGrabtypeTouchBegin:
|
||||||
|
status = GrabTouch(client, dev, mod_dev, ¶m, &mask);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status != GrabSuccess)
|
if (status != GrabSuccess)
|
||||||
|
|
|
@ -221,6 +221,14 @@ GrabWindow(
|
||||||
GrabParameters* /* param */,
|
GrabParameters* /* param */,
|
||||||
GrabMask* /* eventMask */);
|
GrabMask* /* eventMask */);
|
||||||
|
|
||||||
|
extern int
|
||||||
|
GrabTouch(
|
||||||
|
ClientPtr /* client */,
|
||||||
|
DeviceIntPtr /* dev */,
|
||||||
|
DeviceIntPtr /* mod_dev */,
|
||||||
|
GrabParameters* /* param */,
|
||||||
|
GrabMask* /* eventMask */);
|
||||||
|
|
||||||
extern int
|
extern int
|
||||||
SelectForWindow(
|
SelectForWindow(
|
||||||
DeviceIntPtr /* dev */,
|
DeviceIntPtr /* dev */,
|
||||||
|
|
Loading…
Reference in New Issue