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

xorg-server: Changes to 'ubuntu'



 debian/changelog                                   |   10 
 debian/control                                     |    2 
 debian/patches/500_pointer_barrier_thresholds.diff |  559 +++++++++++++++++++++
 debian/patches/series                              |    3 
 4 files changed, 573 insertions(+), 1 deletion(-)

New commits:
commit 775b75fe9b5f46ce437b89a27d106cf823508613
Author: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
Date:   Fri Jan 27 21:46:54 2012 +1100

    Bump build-dep to ensure XFIXES 6.0 protocol headers are available

diff --git a/debian/changelog b/debian/changelog
index 3f74559..04c12a5 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -3,6 +3,8 @@ xorg-server (2:1.11.3-0ubuntu9) precise; urgency=low
   * debian/patches/500_pointer_barrier_thresholds.diff:
     - Implement proposed XFIXES 6.0 protocol.  This protocol is subject to
       change, use at own risk!
+  * debian/control:
+    - Bump build-dep on x11proto-fixes to pick up new protocol definition
 
  -- Christopher James Halse Rogers <raof@ubuntu.com>  Fri, 27 Jan 2012 20:05:42 +1100
 
diff --git a/debian/control b/debian/control
index a80659e..88514fe 100644
--- a/debian/control
+++ b/debian/control
@@ -25,7 +25,7 @@ Build-Depends:
  x11proto-composite-dev (>= 1:0.4),
  x11proto-core-dev (>= 7.0.22),
  x11proto-damage-dev (>= 1.1),
- x11proto-fixes-dev (>= 1:5.0),
+ x11proto-fixes-dev (>= 1:5.0-2ubuntu1),
  x11proto-kb-dev (>= 1.0.3),
  x11proto-xinerama-dev,
  x11proto-randr-dev (>= 1.2.99.3),

commit cca89364a0a78fa66e423bb10eac3f23f4c5c809
Author: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
Date:   Fri Jan 27 21:40:17 2012 +1100

    Add initial implementation of XFIXES 6.0 protocol

diff --git a/debian/changelog b/debian/changelog
index 31ee64a..3f74559 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+xorg-server (2:1.11.3-0ubuntu9) precise; urgency=low
+
+  * debian/patches/500_pointer_barrier_thresholds.diff:
+    - Implement proposed XFIXES 6.0 protocol.  This protocol is subject to
+      change, use at own risk!
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com>  Fri, 27 Jan 2012 20:05:42 +1100
+
 xorg-server (2:1.11.3-0ubuntu8) precise; urgency=low
 
   * debian/patches/224_return_BadWindow_not_BadMatch.diff:
