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:
Peter Hutterer 2011-12-15 07:42:12 +10:00
parent bb0af002dc
commit 4469430b10
3 changed files with 55 additions and 4 deletions

View File

@ -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)

View File

@ -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,
&param, &mask); &param, &mask);
break; break;
case XIGrabtypeTouchBegin:
status = GrabTouch(client, dev, mod_dev, &param, &mask);
break;
} }
if (status != GrabSuccess) if (status != GrabSuccess)

View File

@ -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 */,