Merge branch 'high-resolution-touch-devices' into for-keith

This commit is contained in:
Peter Hutterer 2012-11-29 14:49:22 +10:00
commit ce6b652929
5 changed files with 98 additions and 107 deletions

View File

@ -1066,24 +1066,14 @@ ActivateEarlyAccept(DeviceIntPtr dev, TouchPointInfoPtr ti)
static void
EmitTouchEnd(DeviceIntPtr dev, TouchPointInfoPtr ti, int flags, XID resource)
{
InternalEvent *tel = InitEventList(GetMaximumEventsNum());
ValuatorMask *mask = valuator_mask_new(2);
int i, nev;
valuator_mask_set_double(mask, 0,
valuator_mask_get_double(ti->valuators, 0));
valuator_mask_set_double(mask, 1,
valuator_mask_get_double(ti->valuators, 1));
InternalEvent event;
flags |= TOUCH_CLIENT_ID;
if (ti->emulate_pointer)
flags |= TOUCH_POINTER_EMULATED;
nev = GetTouchEvents(tel, dev, ti->client_id, XI_TouchEnd, flags, mask);
for (i = 0; i < nev; i++)
DeliverTouchEvents(dev, ti, tel + i, resource);
valuator_mask_free(&mask);
FreeEventList(tel, GetMaximumEventsNum());
TouchDeliverDeviceClassesChangedEvent(ti, GetTimeInMillis(), resource);
GetDixTouchEnd(&event, dev, ti, flags);
DeliverTouchEvents(dev, ti, &event, resource);
}
/**

View File

@ -1833,10 +1833,7 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
int i;
int num_events = 0;
RawDeviceEvent *raw;
union touch {
TouchPointInfoPtr dix_ti;
DDXTouchPointInfoPtr ti;
} touchpoint;
DDXTouchPointInfoPtr ti;
int need_rawevent = TRUE;
Bool emulate_pointer = FALSE;
int client_id = 0;
@ -1855,37 +1852,15 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
/* Find and/or create the DDX touch info */
if (flags & TOUCH_CLIENT_ID) { /* A DIX-submitted TouchEnd */
touchpoint.dix_ti = TouchFindByClientID(dev, ddx_touchid);
BUG_RETURN_VAL(!touchpoint.dix_ti, 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;
client_id = touchpoint.dix_ti->client_id;
ti = TouchFindByDDXID(dev, ddx_touchid, (type == XI_TouchBegin));
if (!ti) {
ErrorFSigSafe("[dix] %s: unable to %s touch point %u\n", dev->name,
type == XI_TouchBegin ? "begin" : "find", ddx_touchid);
return 0;
}
else { /* a DDX-submitted touch */
client_id = ti->client_id;
touchpoint.ti =
TouchFindByDDXID(dev, ddx_touchid, (type == XI_TouchBegin));
if (!touchpoint.ti) {
ErrorFSigSafe("[dix] %s: unable to %s touch point %u\n", dev->name,
type == XI_TouchBegin ? "begin" : "find", ddx_touchid);
return 0;
}
client_id = touchpoint.ti->client_id;
}
if (!(flags & TOUCH_CLIENT_ID))
emulate_pointer = touchpoint.ti->emulate_pointer;
else
emulate_pointer = ! !(flags & TOUCH_POINTER_EMULATED);
emulate_pointer = ti->emulate_pointer;
if (!IsMaster(dev))
events =
@ -1905,11 +1880,6 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
num_events++;
init_device_event(event, dev, 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) {
case XI_TouchBegin:
@ -1934,38 +1904,30 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
event->type = ET_TouchEnd;
/* We can end the DDX touch here, since we don't use the active
* field below */
if (!(flags & TOUCH_CLIENT_ID))
TouchEndDDXTouch(dev, touchpoint.ti);
TouchEndDDXTouch(dev, ti);
break;
default:
return 0;
}
if (t->mode == XIDirectTouch && !(flags & TOUCH_CLIENT_ID)) {
if (!valuator_mask_isset(&mask, 0))
valuator_mask_set_double(&mask, 0,
valuator_mask_get_double(touchpoint.ti->
valuators, 0));
if (!valuator_mask_isset(&mask, 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):
* these come from the touchpoint in Absolute mode, or the sprite in
* Relative. */
if (t->mode == XIDirectTouch) {
transformAbsolute(dev, &mask);
for (i = 0; i < max(valuator_mask_size(&mask), 2); i++) {
double val;
if (!(flags & TOUCH_CLIENT_ID)) {
for (i = 0; i < valuator_mask_size(&mask); i++) {
double val;
if (valuator_mask_fetch_double(&mask, i, &val))
valuator_mask_set_double(touchpoint.ti->valuators, i, val);
}
if (valuator_mask_fetch_double(&mask, i, &val))
valuator_mask_set_double(ti->valuators, i, val);
/* If the device doesn't post new X and Y axis values,
* use the last values posted.
*/
else if (i < 2 &&
valuator_mask_fetch_double(ti->valuators, i, &val))
valuator_mask_set_double(&mask, i, val);
}
transformAbsolute(dev, &mask);
clipAbsolute(dev, &mask);
}
else {
@ -1994,6 +1956,14 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
if (emulate_pointer)
storeLastValuators(dev, &mask, 0, 1, devx, devy);
/* Update the MD's co-ordinates, which are always in desktop space. */
if (emulate_pointer && !IsMaster(dev) && !IsFloating(dev)) {
DeviceIntPtr master = GetMaster(dev, MASTER_POINTER);
master->last.valuators[0] = screenx;
master->last.valuators[1] = screeny;
}
event->root = scr->root->drawable.id;
event_set_root_coordinates(event, screenx, screeny);
@ -2014,6 +1984,37 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
return num_events;
}
void
GetDixTouchEnd(InternalEvent *ievent, DeviceIntPtr dev, TouchPointInfoPtr ti,
uint32_t flags)
{
ScreenPtr scr = dev->spriteInfo->sprite->hotPhys.pScreen;
DeviceEvent *event = &ievent->device_event;
CARD32 ms = GetTimeInMillis();
BUG_WARN(!dev->enabled);
init_device_event(event, dev, ms);
event->sourceid = ti->sourceid;
event->type = ET_TouchEnd;
event->root = scr->root->drawable.id;
/* Get screen event coordinates from the sprite. Is this really the best
* we can do? */
event_set_root_coordinates(event,
dev->last.valuators[0],
dev->last.valuators[1]);
event->touchid = ti->client_id;
event->flags = flags;
if (flags & TOUCH_POINTER_EMULATED) {
event->flags |= TOUCH_POINTER_EMULATED;
event->detail.button = 1;
}
}
/**
* Synthesize a single motion event for the core pointer.
*

View File

@ -463,45 +463,14 @@ TouchEventHistoryPush(TouchPointInfoPtr ti, const DeviceEvent *ev)
void
TouchEventHistoryReplay(TouchPointInfoPtr ti, DeviceIntPtr dev, XID resource)
{
InternalEvent *tel;
ValuatorMask *mask;
int i, nev;
int flags;
int i;
if (!ti->history)
return;
tel = InitEventList(GetMaximumEventsNum());
mask = valuator_mask_new(0);
TouchDeliverDeviceClassesChangedEvent(ti, ti->history[0].time, resource);
valuator_mask_set_double(mask, 0, ti->history[0].valuators.data[0]);
valuator_mask_set_double(mask, 1, ti->history[0].valuators.data[1]);
flags = TOUCH_CLIENT_ID | TOUCH_REPLAYING;
if (ti->emulate_pointer)
flags |= TOUCH_POINTER_EMULATED;
/* Generate events based on a fake touch begin event to get DCCE events if
* needed */
/* FIXME: This needs to be cleaned up */
nev = GetTouchEvents(tel, dev, ti->client_id, XI_TouchBegin, flags, mask);
for (i = 0; i < nev; i++) {
/* Send saved touch begin event */
if (tel[i].any.type == ET_TouchBegin) {
DeviceEvent *ev = &ti->history[0];
ev->flags |= TOUCH_REPLAYING;
DeliverTouchEvents(dev, ti, (InternalEvent*)ev, resource);
}
else {/* Send DCCE event */
tel[i].any.time = ti->history[0].time;
DeliverTouchEvents(dev, ti, tel + i, resource);
}
}
valuator_mask_free(&mask);
FreeEventList(tel, GetMaximumEventsNum());
/* First event was TouchBegin, already replayed that one */
for (i = 1; i < ti->history_elements; i++) {
for (i = 0; i < ti->history_elements; i++) {
DeviceEvent *ev = &ti->history[i];
ev->flags |= TOUCH_REPLAYING;
@ -509,6 +478,30 @@ TouchEventHistoryReplay(TouchPointInfoPtr ti, DeviceIntPtr dev, XID resource)
}
}
void
TouchDeliverDeviceClassesChangedEvent(TouchPointInfoPtr ti, Time time,
XID resource)
{
DeviceIntPtr dev;
int num_events = 0;
InternalEvent dcce;
dixLookupDevice(&dev, ti->sourceid, serverClient, DixWriteAccess);
if (!dev)
return;
/* UpdateFromMaster generates at most one event */
UpdateFromMaster(&dcce, dev, DEVCHANGE_POINTER_EVENT, &num_events);
BUG_WARN(num_events > 1);
if (num_events) {
dcce.any.time = time;
/* FIXME: This doesn't do anything */
dev->public.processInputProc(&dcce, dev);
}
}
Bool
TouchBuildDependentSpriteTrace(DeviceIntPtr dev, SpritePtr sprite)
{

View File

@ -465,6 +465,11 @@ extern int GetTouchOwnershipEvents(InternalEvent *events,
TouchPointInfoPtr ti,
uint8_t mode, XID resource, uint32_t flags);
extern void GetDixTouchEnd(InternalEvent *ievent,
DeviceIntPtr dev,
TouchPointInfoPtr ti,
uint32_t flags);
extern _X_EXPORT int GetProximityEvents(InternalEvent *events,
DeviceIntPtr pDev,
int type, const ValuatorMask *mask);
@ -580,6 +585,8 @@ extern int TouchListenerAcceptReject(DeviceIntPtr dev, TouchPointInfoPtr ti,
extern int TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode,
uint32_t touchid, Window grab_window, XID *error);
extern void TouchEndPhysicallyActiveTouches(DeviceIntPtr dev);
extern void TouchDeliverDeviceClassesChangedEvent(TouchPointInfoPtr ti,
Time time, XID resource);
/* misc event helpers */
extern Mask GetEventMask(DeviceIntPtr dev, xEvent *ev, InputClientsPtr clients);

View File

@ -331,7 +331,7 @@ typedef struct _DDXTouchPointInfo {
uint32_t ddx_id; /* touch ID given by the DDX */
Bool emulate_pointer;
ValuatorMask *valuators; /* last recorded axis values */
ValuatorMask *valuators; /* last axis values as posted, pre-transform */
} DDXTouchPointInfoRec;
typedef struct _TouchClassRec {