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.rog...@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 <r...@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.rog...@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 <r...@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 -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/e1rqjux-0003vm...@vasks.debian.org