diff --git a/debian/patches/500_pointer_barrier_thresholds.diff b/debian/patches/500_pointer_barrier_thresholds.diff
new file mode 100644
index 0000000..b1e0859
--- /dev/null
+++ b/debian/patches/500_pointer_barrier_thresholds.diff
@@ -0,0 +1,559 @@
+Index: xorg-server/include/protocol-versions.h
+===================================================================
+--- xorg-server.orig/include/protocol-versions.h	2012-01-27 20:49:26.085712305 +1100
++++ xorg-server/include/protocol-versions.h	2012-01-27 20:53:59.721697695 +1100
+@@ -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 */
+Index: xorg-server/mi/mipointer.c
+===================================================================
+--- xorg-server.orig/mi/mipointer.c	2012-01-27 20:53:59.525697704 +1100
++++ xorg-server/mi/mipointer.c	2012-01-27 20:53:59.721697695 +1100
+@@ -623,6 +623,9 @@
+ 	    }
+ 	}
+     }
++    if (pScreen->ConstrainCursorHarder)
++       pScreen->ConstrainCursorHarder(pDev, pScreen, mode, &x, &y);
++
+     /* Constrain the sprite to the current limits. */
+     if (x < pPointer->limits.x1)
+ 	x = pPointer->limits.x1;
+@@ -633,9 +636,6 @@
+     if (y >= pPointer->limits.y2)
+ 	y = pPointer->limits.y2 - 1;
+ 
+-    if (pScreen->ConstrainCursorHarder)
+-       pScreen->ConstrainCursorHarder(pDev, pScreen, mode, &x, &y);
+-
+     if (pPointer->x != x || pPointer->y != y ||
+             pPointer->pScreen != pScreen)
+         miPointerMoveNoEvent(pDev, pScreen, x, y);
+Index: xorg-server/xfixes/cursor.c
+===================================================================
+--- xorg-server.orig/xfixes/cursor.c	2012-01-27 20:49:26.109712303 +1100
++++ xorg-server/xfixes/cursor.c	2012-01-27 20:54:59.037694528 +1100
+@@ -61,6 +61,7 @@
+ static RESTYPE		CursorHideCountType;
+ static RESTYPE		CursorWindowType;
+ RESTYPE			PointerBarrierType;
++static RESTYPE		PointerBarrierClientType;
+ static CursorPtr	CursorCurrent[MAXDEVICES];
+ 
+ static DevPrivateKeyRec CursorScreenPrivateKeyRec;
+@@ -129,6 +130,7 @@
+     ConstrainCursorHarderProcPtr ConstrainCursorHarder;
+     CursorHideCountPtr          pCursorHideCounts;
+     struct list                 barriers;
++    struct list                 barrierClients;
+ } CursorScreenRec, *CursorScreenPtr;
+ 
+ #define GetCursorScreen(s) ((CursorScreenPtr)dixLookupPrivate(&(s)->devPrivates, CursorScreenPrivateKey))
+@@ -1232,14 +1234,77 @@
+ }
+ 
+ static void
++SendBarrierEvent(CursorScreenPtr cs, struct PointerBarrier *barrier,
++		 int x, int y, int velocity, Bool threshold_exceeded)
++{
++    PointerBarrierEventClientPtr client;
++    list_for_each_entry(client, &cs->barrierClients, entry) {
++	xXFixesBarrierNotifyEvent	ev;
++	ev.type = XFixesEventBase + XFixesBarrierNotify;
++	ev.subtype = threshold_exceeded ? XFixesBarrierThresholdExceededNotify :
++					  XFixesBarrierHitNotify;
++	ev.event_id = barrier->barrierEventID;
++	ev.barrier = barrier->barrier;
++	ev.x = x;
++	ev.y = y;
++	ev.velocity = velocity;
++	ev.timestamp = currentTime.milliseconds;
++
++	if (client->client->swapped) {
++	    int n;
++
++	    swapl(&ev.event_id, n);
++	    swapl(&ev.barrier, n);
++	    swaps(&ev.x, n);
++	    swaps(&ev.y, n);
++	    swapl(&ev.velocity, n);
++	    swapl(&ev.timestamp, n);
++	}
++	
++	WriteEventsToClient (client->client, 1, (xEvent *) &ev);
++    }
++}
++
++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)
+ {
+     CursorScreenPtr cs = GetCursorScreen(screen);
+ 
+     if (!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);
+@@ -1252,11 +1317,27 @@
+ 	 * destination, again finding the nearest barrier and clamping.
+ 	 */
+ 	dir = barrier_get_direction(ox, oy, *x, *y);
++	barrier_calculate_velocity_components(ox, oy, *x, *y, &vel_x, &vel_y);
+ 
+ 	nearest = barrier_find_nearest(cs, dir, ox, oy, *x, *y);
+ 	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;
++	    }
++
++	    SendBarrierEvent(cs, nearest, *x, *y, velocity, threshold_exceeded);
++		
+ 	    if (barrier_is_vertical(nearest)) {
+ 		dir &= ~(BarrierNegativeX | BarrierPositiveX);
+ 		ox = *x;
+@@ -1267,9 +1348,29 @@
+ 
+ 	    nearest = barrier_find_nearest(cs, dir, ox, oy, *x, *y);
+ 	    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;
++		}
++
++		SendBarrierEvent(cs, nearest, *x, *y, velocity, threshold_exceeded);
+ 	    }
+ 	}
++
++	list_for_each_entry(c, &cs->barriers, entry) {
++	    c->barrier.lastHit = c->barrier.hit;
++	    c->barrier.hit = FALSE;
++	}
+     }
+ 
+     if (cs->ConstrainCursorHarder) {
+@@ -1288,11 +1389,41 @@
+ 
+     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);
++	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 = malloc(sizeof(*ret));
++
++    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))
+@@ -1365,6 +1496,69 @@
+     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)
++{
++    int n;
++    REQUEST(xXFixesCreatePointerBarrierVelocityReq);
++
++    swaps(&stuff->length, n);
++    REQUEST_SIZE_MATCH(xXFixesCreatePointerBarrierReq);
++    swapl(&stuff->barrier, n);
++    swapl(&stuff->window, n);
++    swaps(&stuff->x1, n);
++    swaps(&stuff->y1, n);
++    swaps(&stuff->x2, n);
++    swaps(&stuff->y2, n);
++    swapl(&stuff->directions, n);
++    swapl(&stuff->velocity, n);
++    return ProcXFixesVector[stuff->xfixesReqType](client);
++}
++
+ static int
+ CursorFreeBarrier(void *data, XID id)
+ {
+@@ -1421,6 +1615,118 @@
+     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 */
++    list_for_each_entry(c, &cs->barrierClients, entry) {
++	if (c == client) {
++	    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);      
++      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)
++{
++    int n;
++    REQUEST(xXFixesSelectBarrierInputReq);
++
++    swaps(&stuff->length, n);
++    REQUEST_SIZE_MATCH(xXFixesSelectBarrierInputReq);
++    swapl(&stuff->window, n);
++    swapl(&stuff->eventMask, n);
++    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)
++{
++    int n;
++    REQUEST(xXFixesBarrierReleasePointerReq);
++
++    swaps(&stuff->length, n);
++    REQUEST_SIZE_MATCH(xXFixesBarrierReleasePointerReq);
++    swapl(&stuff->barrier, n);
++    swapl(&stuff->event_id, n);
++    return ProcXFixesVector[stuff->xfixesReqType](client);
++}
++
+ Bool
+ XFixesCursorInit (void)
+ {
+@@ -1441,6 +1747,7 @@
+ 	if (!cs)
+ 	    return FALSE;
+ 	list_init(&cs->barriers);
++	list_init(&cs->barrierClients);
+ 	Wrap (cs, pScreen, CloseScreen, CursorCloseScreen);
+ 	Wrap (cs, pScreen, DisplayCursor, CursorDisplayCursor);
+ 	Wrap (cs, pScreen, ConstrainCursorHarder, CursorConstrainCursorHarder);
+@@ -1455,8 +1762,10 @@
+ 					     "XFixesCursorWindow");
+     PointerBarrierType = CreateNewResourceType(CursorFreeBarrier,
+ 					      "XFixesPointerBarrier");
++    PointerBarrierClientType = CreateNewResourceType(CursorFreeBarrierClient,
++						     "XFixesPointerBarrierClient");
+ 
+     return CursorClientType && CursorHideCountType && CursorWindowType &&
+-	   PointerBarrierType;
++	   PointerBarrierType && PointerBarrierClientType;
+ }
+ 
+Index: xorg-server/xfixes/xfixes.c
+===================================================================
+--- xorg-server.orig/xfixes/xfixes.c	2012-01-27 20:49:26.097712304 +1100
++++ xorg-server/xfixes/xfixes.c	2012-01-27 20:53:59.721697695 +1100
+@@ -100,6 +100,7 @@
+     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]))
+@@ -143,6 +144,10 @@
+ /*************** Version 5 ****************/
+     ProcXFixesCreatePointerBarrier,
+     ProcXFixesDestroyPointerBarrier,
++/*************** Version 6 ****************/
++    ProcXFixesCreatePointerBarrierVelocity,
++    ProcXFixesSelectBarrierInput,
++    ProcXFixesBarrierReleasePointer,
+ };
+ 
+ static int
+@@ -209,6 +214,10 @@
+ /*************** Version 5 ****************/
+     SProcXFixesCreatePointerBarrier,
+     SProcXFixesDestroyPointerBarrier,
++/*************** Version 6 ****************/
++    SProcXFixesCreatePointerBarrierVelocity,
++    SProcXFixesSelectBarrierInput,
++    SProcXFixesBarrierReleasePointer,
+ };
+ 
+ static int
+Index: xorg-server/xfixes/xfixes.h
+===================================================================
+--- xorg-server.orig/xfixes/xfixes.h	2012-01-27 20:49:26.133712302 +1100
++++ xorg-server/xfixes/xfixes.h	2012-01-27 20:53:59.721697695 +1100
+@@ -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,27 @@
+ extern _X_EXPORT RegionPtr
+ XFixesRegionCopy (RegionPtr pRegion);
+ 
++typedef struct PointerBarrierEventClient *PointerBarrierEventClientPtr;
++
++struct PointerBarrierEventClient {
++    ScreenPtr screen;
++    ClientPtr client;
++    CARD32    eventMask;
++    XID window;
++    XID resource;
++    struct list entry;
++};
++
++  
++
+ struct PointerBarrier {
++    XID    barrier;
+     CARD16 x1, x2, y1, y2;
+     CARD32 directions;
++    CARD32 velocity;
++    CARD32 barrierEventID;
++    CARD32 releaseEventID;
++    Bool   hit, lastHit;
+ };
+ 
+ 
+Index: xorg-server/xfixes/xfixesint.h
+===================================================================
+--- xorg-server.orig/xfixes/xfixesint.h	2012-01-27 20:49:26.121712303 +1100
++++ xorg-server/xfixes/xfixesint.h	2012-01-27 20:53:59.721697695 +1100
+@@ -59,6 +59,7 @@
+ #include "windowstr.h"
+ #include "selection.h"
+ #include "xfixes.h"
++#include "list.h"
+ 
+ extern int		XFixesEventBase;
+ 
+@@ -293,6 +294,26 @@
+ 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/debian/patches/series b/debian/patches/series
index c481ca5..16bb1be 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -32,3 +32,6 @@
 222_touch_valuators_absolute.patch
 223_indirect_touch_x_y_valuators.patch
 224_return_BadWindow_not_BadMatch.diff
+
+# Temporary, until it's reviewed & accepted upstream
+500_pointer_barrier_thresholds.diff


Reply to: