From 8ef0974874f322e3ce2f3e6be4ab3c7e73a7b380 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 19 May 2011 14:50:17 +1000 Subject: [PATCH 1/8] test: don't test for double alignment on i386. (#36986) i386 is one of the few architectures that doesn't need double alignment. X.Org Bug 36986 Signed-off-by: Peter Hutterer --- test/input.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/input.c b/test/input.c index ac37d67a1..837ce49dc 100644 --- a/test/input.c +++ b/test/input.c @@ -1223,8 +1223,11 @@ static void dix_valuator_alloc(void) assert(v); assert(v->numAxes == num_axes); +#ifndef __i386__ + /* must be double-aligned on 64 bit */ assert(((void*)v->axisVal - (void*)v) % sizeof(double) == 0); assert(((void*)v->axes - (void*)v) % sizeof(double) == 0); +#endif num_axes ++; } From f94898928dfaf8df648bc3eea7d304826b7ac1b8 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 31 May 2011 14:48:33 +1000 Subject: [PATCH 2/8] dix: fix an error message. event type, not device type. Signed-off-by: Peter Hutterer --- dix/events.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dix/events.c b/dix/events.c index b60c29952..1aadd57ee 100644 --- a/dix/events.c +++ b/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; } From 62f1bf96e1ea27e1eff137cb9333f3dd3b014dd0 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 1 Jun 2011 10:22:44 +1000 Subject: [PATCH 3/8] test: fix memset size for WindowRec (#37801) X.Org Bug 37801 Signed-off-by: Peter Hutterer Reviewed-by: Jeremy Huddleston Reviewed-by: Daniel Stone Reviewed-by: Cyril Brulebois --- test/xi2/protocol-common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/xi2/protocol-common.c b/test/xi2/protocol-common.c index 6ffc69721..423453358 100644 --- a/test/xi2/protocol-common.c +++ b/test/xi2/protocol-common.c @@ -121,7 +121,7 @@ ClientRec init_client(int len, void *data) void init_window(WindowPtr window, WindowPtr parent, int id) { - memset(window, 0, sizeof(window)); + memset(window, 0, sizeof(*window)); window->drawable.id = id; if (parent) From fe4b818700453b76d9f46749dac5d12540b91e63 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 31 May 2011 10:23:57 +1000 Subject: [PATCH 4/8] dix: don't pass x/y to transformAbsolute We passed in the mask, but didn't do anything with it. Move the logic to take the axes out of the valuator masks into transformAbsolute. Signed-off-by: Peter Hutterer Reviewed-by: Simon Thum --- dix/getevents.c | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/dix/getevents.c b/dix/getevents.c index 13789f6a2..6dcee3e97 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -1052,17 +1052,38 @@ 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; + + x = valuator_mask_isset(mask, 0) ? valuator_mask_get(mask, 0) : + dev->last.valuators[0]; + 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)) + valuator_mask_set(mask, 0, x); + if (valuator_mask_isset(mask, 1)) + valuator_mask_set(mask, 1, y); +} + /** * Generate internal events representing this pointer event and enqueue them * on the event queue. @@ -1175,16 +1196,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) { From b75cdb5bf76303162e947173e8ee68253a861272 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 31 May 2011 10:51:19 +1000 Subject: [PATCH 5/8] dix: drop x/y back into the right valuators after transformation. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the matrix is used for rotation, the coordinates affected may change. e.g. a valuator mask of (x, nil) becomes [x, lasty] and is rotated to [lasty, x]. Since the second value was unset, we would not drop x back into the mask, resulting in a loss of movement. Thus, drop any value that changed after applying the matrix into the valuators. Thus, the example above becomes (x, nil) → [x, lasty] → [lasty, x] → (lasty, x) Signed-off-by: Peter Hutterer Reviewed-by: Simon Thum --- dix/getevents.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/dix/getevents.c b/dix/getevents.c index 6dcee3e97..1352a81e5 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -1069,18 +1069,19 @@ transform(struct pixman_f_transform *m, int *x, int *y) static void transformAbsolute(DeviceIntPtr dev, ValuatorMask *mask) { - int x, y; + int x, y, ox, oy; - x = valuator_mask_isset(mask, 0) ? valuator_mask_get(mask, 0) : - dev->last.valuators[0]; - y = valuator_mask_isset(mask, 1) ? valuator_mask_get(mask, 1) : - dev->last.valuators[1]; + 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)) + if (valuator_mask_isset(mask, 0) || ox != x) valuator_mask_set(mask, 0, x); - if (valuator_mask_isset(mask, 1)) + + if (valuator_mask_isset(mask, 1) || oy != y) valuator_mask_set(mask, 1, y); } From c042a267c40d35b4fb947f4bafdfeb541dd9d772 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 27 May 2011 10:10:48 +1000 Subject: [PATCH 6/8] dix: use xi2_get_type instead of manual typecast Signed-off-by: Peter Hutterer Reviewed-by: Jeremy Huddleston --- dix/events.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dix/events.c b/dix/events.c index 1aadd57ee..3fae52df0 100644 --- a/dix/events.c +++ b/dix/events.c @@ -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]; From bfd8422e8877acf02155ca0bd7fbd2416b029720 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 27 May 2011 12:24:21 +1000 Subject: [PATCH 7/8] Xi: use __func__ instead of function name. Signed-off-by: Peter Hutterer Reviewed-by: Cyril Brulebois --- Xi/exevents.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index c6f9d467f..3b0411d61 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -890,8 +890,8 @@ ProcessRawEvent(RawDeviceEvent *ev, DeviceIntPtr device) i = EventToXI2((InternalEvent*)ev, (xEvent**)&xi); if (i != Success) { - ErrorF("[Xi] %s: XI2 conversion failed in ProcessRawEvent (%d)\n", - device->name, i); + ErrorF("[Xi] %s: XI2 conversion failed in %s (%d)\n", + __func__, device->name, i); return; } From 0d140567ba2b5bf364265dba07de519f691c67a1 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 7 Jun 2011 10:42:50 +1000 Subject: [PATCH 8/8] dix: fix crashers with floating device. dc57f89959e549403f8488eb9f23425bd7118b22 accidentally reversed the conditions. in dix/events.c we try to detach floating devices. This leads to a NULL-dereference on GetMaster()->id. in dix/getevents.c we try to get the master device for the floating slave and dereference it. Signed-off-by: Peter Hutterer Reviewed-by: Jeremy Huddleston --- dix/events.c | 2 +- dix/getevents.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dix/events.c b/dix/events.c index 3fae52df0..3c7bd50cd 100644 --- a/dix/events.c +++ b/dix/events.c @@ -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; diff --git a/dix/getevents.c b/dix/getevents.c index 1352a81e5..c935c971c 100644 --- a/dix/getevents.c +++ b/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);