xorg-server: Changes to 'ubuntu'
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.rogers@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 <raof@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
Reply to: