dix: handle DIX-submitted touch events

The DIX needs to submit touch events for e.g. TouchEnd after an
acceptance/rejection. These have the TOUCH_CLIENT_ID flag set.

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-14 16:45:04 +10:00
parent 9ce8463a33
commit f3df3ad668

View File

@ -1732,7 +1732,10 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
int i; int i;
int num_events = 0; int num_events = 0;
RawDeviceEvent *raw; RawDeviceEvent *raw;
union touch {
TouchPointInfoPtr dix_ti;
DDXTouchPointInfoPtr ti; DDXTouchPointInfoPtr ti;
} touchpoint;
int need_rawevent = TRUE; int need_rawevent = TRUE;
Bool emulate_pointer = FALSE; Bool emulate_pointer = FALSE;
@ -1740,15 +1743,39 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
return 0; return 0;
/* Find and/or create the DDX touch info */ /* Find and/or create the DDX touch info */
ti = TouchFindByDDXID(dev, ddx_touchid, (type == XI_TouchBegin));
if (!ti) if (flags & TOUCH_CLIENT_ID) /* A DIX-submitted TouchEnd */
{
touchpoint.dix_ti = TouchFindByClientID(dev, ddx_touchid);
BUG_WARN(!touchpoint.dix_ti);
if (!touchpoint.dix_ti)
return 0;
if (!mask_in ||
!valuator_mask_isset(mask_in, 0) ||
!valuator_mask_isset(mask_in, 1))
{
ErrorF("[dix] dix-submitted events must have x/y valuator information.\n");
return 0;
}
need_rawevent = FALSE;
} else /* a DDX-submitted touch */
{
touchpoint.ti = TouchFindByDDXID(dev, ddx_touchid, (type == XI_TouchBegin));
if (!touchpoint.ti)
{ {
ErrorF("[dix] %s: unable to %s touch point %x\n", dev->name, ErrorF("[dix] %s: unable to %s touch point %x\n", dev->name,
type == XI_TouchBegin ? "begin" : "find", ddx_touchid); type == XI_TouchBegin ? "begin" : "find", ddx_touchid);
return 0; return 0;
} }
}
emulate_pointer = ti->emulate_pointer; if (!(flags & TOUCH_CLIENT_ID))
emulate_pointer = touchpoint.ti->emulate_pointer;
else
emulate_pointer = !!(flags & TOUCH_POINTER_EMULATED);
if (!IsMaster(dev)) if (!IsMaster(dev))
events = UpdateFromMaster(events, dev, DEVCHANGE_POINTER_EVENT, &num_events); events = UpdateFromMaster(events, dev, DEVCHANGE_POINTER_EVENT, &num_events);
@ -1760,7 +1787,7 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
raw = &events->raw_event; raw = &events->raw_event;
events++; events++;
num_events++; num_events++;
init_raw(dev, raw, ms, type, ti->client_id); init_raw(dev, raw, ms, type, touchpoint.ti->client_id);
set_raw_valuators(raw, &mask, raw->valuators.data_raw); set_raw_valuators(raw, &mask, raw->valuators.data_raw);
} }
@ -1768,6 +1795,12 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
num_events++; num_events++;
init_event(dev, event, ms); init_event(dev, event, ms);
/* if submitted for master device, get the sourceid from there */
if (flags & TOUCH_CLIENT_ID)
{
event->sourceid = touchpoint.dix_ti->sourceid;
/* TOUCH_CLIENT_ID implies norawevent */
}
switch (type) { switch (type) {
case XI_TouchBegin: case XI_TouchBegin:
@ -1794,17 +1827,19 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
event->type = ET_TouchEnd; event->type = ET_TouchEnd;
/* We can end the DDX touch here, since we don't use the active /* We can end the DDX touch here, since we don't use the active
* field below */ * field below */
TouchEndDDXTouch(dev, ti); if (!(flags & TOUCH_CLIENT_ID))
TouchEndDDXTouch(dev, touchpoint.ti);
break; break;
default: default:
return 0; return 0;
} }
if (!(flags & TOUCH_CLIENT_ID))
{
if (!valuator_mask_isset(&mask, 0)) if (!valuator_mask_isset(&mask, 0))
valuator_mask_set_double(&mask, 0, valuator_mask_get_double(ti->valuators, 0)); valuator_mask_set_double(&mask, 0, valuator_mask_get_double(touchpoint.ti->valuators, 0));
if (!valuator_mask_isset(&mask, 1)) if (!valuator_mask_isset(&mask, 1))
valuator_mask_set_double(&mask, 1, valuator_mask_get_double(ti->valuators, 1)); valuator_mask_set_double(&mask, 1, valuator_mask_get_double(touchpoint.ti->valuators, 1));
}
/* Get our screen event co-ordinates (root_x/root_y/event_x/event_y): /* Get our screen event co-ordinates (root_x/root_y/event_x/event_y):
* these come from the touchpoint in Absolute mode, or the sprite in * these come from the touchpoint in Absolute mode, or the sprite in
@ -1812,10 +1847,12 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
if (t->mode == XIDirectTouch) { if (t->mode == XIDirectTouch) {
transformAbsolute(dev, &mask); transformAbsolute(dev, &mask);
if (!(flags & TOUCH_CLIENT_ID)) {
for (i = 0; i < valuator_mask_size(&mask); i++) { for (i = 0; i < valuator_mask_size(&mask); i++) {
if (valuator_mask_isset(&mask, i)) double val;
valuator_mask_set_double(ti->valuators, i, if (valuator_mask_fetch_double(&mask, i, &val))
valuator_mask_get_double(&mask, i)); valuator_mask_set_double(touchpoint.ti->valuators, i, val);
}
} }
clipAbsolute(dev, &mask); clipAbsolute(dev, &mask);
@ -1840,7 +1877,7 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
event->root = scr->root->drawable.id; event->root = scr->root->drawable.id;
event_set_root_coordinates(event, screenx, screeny); event_set_root_coordinates(event, screenx, screeny);
event->touchid = ti->client_id; event->touchid = touchpoint.ti->client_id;
event->flags = flags; event->flags = flags;
if (emulate_pointer) if (emulate_pointer)