Merge remote-tracking branch 'whot/for-keith'

This commit is contained in:
Keith Packard 2013-04-24 10:27:19 -07:00
commit 53da26afb7
10 changed files with 80 additions and 82 deletions

View File

@ -156,8 +156,8 @@ XvExtensionInit(void)
if (!dixRegisterPrivateKey(&XvScreenKeyRec, PRIVATE_SCREEN, 0)) if (!dixRegisterPrivateKey(&XvScreenKeyRec, PRIVATE_SCREEN, 0))
return; return;
/* LOOK TO SEE IF ANY SCREENS WERE INITIALIZED; IF NOT THEN /* Look to see if any screens were initialized; if not then
INIT GLOBAL VARIABLES SO THE EXTENSION CAN FUNCTION */ init global variables so the extension can function */
if (XvScreenGeneration != serverGeneration) { if (XvScreenGeneration != serverGeneration) {
if (!CreateResourceTypes()) { if (!CreateResourceTypes()) {
ErrorF("XvExtensionInit: Unable to allocate resource types\n"); ErrorF("XvExtensionInit: Unable to allocate resource types\n");

View File

@ -142,7 +142,8 @@ ProcXDeviceBell(ClientPtr client)
newpercent = base + newpercent; newpercent = base + newpercent;
else else
newpercent = base - newpercent + stuff->percent; newpercent = base - newpercent + stuff->percent;
if (proc == NULL)
return BadValue;
(*proc) (newpercent, dev, ctrl, class); (*proc) (newpercent, dev, ctrl, class);
return Success; return Success;
} }

View File

@ -1223,9 +1223,16 @@ TouchRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, XID resource,
* touchpoint if it is pending finish. * touchpoint if it is pending finish.
*/ */
static void static void
ProcessTouchOwnershipEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, ProcessTouchOwnershipEvent(TouchOwnershipEvent *ev,
TouchOwnershipEvent *ev) DeviceIntPtr dev)
{ {
TouchPointInfoPtr ti = TouchFindByClientID(dev, ev->touchid);
if (!ti) {
DebugF("[Xi] %s: Failed to get event %d for touchpoint %d\n",
dev->name, ev->type, ev->touchid);
return;
}
if (ev->reason == XIRejectTouch) if (ev->reason == XIRejectTouch)
TouchRejected(dev, ti, ev->resource, ev); TouchRejected(dev, ti, ev->resource, ev);
@ -1538,10 +1545,7 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
if (!t) if (!t)
return; return;
if (ev->any.type == ET_TouchOwnership) touchid = ev->device_event.touchid;
touchid = ev->touch_ownership_event.touchid;
else
touchid = ev->device_event.touchid;
if (type == ET_TouchBegin) { if (type == ET_TouchBegin) {
ti = TouchBeginTouch(dev, ev->device_event.sourceid, touchid, ti = TouchBeginTouch(dev, ev->device_event.sourceid, touchid,
@ -1614,19 +1618,13 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
(type != ET_TouchEnd && ti->sprite.spriteTraceGood == 0)) (type != ET_TouchEnd && ti->sprite.spriteTraceGood == 0))
return; return;
/* TouchOwnership events are handled separately from the rest, as they TouchCopyValuatorData(&ev->device_event, ti);
* have more complex semantics. */ /* WARNING: the event type may change to TouchUpdate in
if (ev->any.type == ET_TouchOwnership) * DeliverTouchEvents if a TouchEnd was delivered to a grabbing
ProcessTouchOwnershipEvent(dev, ti, &ev->touch_ownership_event); * owner */
else { DeliverTouchEvents(dev, ti, (InternalEvent *) ev, 0);
TouchCopyValuatorData(&ev->device_event, ti); if (ev->any.type == ET_TouchEnd)
/* WARNING: the event type may change to TouchUpdate in TouchEndTouch(dev, ti);
* DeliverTouchEvents if a TouchEnd was delivered to a grabbing
* owner */
DeliverTouchEvents(dev, ti, (InternalEvent *) ev, 0);
if (ev->any.type == ET_TouchEnd)
TouchEndTouch(dev, ti);
}
if (emulate_pointer) if (emulate_pointer)
UpdateDeviceState(dev, &ev->device_event); UpdateDeviceState(dev, &ev->device_event);
@ -1820,10 +1818,14 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
break; break;
case ET_TouchBegin: case ET_TouchBegin:
case ET_TouchUpdate: case ET_TouchUpdate:
case ET_TouchOwnership:
case ET_TouchEnd: case ET_TouchEnd:
ProcessTouchEvent(ev, device); ProcessTouchEvent(ev, device);
break; break;
case ET_TouchOwnership:
/* TouchOwnership events are handled separately from the rest, as they
* have more complex semantics. */
ProcessTouchOwnershipEvent(&ev->touch_ownership_event, device);
break;
case ET_BarrierHit: case ET_BarrierHit:
case ET_BarrierLeave: case ET_BarrierLeave:
ProcessBarrierEvent(ev, device); ProcessBarrierEvent(ev, device);

View File

@ -848,24 +848,24 @@ SBarrierEvent(xXIBarrierEvent * from,
*to = *from; *to = *from;
swaps(&from->sequenceNumber); swaps(&to->sequenceNumber);
swapl(&from->length); swapl(&to->length);
swaps(&from->evtype); swaps(&to->evtype);
swapl(&from->time); swapl(&to->time);
swaps(&from->deviceid); swaps(&to->deviceid);
swaps(&from->sourceid); swaps(&to->sourceid);
swapl(&from->event); swapl(&to->event);
swapl(&from->root); swapl(&to->root);
swapl(&from->root_x); swapl(&to->root_x);
swapl(&from->root_y); swapl(&to->root_y);
swapl(&from->dx.integral); swapl(&to->dx.integral);
swapl(&from->dx.frac); swapl(&to->dx.frac);
swapl(&from->dy.integral); swapl(&to->dy.integral);
swapl(&from->dy.frac); swapl(&to->dy.frac);
swapl(&from->dtime); swapl(&to->dtime);
swapl(&from->barrier); swapl(&to->barrier);
swapl(&from->eventid); swapl(&to->eventid);
} }
/** Event swapping function for XI2 events. */ /** Event swapping function for XI2 events. */

View File

@ -67,6 +67,8 @@ ProcXIGrabDevice(ClientPtr client)
uint8_t status; uint8_t status;
GrabMask mask = { 0 }; GrabMask mask = { 0 };
int mask_len; int mask_len;
unsigned int keyboard_mode;
unsigned int pointer_mode;
REQUEST(xXIGrabDeviceReq); REQUEST(xXIGrabDeviceReq);
REQUEST_AT_LEAST_SIZE(xXIGrabDeviceReq); REQUEST_AT_LEAST_SIZE(xXIGrabDeviceReq);
@ -78,6 +80,15 @@ ProcXIGrabDevice(ClientPtr client)
if (!IsMaster(dev)) if (!IsMaster(dev))
stuff->paired_device_mode = GrabModeAsync; stuff->paired_device_mode = GrabModeAsync;
if (IsKeyboardDevice(dev)) {
keyboard_mode = stuff->grab_mode;
pointer_mode = stuff->paired_device_mode;
}
else {
keyboard_mode = stuff->paired_device_mode;
pointer_mode = stuff->grab_mode;
}
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;
@ -91,8 +102,8 @@ ProcXIGrabDevice(ClientPtr client)
xi2mask_set_one_mask(mask.xi2mask, dev->id, (unsigned char *) &stuff[1], xi2mask_set_one_mask(mask.xi2mask, dev->id, (unsigned char *) &stuff[1],
mask_len); mask_len);
ret = GrabDevice(client, dev, stuff->grab_mode, ret = GrabDevice(client, dev, pointer_mode,
stuff->paired_device_mode, keyboard_mode,
stuff->grab_window, stuff->grab_window,
stuff->owner_events, stuff->owner_events,
stuff->time, stuff->time,

View File

@ -795,6 +795,7 @@ FreeDeviceClass(int type, pointer *class)
free((*t)->touches[i].valuators); free((*t)->touches[i].valuators);
} }
free((*t)->touches);
free((*t)); free((*t));
break; break;
} }
@ -2766,9 +2767,10 @@ AllocDevicePair(ClientPtr client, const char *name,
keyboard->type = (master) ? MASTER_KEYBOARD : SLAVE; keyboard->type = (master) ? MASTER_KEYBOARD : SLAVE;
/* The ClassesRec stores the device classes currently not used. */ /* The ClassesRec stores the device classes currently not used. */
pointer->unused_classes = calloc(1, sizeof(ClassesRec)); if (IsMaster(pointer)) {
pointer->unused_classes = calloc(1, sizeof(ClassesRec));
keyboard->unused_classes = calloc(1, sizeof(ClassesRec)); keyboard->unused_classes = calloc(1, sizeof(ClassesRec));
}
*ptr = pointer; *ptr = pointer;

View File

@ -684,17 +684,18 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
xde->root_x = double_to_fp1616(ev->root_x + ev->root_x_frac); xde->root_x = double_to_fp1616(ev->root_x + ev->root_x_frac);
xde->root_y = double_to_fp1616(ev->root_y + ev->root_y_frac); xde->root_y = double_to_fp1616(ev->root_y + ev->root_y_frac);
if (ev->type == ET_TouchUpdate) if (IsTouchEvent((InternalEvent *)ev)) {
xde->flags |= (ev->flags & TOUCH_PENDING_END) ? XITouchPendingEnd : 0; if (ev->type == ET_TouchUpdate)
else xde->flags |= (ev->flags & TOUCH_PENDING_END) ? XITouchPendingEnd : 0;
if (ev->flags & TOUCH_POINTER_EMULATED)
xde->flags |= XITouchEmulatingPointer;
} else {
xde->flags = ev->flags; xde->flags = ev->flags;
if (IsTouchEvent((InternalEvent *) ev) && if (ev->key_repeat)
ev->flags & TOUCH_POINTER_EMULATED) xde->flags |= XIKeyRepeat;
xde->flags |= XITouchEmulatingPointer; }
if (ev->key_repeat)
xde->flags |= XIKeyRepeat;
xde->mods.base_mods = ev->mods.base; xde->mods.base_mods = ev->mods.base;
xde->mods.latched_mods = ev->mods.latched; xde->mods.latched_mods = ev->mods.latched;

View File

@ -620,14 +620,14 @@ TouchConvertToPointerEvent(const InternalEvent *event,
BUG_WARN_MSG(!(event->device_event.flags & TOUCH_POINTER_EMULATED), BUG_WARN_MSG(!(event->device_event.flags & TOUCH_POINTER_EMULATED),
"Non-emulating touch event\n"); "Non-emulating touch event\n");
*motion_event = *event; motion_event->device_event = event->device_event;
motion_event->any.type = ET_Motion; motion_event->any.type = ET_Motion;
motion_event->device_event.detail.button = 0; motion_event->device_event.detail.button = 0;
motion_event->device_event.flags = XIPointerEmulated; motion_event->device_event.flags = XIPointerEmulated;
if (nevents > 1) { if (nevents > 1) {
BUG_RETURN_VAL(!button_event, 0); BUG_RETURN_VAL(!button_event, 0);
*button_event = *event; button_event->device_event = event->device_event;
button_event->any.type = ptrtype; button_event->any.type = ptrtype;
button_event->device_event.flags = XIPointerEmulated; button_event->device_event.flags = XIPointerEmulated;
/* detail is already correct */ /* detail is already correct */

View File

@ -26,35 +26,17 @@ get_drm_info(struct OdevAttributes *attribs, char *path, int delayed_index)
char *buf; char *buf;
int fd; int fd;
int err = 0; int err = 0;
int tries = 0;
fd = open(path, O_RDWR, O_CLOEXEC); fd = open(path, O_RDWR, O_CLOEXEC);
if (fd == -1) if (fd == -1)
return FALSE; return FALSE;
while (tries++ < 200) { sv.drm_di_major = 1;
sv.drm_di_major = 1; sv.drm_di_minor = 4;
sv.drm_di_minor = 4; sv.drm_dd_major = -1; /* Don't care */
sv.drm_dd_major = -1; /* Don't care */ sv.drm_dd_minor = -1; /* Don't care */
sv.drm_dd_minor = -1; /* Don't care */
err = drmSetInterfaceVersion(fd, &sv); err = drmSetInterfaceVersion(fd, &sv);
if (!err) {
if (tries > 1)
LogMessage(X_INFO, "setversion 1.4 succeeded on try #%d\n", tries);
break;
} if (err == -EACCES) {
if (tries % 500 == 0)
LogMessage(X_INFO, "waiting on drm device...\n");
} else {
break;
}
usleep(10000);
if (!drmSetMaster(fd))
LogMessage(X_INFO, "drmSetMaster succeeded\n");
}
if (err) { if (err) {
ErrorF("setversion 1.4 failed: %s\n", strerror(-err)); ErrorF("setversion 1.4 failed: %s\n", strerror(-err));
goto out; goto out;
@ -161,8 +143,7 @@ xf86PlatformDeviceProbe(struct OdevAttributes *attribs)
if (i != xf86_num_platform_devices) if (i != xf86_num_platform_devices)
goto out_free; goto out_free;
LogMessage(X_INFO, "config/udev: Adding drm device (%s)\n", LogMessage(X_INFO, "xfree86: Adding drm device (%s)\n", path);
path);
if (!xf86VTOwner()) { if (!xf86VTOwner()) {
/* if we don't currently own the VT then don't probe the device, /* if we don't currently own the VT then don't probe the device,

View File

@ -96,7 +96,7 @@ typedef struct _Client {
unsigned int clientGone:1; unsigned int clientGone:1;
unsigned int closeDownMode:2; unsigned int closeDownMode:2;
unsigned int clientState:2; unsigned int clientState:2;
char smart_priority; signed char smart_priority;
short noClientException; /* this client died or needs to be killed */ short noClientException; /* this client died or needs to be killed */
int priority; int priority;
ReplySwapPtr pSwapReplyFunc; ReplySwapPtr pSwapReplyFunc;