diff options
Diffstat (limited to 'xorg-server/dix')
-rw-r--r-- | xorg-server/dix/events.c | 6 | ||||
-rw-r--r-- | xorg-server/dix/getevents.c | 43 |
2 files changed, 31 insertions, 18 deletions
diff --git a/xorg-server/dix/events.c b/xorg-server/dix/events.c index b60c29952..3c7bd50cd 100644 --- a/xorg-server/dix/events.c +++ b/xorg-server/dix/events.c @@ -432,7 +432,7 @@ GetEventFilter(DeviceIntPtr dev, xEvent *event) return filters[dev ? dev->id : 0][event->u.u.type]; else if ((evtype = xi2_get_type(event))) return (1 << (evtype % 8)); - ErrorF("[dix] Unknown device type %d. No filter\n", event->u.u.type); + ErrorF("[dix] Unknown event type %d. No filter\n", event->u.u.type); return 0; } @@ -1421,7 +1421,7 @@ CheckGrabForSyncs(DeviceIntPtr thisDev, Bool thisMode, Bool otherMode) static void DetachFromMaster(DeviceIntPtr dev) { - if (!IsFloating(dev)) + if (IsFloating(dev)) return; dev->saved_master_id = GetMaster(dev, MASTER_ATTACHED)->id; @@ -3997,7 +3997,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev, rc = EventToXI2(event, &xi2); if (rc == Success) { - int evtype = ((xGenericEvent*)xi2)->evtype; + int evtype = xi2_get_type(xi2); mask = grab->xi2mask[XIAllDevices][evtype/8] | grab->xi2mask[XIAllMasterDevices][evtype/8] | grab->xi2mask[thisDev->id][evtype/8]; diff --git a/xorg-server/dix/getevents.c b/xorg-server/dix/getevents.c index 13789f6a2..c935c971c 100644 --- a/xorg-server/dix/getevents.c +++ b/xorg-server/dix/getevents.c @@ -864,7 +864,7 @@ positionSprite(DeviceIntPtr dev, int mode, * to the current screen. */ miPointerSetPosition(dev, mode, screenx, screeny); - if(!IsMaster(dev) || !IsFloating(dev)) { + if(!IsMaster(dev) && !IsFloating(dev)) { DeviceIntPtr master = GetMaster(dev, MASTER_POINTER); master->last.valuators[0] = *screenx; master->last.valuators[1] = *screeny; @@ -911,7 +911,7 @@ updateHistory(DeviceIntPtr dev, ValuatorMask *mask, CARD32 ms) return; updateMotionHistory(dev, ms, mask, dev->last.valuators); - if(!IsMaster(dev) || !IsFloating(dev)) + if(!IsMaster(dev) && !IsFloating(dev)) { DeviceIntPtr master = GetMaster(dev, MASTER_POINTER); updateMotionHistory(master, ms, mask, dev->last.valuators); @@ -1052,17 +1052,39 @@ FreeEventList(InternalEvent *list, int num_events) free(list); } +/** + * Transform vector x/y according to matrix m and drop the rounded coords + * back into x/y. + */ static void -transformAbsolute(DeviceIntPtr dev, ValuatorMask *mask, int *x, int *y) +transform(struct pixman_f_transform *m, int *x, int *y) { struct pixman_f_vector p = {.v = {*x, *y, 1}}; - - pixman_f_transform_point(&dev->transform, &p); + pixman_f_transform_point(m, &p); *x = lround(p.v[0]); *y = lround(p.v[1]); } +static void +transformAbsolute(DeviceIntPtr dev, ValuatorMask *mask) +{ + int x, y, ox, oy; + + ox = x = valuator_mask_isset(mask, 0) ? valuator_mask_get(mask, 0) : + dev->last.valuators[0]; + oy = y = valuator_mask_isset(mask, 1) ? valuator_mask_get(mask, 1) : + dev->last.valuators[1]; + + transform(&dev->transform, &x, &y); + + if (valuator_mask_isset(mask, 0) || ox != x) + valuator_mask_set(mask, 0, x); + + if (valuator_mask_isset(mask, 1) || oy != y) + valuator_mask_set(mask, 1, y); +} + /** * Generate internal events representing this pointer event and enqueue them * on the event queue. @@ -1175,16 +1197,7 @@ GetPointerEvents(InternalEvent *events, DeviceIntPtr pDev, int type, int buttons } } - x = (valuator_mask_isset(&mask, 0) ? valuator_mask_get(&mask, 0) : - pDev->last.valuators[0]); - y = (valuator_mask_isset(&mask, 1) ? valuator_mask_get(&mask, 1) : - pDev->last.valuators[1]); - transformAbsolute(pDev, &mask, &x, &y); - if (valuator_mask_isset(&mask, 0)) - valuator_mask_set(&mask, 0, x); - if (valuator_mask_isset(&mask, 1)) - valuator_mask_set(&mask, 1, y); - + transformAbsolute(pDev, &mask); moveAbsolute(pDev, &x, &y, &mask); } else { if (flags & POINTER_ACCELERATE) { |