debian/changelog | 9 + debian/patches/500_pointer_barrier_thresholds.diff | 158 +++++++++++++-------- 2 files changed, 108 insertions(+), 59 deletions(-)
New commits: commit d50bf336e234786254514abe2d4815d2b86fa693 Author: Christopher James Halse Rogers <christopher.halse.rog...@canonical.com> Date: Wed Feb 22 14:01:21 2012 +1100 Fix screen-edge barrier event behaviour on nvidia 295.20 drivers diff --git a/debian/changelog b/debian/changelog index 5eb231c..1fbc21e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +xorg-server (2:1.11.4-0ubuntu4) precise; urgency=low + + * debian/patches/500_pointer_barrier_thresholds.diff: + - Make the velocity calculation more robust on screen edges. Fixes reveal + behaviour on nVidia 295.20 driver, which now clamps the pointer to the + visible screen area. (LP: #937792) + + -- Christopher James Halse Rogers <r...@ubuntu.com> Tue, 21 Feb 2012 17:04:41 +1100 + xorg-server (2:1.11.4-0ubuntu3) precise; urgency=low * Fix touch class memory corruption diff --git a/debian/patches/500_pointer_barrier_thresholds.diff b/debian/patches/500_pointer_barrier_thresholds.diff index b1e0859..ad8a180 100644 --- a/debian/patches/500_pointer_barrier_thresholds.diff +++ b/debian/patches/500_pointer_barrier_thresholds.diff @@ -1,7 +1,7 @@ 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 +--- xorg-server.orig/include/protocol-versions.h 2012-02-21 18:14:17.631996352 +1100 ++++ xorg-server/include/protocol-versions.h 2012-02-22 11:39:06.722090873 +1100 @@ -122,7 +122,7 @@ #define SERVER_XF86VIDMODE_MINOR_VERSION 2 @@ -11,34 +11,10 @@ Index: xorg-server/include/protocol-versions.h #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 +--- xorg-server.orig/xfixes/cursor.c 2012-02-21 18:14:17.647996351 +1100 ++++ xorg-server/xfixes/cursor.c 2012-02-22 11:39:06.722090873 +1100 @@ -61,6 +61,7 @@ static RESTYPE CursorHideCountType; static RESTYPE CursorWindowType; @@ -47,7 +23,19 @@ Index: xorg-server/xfixes/cursor.c static CursorPtr CursorCurrent[MAXDEVICES]; static DevPrivateKeyRec CursorScreenPrivateKeyRec; -@@ -129,6 +130,7 @@ +@@ -119,6 +120,11 @@ + struct list entry; + }; + ++/** ++ * Pick up unclamped (x,y) coordinates from dix/getevents ++ */ ++extern int unclamped_prex, unclamped_prey; ++ + /* + * Wrap DisplayCursor to catch cursor change events + */ +@@ -129,6 +135,7 @@ ConstrainCursorHarderProcPtr ConstrainCursorHarder; CursorHideCountPtr pCursorHideCounts; struct list barriers; @@ -55,7 +43,7 @@ Index: xorg-server/xfixes/cursor.c } CursorScreenRec, *CursorScreenPtr; #define GetCursorScreen(s) ((CursorScreenPtr)dixLookupPrivate(&(s)->devPrivates, CursorScreenPrivateKey)) -@@ -1232,14 +1234,77 @@ +@@ -1232,18 +1239,90 @@ } static void @@ -133,13 +121,29 @@ Index: xorg-server/xfixes/cursor.c /* where are we coming from */ miPointerGetPosition(dev, &ox, &oy); -@@ -1252,11 +1317,27 @@ + ++ /* 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. +@@ -1251,12 +1330,28 @@ + * 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); -+ barrier_calculate_velocity_components(ox, oy, *x, *y, &vel_x, &vel_y); +- 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, *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; @@ -150,21 +154,24 @@ Index: xorg-server/xfixes/cursor.c + /* 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 @@ +@@ -1265,11 +1360,31 @@ + oy = *y; + } - nearest = barrier_find_nearest(cs, dir, ox, oy, *x, *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; @@ -193,16 +200,16 @@ Index: xorg-server/xfixes/cursor.c } if (cs->ConstrainCursorHarder) { -@@ -1288,11 +1389,41 @@ +@@ -1288,11 +1403,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.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)) @@ -225,17 +232,17 @@ Index: xorg-server/xfixes/cursor.c + 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.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 @@ +@@ -1365,6 +1510,69 @@ return ProcXFixesVector[stuff->xfixesReqType](client); } @@ -305,7 +312,7 @@ Index: xorg-server/xfixes/cursor.c static int CursorFreeBarrier(void *data, XID id) { -@@ -1421,6 +1615,118 @@ +@@ -1421,6 +1629,118 @@ return ProcXFixesVector[stuff->xfixesReqType](client); } @@ -424,7 +431,7 @@ Index: xorg-server/xfixes/cursor.c Bool XFixesCursorInit (void) { -@@ -1441,6 +1747,7 @@ +@@ -1441,6 +1761,7 @@ if (!cs) return FALSE; list_init(&cs->barriers); @@ -432,7 +439,7 @@ Index: xorg-server/xfixes/cursor.c Wrap (cs, pScreen, CloseScreen, CursorCloseScreen); Wrap (cs, pScreen, DisplayCursor, CursorDisplayCursor); Wrap (cs, pScreen, ConstrainCursorHarder, CursorConstrainCursorHarder); -@@ -1455,8 +1762,10 @@ +@@ -1455,8 +1776,10 @@ "XFixesCursorWindow"); PointerBarrierType = CreateNewResourceType(CursorFreeBarrier, "XFixesPointerBarrier"); @@ -446,8 +453,8 @@ Index: xorg-server/xfixes/cursor.c 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 +--- xorg-server.orig/xfixes/xfixes.c 2012-02-21 18:14:17.655996351 +1100 ++++ xorg-server/xfixes/xfixes.c 2012-02-22 11:39:06.726090873 +1100 @@ -100,6 +100,7 @@ X_XFixesExpandRegion, /* Version 3 */ X_XFixesShowCursor, /* Version 4 */ @@ -480,8 +487,8 @@ Index: xorg-server/xfixes/xfixes.c 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 +--- xorg-server.orig/xfixes/xfixes.h 2012-02-21 18:14:17.671996350 +1100 ++++ xorg-server/xfixes/xfixes.h 2012-02-22 11:39:06.726090873 +1100 @@ -28,6 +28,7 @@ #define _XFIXES_H_ @@ -520,8 +527,8 @@ Index: xorg-server/xfixes/xfixes.h 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 +--- xorg-server.orig/xfixes/xfixesint.h 2012-02-21 18:14:17.683996349 +1100 ++++ xorg-server/xfixes/xfixesint.h 2012-02-22 11:39:06.726090873 +1100 @@ -59,6 +59,7 @@ #include "windowstr.h" #include "selection.h" @@ -557,3 +564,36 @@ Index: xorg-server/xfixes/xfixesint.h /* Xinerama */ extern int (*PanoramiXSaveXFixesVector[XFixesNumberRequests])(ClientPtr); void PanoramiXFixesInit (void); +Index: xorg-server/dix/getevents.c +=================================================================== +--- xorg-server.orig/dix/getevents.c 2012-02-21 18:14:17.703996348 +1100 ++++ xorg-server/dix/getevents.c 2012-02-22 12:09:46.441992647 +1100 +@@ -79,6 +79,12 @@ + 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 +@@ -903,7 +909,15 @@ + /* 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 -- 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/e1s02iq-0007kq...@vasks.debian.org