[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xorg-server: Changes to 'ubuntu+1'



 debian/changelog                                   |    7 
 debian/patches/500_pointer_barrier_thresholds.diff | 1691 ---------------------
 debian/patches/series                              |    1 
 3 files changed, 7 insertions(+), 1692 deletions(-)

New commits:
commit 0cb4bc760a01c311fbd1978913f1e2716fdbfb74
Author: Timo Aaltonen <tjaalton@ubuntu.com>
Date:   Thu Feb 7 20:27:48 2013 +0200

    drop 500_pointer_barrier_thresholds.diff

diff --git a/debian/changelog b/debian/changelog
index 5a56e57..e7aeab9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+xorg-server (2:1.13.99.901-0ubuntu1) UNRELEASED; urgency=low
+
+  * Merge from unreleased debian git.
+  * 500_pointer_barrier_thresholds.diff: Dropped, implemented upstream.
+
+ -- Timo Aaltonen <tjaalton@ubuntu.com>  Thu, 07 Feb 2013 20:25:26 +0200
+
 xorg-server (2:1.13.99.901-1) UNRELEASED; urgency=low
 
   [ Maarten Lankhorst ]
diff --git a/debian/patches/500_pointer_barrier_thresholds.diff b/debian/patches/500_pointer_barrier_thresholds.diff
deleted file mode 100644
index b61dcfc..0000000
--- a/debian/patches/500_pointer_barrier_thresholds.diff
+++ /dev/null
@@ -1,1691 +0,0 @@
-diff --git a/configure.ac b/configure.ac
-index 2693ce7..b5c3880 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -2130,6 +2130,25 @@ AC_SUBST([prefix])
- 
- AC_CONFIG_COMMANDS([sdksyms], [touch hw/xfree86/sdksyms.dep])
- 
-+AC_PROG_CXX
-+
-+PKG_CHECK_MODULES(XORG_GTEST, xorg-gtest,
-+        [have_xorg_gtest="yes"],
-+        [AC_MSG_WARN([xorg-gtest not installed, tests will not be built])])
-+AM_CONDITIONAL([HAVE_XORG_GTEST], [test "x$have_xorg_gtest" = xyes])
-+AC_SUBST([XORG_GTEST_CFLAGS])
-+AC_SUBST([XORG_GTEST_LIBS])
-+
-+PKG_CHECK_MODULES([XFIXES], xfixes, [have_xfixes="yes"], [have_xfixes="no"])
-+AM_CONDITIONAL([HAVE_XFIXES], [test "x$have_xfixes" = xyes])
-+AC_SUBST([XFIXES_CFLAGS])
-+AC_SUBST([XFIXES_LIBS])
-+
-+PKG_CHECK_MODULES([XTEST], xtst, [have_xtest="yes"], [have_xtest="no"])
-+AM_CONDITIONAL([HAVE_XTEST], [test "x$have_xtest" = xyes])
-+AC_SUBST([XTEST_CFLAGS])
-+AC_SUBST([XTEST_LIBS])
-+
- AC_OUTPUT([
- Makefile
- glx/Makefile
-@@ -2230,6 +2249,7 @@ hw/kdrive/linux/Makefile
- hw/kdrive/src/Makefile
- test/Makefile
- test/xi2/Makefile
-+test/gtest/Makefile
- xserver.ent
- xorg-server.pc
- ])
-diff --git a/dix/dixutils.c b/dix/dixutils.c
-index 9eb5489..bae5fbc 100644
---- a/dix/dixutils.c
-+++ b/dix/dixutils.c
-@@ -522,7 +522,7 @@ ProcessWorkQueue(void)
-         if ((*q->function) (q->client, q->closure)) {
-             /* remove q from the list */
-             *p = q->next;       /* don't fetch until after func called */
--            free(q);
-+            (*q->destroyProc) (q);
-         }
-         else {
-             p = &q->next;       /* don't fetch until after func called */
-@@ -542,7 +542,7 @@ ProcessWorkQueueZombies(void)
-             (void) (*q->function) (q->client, q->closure);
-             /* remove q from the list */
-             *p = q->next;       /* don't fetch until after func called */
--            free(q);
-+            (*q->destroyProc) (q);
-         }
-         else {
-             p = &q->next;       /* don't fetch until after func called */
-@@ -551,6 +551,12 @@ ProcessWorkQueueZombies(void)
-     workQueueLast = p;
- }
- 
-+static void
-+FreeWorkQueueItem (WorkQueuePtr this)
-+{
-+    free(this);
-+}
-+
- Bool
- QueueWorkProc(Bool (*function)
-               (ClientPtr /* pClient */ , pointer /* closure */ ),
-@@ -564,12 +570,22 @@ QueueWorkProc(Bool (*function)
-     q->function = function;
-     q->client = client;
-     q->closure = closure;
-+    q->destroyProc = FreeWorkQueueItem;
-     q->next = NULL;
-     *workQueueLast = q;
-     workQueueLast = &q->next;
-     return TRUE;
- }
- 
-+Bool
-+QueueWorkItem (WorkQueuePtr item)
-+{
-+    item->next = NULL;
-+    *workQueueLast = item;
-+    workQueueLast = &item->next;
-+    return TRUE;
-+}
-+
- /*
-  * Manage a queue of sleeping clients, awakening them
-  * when requested, by using the OS functions IgnoreClient
-diff --git a/dix/getevents.c b/dix/getevents.c
-index 3093786..c608382 100644
---- a/dix/getevents.c
-+++ b/dix/getevents.c
-@@ -85,6 +85,12 @@ typedef const char *string;
- InternalEvent *InputEventList = NULL;
- 
- /**
-+ * xfixes/cursor.c wants the unclamped (x,y) values for velocity
-+ * calculation.  Export them here.
-+ */
-+int unclamped_prex = -1, unclamped_prey = -1;
-+
-+/**
-  * Pick some arbitrary size for Xi motion history.
-  */
- int
-@@ -916,7 +922,15 @@ positionSprite(DeviceIntPtr dev, int mode, ValuatorMask *mask,
-     /* miPointerSetPosition takes care of crossing screens for us, as well as
-      * clipping to the current screen. Coordinates returned are in desktop
-      * coord system */
-+    /*
-+     * Hack to pass the unclipped values through to the pointer barrier code.
-+     * Required (for now) to calculate the velocity.
-+     */
-+    unclamped_prex = (int)floor(*screenx) - scr->x;
-+    unclamped_prey = (int)floor(*screeny) - scr->y;
-     scr = miPointerSetPosition(dev, mode, screenx, screeny);
-+    unclamped_prex = -1;
-+    unclamped_prey = -1;
- 
-     /* If we were constrained, rescale x/y from the screen coordinates so
-      * the device valuators reflect the correct position. For screen
-diff --git a/include/dix.h b/include/dix.h
-index 5dc2ac5..78b8a73 100644
---- a/include/dix.h
-+++ b/include/dix.h
-@@ -245,6 +245,8 @@ extern _X_EXPORT Bool QueueWorkProc(Bool (* /*function */ )(
-                                     pointer     /*closure */
-     );
- 
-+extern _X_EXPORT Bool QueueWorkItem(WorkQueuePtr item);
-+
- typedef Bool (*ClientSleepProcPtr) (ClientPtr /*client */ ,
-                                     pointer /*closure */ );
- 
-diff --git a/include/dixstruct.h b/include/dixstruct.h
-index b2a168a..ba660a3 100644
---- a/include/dixstruct.h
-+++ b/include/dixstruct.h
-@@ -153,6 +153,9 @@ typedef struct _WorkQueue {
-         );
-     ClientPtr client;
-     pointer closure;
-+    void       (*destroyProc) (
-+                struct _WorkQueue * /* this */
-+);
- } WorkQueueRec;
- 
- extern _X_EXPORT TimeStamp currentTime;
-diff --git a/include/protocol-versions.h b/include/protocol-versions.h
-index 479ac2f..f965d6f 100644
---- a/include/protocol-versions.h
-+++ b/include/protocol-versions.h
-@@ -122,7 +122,7 @@
- #define SERVER_XF86VIDMODE_MINOR_VERSION	2
- 
- /* Fixes */
--#define SERVER_XFIXES_MAJOR_VERSION		5
-+#define SERVER_XFIXES_MAJOR_VERSION		6
- #define SERVER_XFIXES_MINOR_VERSION		0
- 
- /* X Input */
-diff --git a/test/Makefile.am b/test/Makefile.am
-index eb61470..29e3fc2 100644
---- a/test/Makefile.am
-+++ b/test/Makefile.am
-@@ -7,6 +7,9 @@ if XORG
- SUBDIRS += xi2
- noinst_PROGRAMS += xkb input xtest misc fixes xfree86
- endif
-+if HAVE_XORG_GTEST
-+SUBDIRS+= gtest
-+endif
- check_LTLIBRARIES = libxservertest.la
- 
- TESTS=$(noinst_PROGRAMS)
-diff --git a/xfixes/cursor.c b/xfixes/cursor.c
-index 602b906..cab5b31 100644
---- a/xfixes/cursor.c
-+++ b/xfixes/cursor.c
-@@ -61,6 +61,7 @@ static RESTYPE CursorClientType;
- static RESTYPE CursorHideCountType;
- static RESTYPE CursorWindowType;
- RESTYPE PointerBarrierType;
-+static RESTYPE PointerBarrierClientType;
- static CursorPtr CursorCurrent[MAXDEVICES];
- 
- static DevPrivateKeyRec CursorScreenPrivateKeyRec;
-@@ -121,6 +122,11 @@ struct PointerBarrierClient {
- };
- 
- /*
-+ * Pick up unclamped (x,y) coordinates from dix/getevents
-+ */
-+extern int unclamped_prex, unclamped_prey;
-+
-+/*
-  * Wrap DisplayCursor to catch cursor change events
-  */
- 
-@@ -130,6 +136,7 @@ typedef struct _CursorScreen {
-     ConstrainCursorHarderProcPtr ConstrainCursorHarder;
-     CursorHideCountPtr pCursorHideCounts;
-     struct xorg_list barriers;
-+    struct xorg_list barrierClients;
- } CursorScreenRec, *CursorScreenPtr;
- 
- #define GetCursorScreen(s) ((CursorScreenPtr)dixLookupPrivate(&(s)->devPrivates, CursorScreenPrivateKey))
-@@ -1080,7 +1087,8 @@ barrier_is_blocking(const struct PointerBarrier * barrier,
- 
-     /* Algorithm below doesn't handle edge cases well, hence the extra
-      * checks. */
--    if (barrier_is_vertical(barrier)) {
-+        if (barrier_is_vertical(barrier) &&
-+	    (dir & (BarrierPositiveX | BarrierNegativeX))) {
-         /* handle immediate barrier adjacency, moving away */
-         if (dir & BarrierPositiveX && x1 == barrier->x1)
-             return FALSE;
-@@ -1092,7 +1100,8 @@ barrier_is_blocking(const struct PointerBarrier * barrier,
-             return TRUE;
-         }
-     }
--    else {
-+   else if (barrier_is_horizontal(barrier) &&
-+		(dir & (BarrierPositiveY | BarrierNegativeY))){
-         /* handle immediate barrier adjacency, moving away */
-         if (dir & BarrierPositiveY && y1 == barrier->y1)
-             return FALSE;
-@@ -1191,6 +1200,126 @@ barrier_clamp_to_barrier(struct PointerBarrier *barrier, int dir, int *x,
-     }
- }
- 
-+/*
-+ * ConstrainCursorHarder is called from the SIGIO context.
-+ * This means we cannot safely send a client event from anything in
-+ * CursorConstrainCursorHarder's callgraph.
-+ *
-+ * Allocate a set of WorkQueue items to use.
-+ */
-+
-+struct BarrierEventStore {
-+    WorkQueueRec wq_item;
-+    xXFixesBarrierNotifyEvent ev;
-+    Bool in_use;
-+};
-+
-+/* Let's guess that 100 events is enough of a buffer. */
-+#define BARRIER_EVENT_QUEUE_SIZE 100
-+struct BarrierEventStore barrierEventQueue[BARRIER_EVENT_QUEUE_SIZE];
-+
-+static void
-+CursorWorkQueueDestroyProc (WorkQueuePtr this)
-+{
-+    struct BarrierEventStore *store;
-+    store = container_of (this, struct BarrierEventStore, wq_item);
-+
-+    store->in_use = FALSE;
-+}
-+
-+static Bool
-+CursorSendBarrierEvent (ClientPtr client, pointer eventStore)
-+{
-+    struct BarrierEventStore *store = (struct BarrierEventStore *)eventStore;
-+    WriteEventsToClient (client, 1, (xEvent *)&store->ev);
-+
-+    return TRUE;
-+}
-+
-+static struct BarrierEventStore *
-+CursorFindFreeEventStore (void)
-+{
-+    for (int i = 0; i < BARRIER_EVENT_QUEUE_SIZE; ++i) {
-+	if (!barrierEventQueue[i].in_use) {
-+	    return &barrierEventQueue[i];
-+	}
-+    }
-+    return NULL;
-+}
-+
-+static void
-+QueueBarrierEvent(CursorScreenPtr cs, struct PointerBarrier *barrier,
-+		  int x, int y, int velocity, Bool threshold_exceeded)
-+{
-+    PointerBarrierEventClientPtr client;
-+    struct BarrierEventStore *store;
-+    xorg_list_for_each_entry(client, &cs->barrierClients, entry) {
-+	store = CursorFindFreeEventStore ();
-+	if (store == NULL) {
-+	    ErrorF ("[xfixes] Barrier event queue full.  Dropping further events\n");
-+	    return;
-+	}
-+
-+	store->in_use = TRUE;
-+
-+	store->ev.type = XFixesEventBase + XFixesBarrierNotify;
-+	store->ev.subtype = threshold_exceeded ? XFixesBarrierThresholdExceededNotify :
-+					         XFixesBarrierHitNotify;
-+	store->ev.event_id = barrier->barrierEventID;
-+	store->ev.barrier = barrier->barrier;
-+	store->ev.x = x;
-+	store->ev.y = y;
-+	store->ev.velocity = velocity;
-+	store->ev.timestamp = currentTime.milliseconds;
-+
-+	if (client->client->swapped) {
-+
-+	    swapl(&store->ev.event_id);
-+	    swapl(&store->ev.barrier);
-+	    swaps(&store->ev.x);
-+	    swaps(&store->ev.y);
-+	    swapl(&store->ev.velocity);
-+	    swapl(&store->ev.timestamp);
-+	}
-+
-+	store->wq_item.function = CursorSendBarrierEvent;
-+	store->wq_item.client = client->client;
-+	store->wq_item.closure = store;
-+	store->wq_item.destroyProc = CursorWorkQueueDestroyProc;
-+
-+	QueueWorkItem (&store->wq_item); 
-+    }
-+}
-+
-+static void
-+barrier_calculate_velocity_components (int x1, int y1, int x2, int y2,
-+				       int *vel_x, int *vel_y)
-+{
-+    static CARD32 last_timestamp = 0;
-+    CARD32 timestamp = GetTimeInMillis();
-+    int dx, dy;
-+    int dt = timestamp - last_timestamp;
-+
-+    if (last_timestamp == 0) {
-+	/* Not much we can do for the first event */
-+	*vel_x = 0;
-+	*vel_y = 0;
-+	last_timestamp = timestamp;
-+	return;
-+    }
-+
-+    /* Lets not divide by zero if we can avoid it */
-+    dt = dt > 0 ? dt : 1;
-+
-+    dx = x2 - x1;
-+    dy = y2 - y1;
-+
-+    *vel_x = abs(dx) * 1000.0 / dt;
-+    *vel_y = abs(dy) * 1000.0 / dt;
-+
-+    last_timestamp = timestamp;
-+}
-+
- static void
- CursorConstrainCursorHarder(DeviceIntPtr dev, ScreenPtr screen, int mode,
-                             int *x, int *y)
-@@ -1200,12 +1329,23 @@ CursorConstrainCursorHarder(DeviceIntPtr dev, ScreenPtr screen, int mode,
-     if (!xorg_list_is_empty(&cs->barriers) && !IsFloating(dev) &&
-         mode == Relative) {
-         int ox, oy;
-+        int vel_x, vel_y;
-         int dir;
-         struct PointerBarrier *nearest = NULL;
-+        PointerBarrierClientPtr c;
- 
-         /* where are we coming from */
-         miPointerGetPosition(dev, &ox, &oy);
- 
-+        /* Use the unclamped values, if available.  If not, *x, *y
-+         * will have to do.
-+         * NOTE: We should never get here with unclamped values unset.
-+         */
-+        if (unclamped_prex == -1 || unclamped_prey == -1) {
-+            unclamped_prex = *x;
-+            unclamped_prey = *y;
-+        }
-+
-         /* How this works:
-          * Given the origin and the movement vector, get the nearest barrier
-          * to the origin that is blocking the movement.
-@@ -1213,11 +1353,27 @@ CursorConstrainCursorHarder(DeviceIntPtr dev, ScreenPtr screen, int mode,
-          * Then, check from the clamped intersection to the original
-          * destination, again finding the nearest barrier and clamping.
-          */
--        dir = barrier_get_direction(ox, oy, *x, *y);
-+        dir = barrier_get_direction(ox, oy, unclamped_prex, unclamped_prey);
-+        barrier_calculate_velocity_components(ox, oy, unclamped_prex, unclamped_prey, &vel_x, &vel_y);
- 
--        nearest = barrier_find_nearest(cs, dir, ox, oy, *x, *y);
-+        nearest = barrier_find_nearest(cs, dir, ox, oy, unclamped_prex, unclamped_prey);
-         if (nearest) {
--            barrier_clamp_to_barrier(nearest, dir, x, y);
-+	    int velocity = barrier_is_vertical(nearest) ? vel_x : vel_y;
-+	    Bool threshold_exceeded = (nearest->velocity != 0) &&
-+				      (velocity > nearest->velocity);
-+
-+	    if (!nearest->lastHit) {
-+		/* This is the start of a new barrier event */
-+		nearest->barrierEventID++;
-+	    }
-+
-+	    if ((!threshold_exceeded || nearest->lastHit) &&
-+		(nearest->barrierEventID != nearest->releaseEventID)) {
-+		barrier_clamp_to_barrier(nearest, dir, x, y);
-+		nearest->hit = TRUE;
-+	    }
-+
-+	    QueueBarrierEvent(cs, nearest, *x, *y, velocity, threshold_exceeded);
- 
-             if (barrier_is_vertical(nearest)) {
-                 dir &= ~(BarrierNegativeX | BarrierPositiveX);
-@@ -1228,11 +1384,31 @@ CursorConstrainCursorHarder(DeviceIntPtr dev, ScreenPtr screen, int mode,
-                 oy = *y;
-             }
- 
--            nearest = barrier_find_nearest(cs, dir, ox, oy, *x, *y);
-+            nearest = barrier_find_nearest(cs, dir, ox, oy, unclamped_prex, unclamped_prey);
-             if (nearest) {
--                barrier_clamp_to_barrier(nearest, dir, x, y);
-+			velocity = barrier_is_vertical(nearest) ? vel_x : vel_y;
-+			threshold_exceeded = (nearest->velocity != 0) &&
-+						(velocity > nearest->velocity);
-+
-+			if (!nearest->lastHit) {
-+				/* This is the start of a new barrier event */
-+				nearest->barrierEventID++;
-+			}
-+
-+			if ((!threshold_exceeded || nearest->lastHit) &&
-+				(nearest->barrierEventID != nearest->releaseEventID)) {
-+				barrier_clamp_to_barrier(nearest, dir, x, y);
-+				nearest->hit = TRUE;
-+			}
-+
-+			QueueBarrierEvent(cs, nearest, *x, *y, velocity, threshold_exceeded);
-             }
-         }
-+
-+	xorg_list_for_each_entry(c, &cs->barriers, entry) {
-+	    c->barrier.lastHit = c->barrier.hit;
-+	    c->barrier.hit = FALSE;
-+	}
-     }
- 
-     if (cs->ConstrainCursorHarder) {
-@@ -1247,15 +1423,45 @@ CreatePointerBarrierClient(ScreenPtr screen, ClientPtr client,
-                            xXFixesCreatePointerBarrierReq * stuff)
- {
-     CursorScreenPtr cs = GetCursorScreen(screen);
--    struct PointerBarrierClient *ret = malloc(sizeof(*ret));
-+    struct PointerBarrierClient *ret = calloc(sizeof(*ret), 1);
- 
-     if (ret) {
-         ret->screen = screen;
-+        ret->barrier.barrier = stuff->barrier;
-         ret->barrier.x1 = min(stuff->x1, stuff->x2);
-         ret->barrier.x2 = max(stuff->x1, stuff->x2);
-         ret->barrier.y1 = min(stuff->y1, stuff->y2);
-         ret->barrier.y2 = max(stuff->y1, stuff->y2);
-         ret->barrier.directions = stuff->directions & 0x0f;
-+	ret->barrier.velocity = 0;
-+	ret->barrier.barrierEventID = 0;
-+	if (barrier_is_horizontal(&ret->barrier))
-+	    ret->barrier.directions &= ~(BarrierPositiveX | BarrierNegativeX);
-+	if (barrier_is_vertical(&ret->barrier))
-+	    ret->barrier.directions &= ~(BarrierPositiveY | BarrierNegativeY);
-+	xorg_list_add(&ret->entry, &cs->barriers);
-+    }
-+
-+    return ret;
-+}
-+
-+static struct PointerBarrierClient *
-+CreatePointerBarrierVelocityClient(ScreenPtr screen, ClientPtr client,
-+			   xXFixesCreatePointerBarrierVelocityReq *stuff)
-+{
-+    CursorScreenPtr cs = GetCursorScreen(screen);
-+    struct PointerBarrierClient *ret = calloc(sizeof(*ret), 1);
-+
-+    if (ret) {
-+	ret->screen = screen;
-+	ret->barrier.barrier = stuff->barrier;
-+	ret->barrier.x1 = min(stuff->x1, stuff->x2);
-+	ret->barrier.x2 = max(stuff->x1, stuff->x2);
-+	ret->barrier.y1 = min(stuff->y1, stuff->y2);
-+	ret->barrier.y2 = max(stuff->y1, stuff->y2);
-+	ret->barrier.directions = stuff->directions & 0x0f;
-+	ret->barrier.velocity = stuff->velocity;
-+	ret->barrier.barrierEventID = 0;
-         if (barrier_is_horizontal(&ret->barrier))
-             ret->barrier.directions &= ~(BarrierPositiveX | BarrierNegativeX);
-         if (barrier_is_vertical(&ret->barrier))
-@@ -1328,6 +1534,68 @@ SProcXFixesCreatePointerBarrier(ClientPtr client)
-     return ProcXFixesVector[stuff->xfixesReqType] (client);
- }
- 
-+int
-+ProcXFixesCreatePointerBarrierVelocity (ClientPtr client)
-+{
-+    int err;
-+    WindowPtr pWin;
-+    struct PointerBarrierClient *barrier;
-+    struct PointerBarrier b;
-+    REQUEST (xXFixesCreatePointerBarrierVelocityReq);
-+
-+    REQUEST_SIZE_MATCH(xXFixesCreatePointerBarrierVelocityReq);
-+    LEGAL_NEW_RESOURCE(stuff->barrier, client);
-+
-+    err = dixLookupWindow(&pWin, stuff->window, client, DixReadAccess);
-+    if (err != Success) {
-+	client->errorValue = stuff->window;
-+	return err;
-+    }
-+
-+    /* This sure does need fixing. */
-+    if (stuff->num_devices)
-+	return BadImplementation;
-+
-+    b.x1 = stuff->x1;
-+    b.x2 = stuff->x2;
-+    b.y1 = stuff->y1;
-+    b.y2 = stuff->y2;
-+
-+    if (!barrier_is_horizontal(&b) && !barrier_is_vertical(&b))
-+	return BadValue;
-+
-+    /* no 0-sized barriers */
-+    if (barrier_is_horizontal(&b) && barrier_is_vertical(&b))
-+	return BadValue;
-+
-+    if (!(barrier = CreatePointerBarrierVelocityClient(pWin->drawable.pScreen,
-+						       client, stuff)))
-+	return BadAlloc;
-+
-+    if (!AddResource(stuff->barrier, PointerBarrierType, &barrier->barrier))
-+	return BadAlloc;
-+
-+    return Success;
-+}
-+
-+int
-+SProcXFixesCreatePointerBarrierVelocity (ClientPtr client)
-+{
-+    REQUEST(xXFixesCreatePointerBarrierVelocityReq);
-+
-+    swaps(&stuff->length);
-+    REQUEST_SIZE_MATCH(xXFixesCreatePointerBarrierReq);
-+    swapl(&stuff->barrier);
-+    swapl(&stuff->window);
-+    swaps(&stuff->x1);
-+    swaps(&stuff->y1);
-+    swaps(&stuff->x2);
-+    swaps(&stuff->y2);
-+    swapl(&stuff->directions);
-+    swapl(&stuff->velocity);
-+    return ProcXFixesVector[stuff->xfixesReqType](client);
-+}
-+
- static int
- CursorFreeBarrier(void *data, XID id)
- {
-@@ -1384,6 +1652,116 @@ SProcXFixesDestroyPointerBarrier(ClientPtr client)
-     return ProcXFixesVector[stuff->xfixesReqType] (client);
- }
- 
-+static int
-+CursorFreeBarrierClient(void *data, XID id)
-+{
-+    PointerBarrierEventClientPtr client = data, c;
-+    ScreenPtr screen = client->screen;
-+    CursorScreenPtr cs = GetCursorScreen(screen);
-+
-+    /* find and unlink from the screen private */
-+    xorg_list_for_each_entry(c, &cs->barrierClients, entry) {
-+	if (c == client) {
-+	    xorg_list_del(&c->entry);
-+	    break;
-+	}
-+    }
-+
-+    free(client);
-+    return Success;
-+}
-+
-+static struct PointerBarrierEventClient *
-+CreatePointerBarrierEventClient(ScreenPtr screen, ClientPtr client,
-+				   xXFixesSelectBarrierInputReq *stuff)
-+{
-+    CursorScreenPtr cs = GetCursorScreen(screen);
-+    struct PointerBarrierEventClient *ret = malloc(sizeof(*ret));
-+
-+    if (ret) {
-+	ret->screen = screen;
-+	ret->client = client;
-+	ret->eventMask = stuff->eventMask;
-+	ret->window = stuff->window;
-+	ret->resource = FakeClientID (client->index);
-+      xorg_list_add(&ret->entry, &cs->barrierClients);
-+    }
-+
-+    return ret;
-+}
-+
-+int
-+ProcXFixesSelectBarrierInput (ClientPtr client)
-+{
-+    int err;
-+    WindowPtr pWin;
-+    struct PointerBarrierEventClient *eventClient;
-+    REQUEST (xXFixesSelectBarrierInputReq);
-+
-+    REQUEST_SIZE_MATCH(xXFixesSelectBarrierInputReq);
-+
-+    err = dixLookupWindow(&pWin	, stuff->window, client, DixReadAccess);
-+    if (err != Success) {
-+	client->errorValue = stuff->window;
-+	return err;
-+    }
-+
-+    if (!(eventClient = CreatePointerBarrierEventClient(pWin->drawable.pScreen,
-+							client,
-+							stuff)))
-+      return BadAlloc;
-+
-+    if (!AddResource (eventClient->resource, PointerBarrierClientType, eventClient))
-+      return BadAlloc;
-+
-+    return Success;
-+}
-+
-+int
-+SProcXFixesSelectBarrierInput (ClientPtr client)
-+{
-+    REQUEST(xXFixesSelectBarrierInputReq);
-+
-+    swaps(&stuff->length);
-+    REQUEST_SIZE_MATCH(xXFixesSelectBarrierInputReq);
-+    swapl(&stuff->window);
-+    swapl(&stuff->eventMask);
-+    return ProcXFixesVector[stuff->xfixesReqType](client);
-+}
-+
-+int
-+ProcXFixesBarrierReleasePointer (ClientPtr client)
-+{
-+    int err;
-+    struct PointerBarrier *barrier;
-+    REQUEST (xXFixesBarrierReleasePointerReq);
-+    REQUEST_SIZE_MATCH(xXFixesBarrierReleasePointerReq);
-+
-+    err = dixLookupResourceByType((void **)&barrier, stuff->barrier,
-+				  PointerBarrierType, client,
-+				  DixReadAccess);
-+    if (err != Success) {
-+	client->errorValue = stuff->barrier;
-+	return err;
-+    }
-+
-+    barrier->releaseEventID = stuff->event_id;
-+
-+    return Success;
-+}
-+
-+int
-+SProcXFixesBarrierReleasePointer (ClientPtr client)
-+{
-+    REQUEST(xXFixesBarrierReleasePointerReq);
-+
-+    swaps(&stuff->length);
-+    REQUEST_SIZE_MATCH(xXFixesBarrierReleasePointerReq);
-+    swapl(&stuff->barrier);
-+    swapl(&stuff->event_id);
-+    return ProcXFixesVector[stuff->xfixesReqType](client);
-+}
-+
- Bool
- XFixesCursorInit(void)
- {
-@@ -1403,6 +1781,7 @@ XFixesCursorInit(void)
-         if (!cs)
-             return FALSE;
-         xorg_list_init(&cs->barriers);
-+        xorg_list_init(&cs->barrierClients);
-         Wrap(cs, pScreen, CloseScreen, CursorCloseScreen);
-         Wrap(cs, pScreen, DisplayCursor, CursorDisplayCursor);
-         Wrap(cs, pScreen, ConstrainCursorHarder, CursorConstrainCursorHarder);
-@@ -1417,7 +1796,8 @@ XFixesCursorInit(void)
-                                              "XFixesCursorWindow");
-     PointerBarrierType = CreateNewResourceType(CursorFreeBarrier,
-                                                "XFixesPointerBarrier");
--
-+    PointerBarrierClientType = CreateNewResourceType(CursorFreeBarrierClient,
-+                                               "XFixesPointerBarrierClient");
-     return CursorClientType && CursorHideCountType && CursorWindowType &&
--        PointerBarrierType;
-+        PointerBarrierType && PointerBarrierClientType;
- }
-diff --git a/xfixes/xfixes.c b/xfixes/xfixes.c
-index f80230f..36b93b7 100644
---- a/xfixes/xfixes.c
-+++ b/xfixes/xfixes.c
-@@ -102,6 +102,7 @@ static const int version_requests[] = {
-     X_XFixesExpandRegion,       /* Version 3 */
-     X_XFixesShowCursor,         /* Version 4 */
-     X_XFixesDestroyPointerBarrier,      /* Version 5 */
-+    X_XFixesBarrierReleasePointer, /* Version 6 */
- };
- 
- #define NUM_VERSION_REQUESTS	(sizeof (version_requests) / sizeof (version_requests[0]))
-@@ -140,7 +141,11 @@ int (*ProcXFixesVector[XFixesNumberRequests]) (ClientPtr) = {
- /*************** Version 4 ****************/
-         ProcXFixesHideCursor, ProcXFixesShowCursor,
- /*************** Version 5 ****************/
--ProcXFixesCreatePointerBarrier, ProcXFixesDestroyPointerBarrier,};
-+ProcXFixesCreatePointerBarrier, ProcXFixesDestroyPointerBarrier,
-+/*************** Version 6 ****************/
-+        ProcXFixesCreatePointerBarrierVelocity,
-+        ProcXFixesSelectBarrierInput,
-+        ProcXFixesBarrierReleasePointer,};
- 
- static int
- ProcXFixesDispatch(ClientPtr client)
-@@ -200,7 +205,11 @@ static int (*SProcXFixesVector[XFixesNumberRequests]) (ClientPtr) = {
- /*************** Version 4 ****************/
-         SProcXFixesHideCursor, SProcXFixesShowCursor,
- /*************** Version 5 ****************/
--SProcXFixesCreatePointerBarrier, SProcXFixesDestroyPointerBarrier,};
-+SProcXFixesCreatePointerBarrier, SProcXFixesDestroyPointerBarrier,
-+/*************** Version 6 ****************/
-+        SProcXFixesCreatePointerBarrierVelocity,
-+        SProcXFixesSelectBarrierInput,
-+        SProcXFixesBarrierReleasePointer,};
- 
- static int
- SProcXFixesDispatch(ClientPtr client)
-diff --git a/xfixes/xfixes.h b/xfixes/xfixes.h
-index 19af09f..fc7c3c4 100644
---- a/xfixes/xfixes.h
-+++ b/xfixes/xfixes.h
-@@ -28,6 +28,7 @@
- #define _XFIXES_H_
- 
- #include "resource.h"
-+#include "list.h"
- 
- extern _X_EXPORT RESTYPE RegionResType;
- extern _X_EXPORT RESTYPE PointerBarrierType;
-@@ -52,9 +53,25 @@ extern _X_EXPORT int XFixesErrorBase;
- extern _X_EXPORT RegionPtr
-  XFixesRegionCopy(RegionPtr pRegion);
- 
-+typedef struct PointerBarrierEventClient *PointerBarrierEventClientPtr;
-+
-+struct PointerBarrierEventClient {
-+    ScreenPtr screen;
-+    ClientPtr client;
-+    CARD32    eventMask;
-+    XID window;
-+    XID resource;
-+    struct xorg_list entry;
-+};
-+
- struct PointerBarrier {
-+    XID    barrier;
-     CARD16 x1, x2, y1, y2;
-     CARD32 directions;
-+    CARD32 velocity;
-+    CARD32 barrierEventID;
-+    CARD32 releaseEventID;
-+    Bool   hit, lastHit;
- };
- 
- extern int
-diff --git a/xfixes/xfixesint.h b/xfixes/xfixesint.h
-index 71f88a9..8b204dc 100644
---- a/xfixes/xfixesint.h
-+++ b/xfixes/xfixesint.h
-@@ -59,6 +59,7 @@
- #include "windowstr.h"
- #include "selection.h"
- #include "xfixes.h"
-+#include "list.h"
- 
- extern int XFixesEventBase;
- 
-@@ -295,6 +296,26 @@ int
- int
-  SProcXFixesDestroyPointerBarrier(ClientPtr client);
- 
-+/* Version 6 */
-+
-+int
-+ProcXFixesSelectBarrierInput (ClientPtr client);
-+
-+int
-+SProcXFixesSelectBarrierInput (ClientPtr client);
-+
-+int
-+ProcXFixesCreatePointerBarrierVelocity (ClientPtr client);
-+
-+int
-+SProcXFixesCreatePointerBarrierVelocity (ClientPtr client);
-+
-+int
-+ProcXFixesBarrierReleasePointer (ClientPtr client);
-+
-+int
-+SProcXFixesBarrierReleasePointer (ClientPtr client);
-+
- /* Xinerama */
- extern int (*PanoramiXSaveXFixesVector[XFixesNumberRequests]) (ClientPtr);
- void PanoramiXFixesInit(void);
-diff --git a/dix/dixutils.c b/dix/dixutils.c
-index 9eb5489..521bdce 100644
-diff -Nru /dev/null xorg-server/test/gtest/dummy.conf
---- /dev/null	1970-01-01 01:00:00.000000000 +0100
-+++ xorg-server/test/gtest/dummy.conf	2012-05-21 18:00:45.996945542 +0200
-@@ -0,0 +1,4 @@
-+Section "Device"
-+    Identifier "Dummy video device"
-+    Driver "dummy"
-+EndSection
-diff -Nru /dev/null xorg-server/test/gtest/Makefile.am
---- /dev/null	1970-01-01 01:00:00.000000000 +0100
-+++ xorg-server/test/gtest/Makefile.am	2012-05-21 18:00:45.996545542 +0200
-@@ -0,0 +1,27 @@
-+check_PROGRAMS = xfixes_barriers
-+check_DATA = dummy.conf
-+
-+TESTS=xfixes_barriers
-+
-+GTEST_SRC_DIR = /usr/src/gtest
-+GTEST_SOURCES = $(GTEST_SRC_DIR)/src/gtest-all.cc
-+
-+xfixes_barriers_CXXFLAGS = $(AM_CXXFLAGS) \
-+	-I$(GTEST_SRC_DIR) \
-+	$(XORG_GTEST_CFLAGS) \
-+	$(XTEST_CFLAGS) \
-+	$(XFIXES_CFLAGS) \
-+	-DXORG_BINARY=\"$(top_builddir)/hw/xfree86/Xorg\" \
-+	-DXORG_DUMMY_CONF=\"$(abs_srcdir)/dummy.conf\"
-+
-+xfixes_barriers_LDADD = \
-+	$(XFIXES_LIBS) \
-+	$(XTEST_LIBS) \
-+	$(XORG_GTEST_LIBS) \
-+	-lpthread
-+
-+xfixes_barriers_SOURCES = \
-+	xfixes_barriers.cpp
-+
-+nodist_xfixes_barriers_SOURCES = \
-+	$(GTEST_SOURCES)
-diff -Nru /dev/null xorg-server/test/gtest/xfixes_barriers.cpp
---- /dev/null	1970-01-01 01:00:00.000000000 +0100
-+++ xorg-server/test/gtest/xfixes_barriers.cpp	2012-05-21 18:00:45.995445542 +0200
-@@ -0,0 +1,828 @@
-+/*
-+
-+Copyright (c) 2012, Canonical Ltd
-+
-+Permission is hereby granted, free of charge, to any person obtaining a
-+copy of this software and associated documentation files (the "Software"),
-+to deal in the Software without restriction, including without limitation
-+the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+and/or sell copies of the Software, and to permit persons to whom the
-+Software is furnished to do so, subject to the following conditions:
-+
-+The above copyright notice and this permission notice (including the next
-+paragraph) shall be included in all copies or substantial portions of the
-+Software.
-+
-+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+DEALINGS IN THE SOFTWARE.
-+*/
-+
-+#include <iostream>
-+#include <sys/time.h>
-+#include <unistd.h>
-+#include <gtest/gtest.h>
-+#include <xorg/gtest/test.h>
-+#include <xorg/gtest/environment.h>
-+#include <X11/Xlib.h>
-+#include <X11/extensions/XTest.h>
-+#include <X11/extensions/Xfixes.h>
-+
-+
-+int main (int argc, char **argv)
-+{
-+    ::testing::InitGoogleTest (&argc, argv);
-+    xorg::testing::Environment* environment = new xorg::testing::Environment ();
-+    environment->set_conf_file (XORG_DUMMY_CONF);
-+    environment->set_server (XORG_BINARY);
-+    testing::AddGlobalTestEnvironment (environment);
-+    return RUN_ALL_TESTS ();
-+}
-+
-+class BarrierTest : public xorg::testing::Test {
-+    public:
-+    ::Display *dpy;
-+    static XErrorEvent *lastError;
-+    int xtest_eventbase;
-+    int xtest_errorbase;
-+    int fixes_eventbase;
-+    int fixes_errorbase;
-+
-+    void AssertPointerPosition (int expected_x, int expected_y)
-+    {
-+        int x, y, unused_int;
-+        unsigned int unused_uint;
-+        Window unused_win;
-+
-+        XQueryPointer (Display (), DefaultRootWindow (Display ()),
-+                       &unused_win, &unused_win, &x, &y,
-+                       &unused_int, &unused_int, &unused_uint);
-+
-+        ASSERT_TRUE (x == expected_x && y == expected_y) <<
-+            "Incorrect pointer position: Expected ("<<
-+            expected_x<< ", "<<expected_y<<"), got "<<
-+            "("<<x<<", "<<y<<")\n";
-+    }
-+
-+    bool WaitForXEvent (int msTimeout = 1000)
-+    {
-+        fd_set fds;
-+        int xfd = ConnectionNumber (Display ());
-+        struct timeval tv;
-+        int retval;
-+
-+        FD_ZERO (&fds);
-+        FD_SET (xfd, &fds);
-+
-+        tv.tv_sec = msTimeout / 1000;
-+        tv.tv_usec = (msTimeout % 1000) * 1000;
-+
-+        retval = select (xfd + 1, &fds, NULL, NULL, &tv);
-+
-+        EXPECT_NE (-1, retval)<<"Error waiting for X event";
-+
-+        return retval;
-+    }
-+
-+    protected:
-+    virtual void SetUp ()
-+    {
-+        ASSERT_NO_FATAL_FAILURE (xorg::testing::Test::SetUp());
-+
-+        dpy = Display ();
-+        int major = 2, minor = 2;
-+        ASSERT_TRUE (XTestQueryExtension (dpy,
-+                                          &xtest_eventbase, &xtest_errorbase,
-+                                          &major, &minor));
-+        ASSERT_EQ (2, major);
-+        ASSERT_TRUE (minor >= 2);
-+
-+        major = 6;


Reply to: