forked from pool/xorg-x11-server
Accepting request 1189636 from home:jamborm:gcc14test-m
- Added xorg-xserver-e89edec497ba.patch to fix incompatible pointer type error with GCC 14. If the request is OK, please forward it to Factory soon too so that we can switch the default compiler. Thanks! OBS-URL: https://build.opensuse.org/request/show/1189636 OBS-URL: https://build.opensuse.org/package/show/X11:XOrg/xorg-x11-server?expand=0&rev=891
This commit is contained in:
109
u_01-Improved-ConfineToShape.patch
Normal file
109
u_01-Improved-ConfineToShape.patch
Normal file
@@ -0,0 +1,109 @@
|
||||
From: Keith Packard <keithp@keithp.com>
|
||||
Date: Fri Oct 4 16:00:49 2013 -0700
|
||||
Subject: [PATCH 1/2]Improved ConfineToShape
|
||||
Patch-mainline: to be upstreamed
|
||||
Git-commit: 0d0951624db7ae4686b362c7c6307f1ed46c8579
|
||||
|
||||
References: bnc#62146
|
||||
Signed-off-by: Egbert Eich <eich@suse.com>
|
||||
|
||||
Find the box within the region which is closest to the point and move
|
||||
there.
|
||||
|
||||
Signed-off-by: Keith Packard <keithp@keithp.com>
|
||||
---
|
||||
dix/events.c | 74 ++++++++++++++++++++++++++++++++++++++++--------------------
|
||||
1 file changed, 50 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/dix/events.c b/dix/events.c
|
||||
index efaf91d..5244781 100644
|
||||
--- a/dix/events.c
|
||||
+++ b/dix/events.c
|
||||
@@ -666,37 +666,63 @@ SetCriticalEvent(int event)
|
||||
criticalEvents[event >> 3] |= 1 << (event & 7);
|
||||
}
|
||||
|
||||
+static uint32_t
|
||||
+ConfineToBox(int x, int y, BoxPtr box, int *px, int *py)
|
||||
+{
|
||||
+ int dx, dy;
|
||||
+
|
||||
+ *px = x;
|
||||
+ *py = y;
|
||||
+
|
||||
+ if (*px < box->x1)
|
||||
+ *px = box->x1;
|
||||
+ else if (*px >= box->x2)
|
||||
+ *px = box->x2 - 1;
|
||||
+
|
||||
+ if (*py < box->y1)
|
||||
+ *py = box->y1;
|
||||
+ else if (*py >= box->y2)
|
||||
+ *py = box->y2 - 1;
|
||||
+
|
||||
+ dx = x - *px;
|
||||
+ if (dx < 0) dx = -dx;
|
||||
+ if (dx > 32767)
|
||||
+ dx = 32767;
|
||||
+ dy = y - *py;
|
||||
+ if (dy < 0) dy = -dy;
|
||||
+ if (dy > 32767)
|
||||
+ dy = 32767;
|
||||
+
|
||||
+ return (uint32_t) dx * (uint32_t) dx + (uint32_t) dy * (uint32_t) dy;
|
||||
+}
|
||||
+
|
||||
void
|
||||
ConfineToShape(DeviceIntPtr pDev, RegionPtr shape, int *px, int *py)
|
||||
{
|
||||
- BoxRec box;
|
||||
+ BoxPtr box;
|
||||
+ int nbox;
|
||||
int x = *px, y = *py;
|
||||
- int incx = 1, incy = 1;
|
||||
+ int bx, by;
|
||||
+ uint32_t box_dist_2;
|
||||
+ int best_x = 0, best_y = 0;
|
||||
+ uint32_t best_dist_2 = 0;
|
||||
+ int i;
|
||||
|
||||
- if (RegionContainsPoint(shape, x, y, &box))
|
||||
+ if (RegionContainsPoint(shape, x, y, NULL))
|
||||
return;
|
||||
- box = *RegionExtents(shape);
|
||||
- /* this is rather crude */
|
||||
- do {
|
||||
- x += incx;
|
||||
- if (x >= box.x2) {
|
||||
- incx = -1;
|
||||
- x = *px - 1;
|
||||
- }
|
||||
- else if (x < box.x1) {
|
||||
- incx = 1;
|
||||
- x = *px;
|
||||
- y += incy;
|
||||
- if (y >= box.y2) {
|
||||
- incy = -1;
|
||||
- y = *py - 1;
|
||||
- }
|
||||
- else if (y < box.y1)
|
||||
- return; /* should never get here! */
|
||||
+ box = REGION_RECTS(shape);
|
||||
+ nbox = REGION_NUM_RECTS(shape);
|
||||
+ for (i = 0; i < nbox; i++) {
|
||||
+ box_dist_2 = ConfineToBox(x, y, &box[i], &bx, &by);
|
||||
+ if (i == 0 || box_dist_2 < best_dist_2) {
|
||||
+ best_dist_2 = box_dist_2;
|
||||
+ best_x = bx;
|
||||
+ best_y = by;
|
||||
}
|
||||
- } while (!RegionContainsPoint(shape, x, y, &box));
|
||||
- *px = x;
|
||||
- *py = y;
|
||||
+ }
|
||||
+
|
||||
+ *px = best_x;
|
||||
+ *py = best_y;
|
||||
}
|
||||
|
||||
static void
|
Reference in New Issue
Block a user