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

xorg-server: Changes to 'ubuntu'



 debian/changelog                                |    6 
 debian/patches/219_fedora-pointer-barriers.diff |  462 +++++++++++++++++++++---
 2 files changed, 421 insertions(+), 47 deletions(-)

New commits:
commit 97c21a6e3d0fd965cba3ccaf7236f27dd9208448
Author: Timo Aaltonen <tjaalton@ubuntu.com>
Date:   Mon Jun 27 20:19:40 2011 +0300

    Update the cursor confinement patch with one that should work.

diff --git a/debian/changelog b/debian/changelog
index 0bb5c19..f16deb1 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+xorg-server (2:1.10.2-1ubuntu2) UNRELEASED; urgency=low
+
+  * Update the cursor confinement patch with one that should work.
+
+ -- Timo Aaltonen <tjaalton@ubuntu.com>  Mon, 27 Jun 2011 19:21:03 +0300
+
 xorg-server (2:1.10.2-1ubuntu1) oneiric; urgency=low
 
   [ Timo Aaltonen ]
diff --git a/debian/patches/219_fedora-pointer-barriers.diff b/debian/patches/219_fedora-pointer-barriers.diff
index 57e4718..0995654 100644
--- a/debian/patches/219_fedora-pointer-barriers.diff
+++ b/debian/patches/219_fedora-pointer-barriers.diff
@@ -1,21 +1,105 @@
-From ad2c48ab05d9415aa384eda6be52576525a3abcf Mon Sep 17 00:00:00 2001
+From 14f1112bec18ccece8e732fe6c200a56546230c7 Mon Sep 17 00:00:00 2001
 From: Adam Jackson <ajax@redhat.com>
 Date: Thu, 17 Mar 2011 13:56:17 -0400
 Subject: [PATCH] CRTC confine and pointer barriers
 
 ---
+ dix/events.c                |    7 +
+ dix/getevents.c             |   12 +-
+ include/dix.h               |    1 +
  include/protocol-versions.h |    2 +-
+ mi/mipointer.c              |   16 ++-
+ mi/mipointer.h              |    6 +
+ randr/randr.c               |    2 +
+ randr/randrstr.h            |    4 +
+ randr/rrcrtc.c              |  155 ++++++++++++++++
+ test/Makefile.am            |    4 +-
  xfixes/cursor.c             |  408 ++++++++++++++++++++++++++++++++++++++++++-
  xfixes/xfixes.c             |   24 ++-
  xfixes/xfixes.h             |   17 ++
  xfixes/xfixesint.h          |   16 ++
- 6 files changed, 458 insertions(+), 12 deletions(-)
+ 14 files changed, 658 insertions(+), 16 deletions(-)
 
+diff --git a/dix/events.c b/dix/events.c
+index 07f8b05..d2be84f 100644
+--- a/dix/events.c
++++ b/dix/events.c
+@@ -328,6 +328,13 @@ IsMaster(DeviceIntPtr dev)
+     return dev->type == MASTER_POINTER || dev->type == MASTER_KEYBOARD;
+ }
+ 
++Bool
++IsFloating(DeviceIntPtr dev)
++{
++    return GetMaster(dev, MASTER_KEYBOARD) == NULL;
++}
++
++
+ /**
+  * Max event opcode.
+  */
+diff --git a/dix/getevents.c b/dix/getevents.c
+index 794df42..c66e516 100644
+--- a/dix/getevents.c
++++ b/dix/getevents.c
+@@ -812,7 +812,11 @@ accelPointer(DeviceIntPtr dev, int first, int num, int *valuators, CARD32 ms)
+  * miPointerSetPosition() and then scale back into device coordinates (if
+  * needed). miPSP will change x/y if the screen was crossed.
+  *
++ * The coordinates provided are always absolute. The parameter mode whether
++ * it was relative or absolute movement that landed us at those coordinates.
++ *
+  * @param dev The device to be moved.
++ * @param mode Movement mode (Absolute or Relative)
+  * @param x Pointer to current x-axis value, may be modified.
+  * @param y Pointer to current y-axis value, may be modified.
+  * @param x_frac Fractional part of current x-axis value, may be modified.
+@@ -824,7 +828,8 @@ accelPointer(DeviceIntPtr dev, int first, int num, int *valuators, CARD32 ms)
+  * @param screeny_frac Fractional part of screen y coordinate, as above.
+  */
+ static void
+-positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
++positionSprite(DeviceIntPtr dev, int mode,
++               int *x, int *y, float x_frac, float y_frac,
+                ScreenPtr scr, int *screenx, int *screeny, float *screenx_frac, float *screeny_frac)
+ {
+     int old_screenx, old_screeny;
+@@ -863,7 +868,7 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
+     old_screeny = *screeny;
+     /* This takes care of crossing screens for us, as well as clipping
+      * to the current screen. */
+-    miPointerSetPosition(dev, screenx, screeny);
++    _miPointerSetPosition(dev, mode, screenx, screeny);
+ 
+     if (dev->u.master) {
+         dev->u.master->last.valuators[0] = *screenx;
+@@ -1193,7 +1198,8 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
+ 
+     set_raw_valuators(raw, &mask, raw->valuators.data);
+ 
+-    positionSprite(pDev, &x, &y, x_frac, y_frac, scr, &cx, &cy, &cx_frac, &cy_frac);
++    positionSprite(pDev, (flags & POINTER_ABSOLUTE) ? Absolute : Relative,
++                   &x, &y, x_frac, y_frac, scr, &cx, &cy, &cx_frac, &cy_frac);
+     updateHistory(pDev, &mask, ms);
+ 
+     /* Update the valuators with the true value sent to the client*/
+diff --git a/include/dix.h b/include/dix.h
+index 12e4b59..3f99098 100644
+--- a/include/dix.h
++++ b/include/dix.h
+@@ -570,6 +570,7 @@ extern Bool _X_EXPORT IsPointerDevice( DeviceIntPtr dev);
+ extern Bool _X_EXPORT IsKeyboardDevice(DeviceIntPtr dev);
+ extern Bool IsPointerEvent(InternalEvent *event);
+ extern _X_EXPORT Bool IsMaster(DeviceIntPtr dev);
++extern _X_EXPORT Bool IsFloating(DeviceIntPtr dev);
+ 
+ extern _X_HIDDEN void CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master);
+ extern _X_HIDDEN int CorePointerProc(DeviceIntPtr dev, int what);
 diff --git a/include/protocol-versions.h b/include/protocol-versions.h
-index 8692ded..7b7a9f5 100644
+index 1d33bdd..1dc66ad 100644
 --- a/include/protocol-versions.h
 +++ b/include/protocol-versions.h
-@@ -122,7 +122,7 @@
+@@ -126,7 +126,7 @@
  #define SERVER_XF86VIDMODE_MINOR_VERSION	2
  
  /* Fixes */
@@ -24,6 +108,331 @@ index 8692ded..7b7a9f5 100644
  #define SERVER_XFIXES_MINOR_VERSION		0
  
  /* X Input */
+diff --git a/mi/mipointer.c b/mi/mipointer.c
+index 554397a..85f1949 100644
+--- a/mi/mipointer.c
++++ b/mi/mipointer.c
+@@ -229,6 +229,10 @@ miPointerSetCursorPosition(DeviceIntPtr pDev, ScreenPtr pScreen,
+     SetupScreen (pScreen);
+ 
+     GenerateEvent = generateEvent;
++
++    if (pScreen->ConstrainCursorHarder)
++	pScreen->ConstrainCursorHarder(pDev, pScreen, Absolute, &x, &y);
++
+     /* device dependent - must pend signal and call miPointerWarpCursor */
+     (*pScreenPriv->screenFuncs->WarpCursor) (pDev, pScreen, x, y);
+     if (!generateEvent)
+@@ -484,7 +488,7 @@ miPointerMoveNoEvent (DeviceIntPtr pDev, ScreenPtr pScreen,
+ }
+ 
+ void
+-miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y)
++_miPointerSetPosition(DeviceIntPtr pDev, int mode, int *x, int *y)
+ {
+     miPointerScreenPtr	pScreenPriv;
+     ScreenPtr		pScreen;
+@@ -529,6 +533,9 @@ miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y)
+     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) 
+         return;
+@@ -536,6 +543,13 @@ miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y)
+     miPointerMoveNoEvent(pDev, pScreen, *x, *y);
+ }
+ 
++/* ABI hack */
++void
++miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y)
++{
++    _miPointerSetPosition(pDev, Absolute, x, y);
++}
++
+ void
+ miPointerGetPosition(DeviceIntPtr pDev, int *x, int *y)
+ {
+diff --git a/mi/mipointer.h b/mi/mipointer.h
+index 3c86110..6b6010c 100644
+--- a/mi/mipointer.h
++++ b/mi/mipointer.h
+@@ -131,6 +131,12 @@ extern _X_EXPORT void miPointerGetPosition(
+ 
+ /* Moves the cursor to the specified position.  May clip the co-ordinates:
+  * x and y are modified in-place. */
++extern _X_EXPORT void _miPointerSetPosition(
++    DeviceIntPtr pDev,
++    int mode,
++    int *x,
++    int *y);
++
+ extern _X_EXPORT void miPointerSetPosition(
+     DeviceIntPtr pDev,
+     int *x,
+diff --git a/randr/randr.c b/randr/randr.c
+index 6077705..d337129 100644
+--- a/randr/randr.c
++++ b/randr/randr.c
+@@ -270,6 +270,8 @@ Bool RRScreenInit(ScreenPtr pScreen)
+     
+     wrap (pScrPriv, pScreen, CloseScreen, RRCloseScreen);
+ 
++    pScreen->ConstrainCursorHarder = RRConstrainCursorHarder;
++
+     pScrPriv->numOutputs = 0;
+     pScrPriv->outputs = NULL;
+     pScrPriv->numCrtcs = 0;
+diff --git a/randr/randrstr.h b/randr/randrstr.h
+index 7ea6080..d8dd37d 100644
+--- a/randr/randrstr.h
++++ b/randr/randrstr.h
+@@ -297,6 +297,7 @@ typedef struct _rrScrPriv {
+     int			    rate;
+     int			    size;
+ #endif
++    Bool                   discontiguous;
+ } rrScrPrivRec, *rrScrPrivPtr;
+ 
+ extern _X_EXPORT DevPrivateKeyRec rrPrivKeyRec;
+@@ -700,6 +701,9 @@ ProcRRGetPanning (ClientPtr client);
+ int
+ ProcRRSetPanning (ClientPtr client);
+ 
++void
++RRConstrainCursorHarder (DeviceIntPtr, ScreenPtr, int, int *, int *);
++
+ /* rrdispatch.c */
+ extern _X_EXPORT Bool
+ RRClientKnowsRates (ClientPtr	pClient);
+diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
+index 98206a2..d4d8f2a 100644
+--- a/randr/rrcrtc.c
++++ b/randr/rrcrtc.c
+@@ -1,5 +1,6 @@
+ /*
+  * Copyright © 2006 Keith Packard
++ * Copyright 2010 Red Hat, Inc
+  *
+  * Permission to use, copy, modify, distribute, and sell this software and its
+  * documentation for any purpose is hereby granted without fee, provided that
+@@ -22,6 +23,7 @@
+ 
+ #include "randrstr.h"
+ #include "swaprep.h"
++#include "mipointer.h"
+ 
+ RESTYPE	RRCrtcType;
+ 
+@@ -292,6 +294,92 @@ RRCrtcPendingProperties (RRCrtcPtr crtc)
+     return FALSE;
+ }
+ 
++static void
++crtc_bounds(RRCrtcPtr crtc, int *left, int *right, int *top, int *bottom)
++{
++    *left = crtc->x;
++    *top = crtc->y;
++
++    switch (crtc->rotation) {
++    case RR_Rotate_0:
++    case RR_Rotate_180:
++    default:
++       *right = crtc->x + crtc->mode->mode.width;
++       *bottom = crtc->y + crtc->mode->mode.height;
++       return;
++    case RR_Rotate_90:
++    case RR_Rotate_270:
++       *right = crtc->x + crtc->mode->mode.height;
++       *bottom = crtc->y + crtc->mode->mode.width;
++       return;
++    }
++}
++
++/* overlapping counts as adjacent */
++static Bool
++crtcs_adjacent(const RRCrtcPtr a, const RRCrtcPtr b)
++{
++    /* left, right, top, bottom... */
++    int al, ar, at, ab;
++    int bl, br, bt, bb;
++    int cl, cr, ct, cb; /* the overlap, if any */
++
++    crtc_bounds(a, &al, &ar, &at, &ab);
++    crtc_bounds(b, &bl, &br, &bt, &bb);
++
++    cl = max(al, bl);
++    cr = min(ar, br);
++    ct = max(at, bt);
++    cb = min(ab, bb);
++
++    return (cl <= cr) && (ct <= cb);
++}
++
++/* Depth-first search and mark all CRTCs reachable from cur */
++static void
++mark_crtcs (rrScrPrivPtr pScrPriv, int *reachable, int cur)
++{
++    int i;
++    reachable[cur] = TRUE;
++    for (i = 0; i < pScrPriv->numCrtcs; ++i) {
++        if (reachable[i] || !pScrPriv->crtcs[i]->mode)
++            continue;
++        if (crtcs_adjacent(pScrPriv->crtcs[cur], pScrPriv->crtcs[i]))
++            mark_crtcs(pScrPriv, reachable, i);
++    }
++}
++
++static void
++RRComputeContiguity (ScreenPtr pScreen)
++{
++    rrScrPriv(pScreen);
++    Bool discontiguous = TRUE;
++    int i, n = pScrPriv->numCrtcs;
++
++    int *reachable = calloc(n, sizeof(int));
++    if (!reachable)
++        goto out;
++
++    /* Find first enabled CRTC and start search for reachable CRTCs from it */
++    for (i = 0; i < n; ++i) {
++        if (pScrPriv->crtcs[i]->mode) {
++            mark_crtcs(pScrPriv, reachable, i);
++            break;
++        }
++    }
++
++    /* Check that all enabled CRTCs were marked as reachable */
++    for (i = 0; i < n; ++i)
++        if (pScrPriv->crtcs[i]->mode && !reachable[i])
++            goto out;
++
++    discontiguous = FALSE;
++
++out:
++    free(reachable);
++    pScrPriv->discontiguous = discontiguous;
++}
++
+ /*
+  * Request that the Crtc be reconfigured
+  */
+@@ -306,6 +394,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
+ {
+     ScreenPtr	pScreen = crtc->pScreen;
+     Bool	ret = FALSE;
++    Bool	recompute = TRUE;
+     rrScrPriv(pScreen);
+ 
+     /* See if nothing changed */
+@@ -318,6 +407,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
+ 	!RRCrtcPendingProperties (crtc) &&
+ 	!RRCrtcPendingTransform (crtc))
+     {
++	recompute = FALSE;
+ 	ret = TRUE;
+     }
+     else
+@@ -381,6 +471,10 @@ RRCrtcSet (RRCrtcPtr    crtc,
+ 		RRPostPendingProperties (outputs[o]);
+ 	}
+     }
++
++    if (recompute)
++       RRComputeContiguity(pScreen);
++
+     return ret;
+ }
+ 
+@@ -1349,3 +1443,64 @@ ProcRRGetCrtcTransform (ClientPtr client)
+     free(reply);
+     return Success;
+ }
++
++void
++RRConstrainCursorHarder(DeviceIntPtr pDev, ScreenPtr pScreen, int mode, int *x, int *y)
++{
++    rrScrPriv (pScreen);
++    int i;
++
++    /* intentional dead space -> let it float */
++    if (pScrPriv->discontiguous)
++       return;
++
++    /* if we're moving inside a crtc, we're fine */
++    for (i = 0; i < pScrPriv->numCrtcs; i++) {
++       RRCrtcPtr crtc = pScrPriv->crtcs[i];
++
++       int left, right, top, bottom;
++
++       if (!crtc->mode)
++           continue;
++
++       crtc_bounds(crtc, &left, &right, &top, &bottom);
++
++       if ((*x >= left) && (*x <= right) && (*y >= top) && (*y <= bottom))
++           return;
++    }
++
++    /* if we're trying to escape, clamp to the CRTC we're coming from */
++    for (i = 0; i < pScrPriv->numCrtcs; i++) {
++       RRCrtcPtr crtc = pScrPriv->crtcs[i];
++       int nx, ny;
++       int left, right, top, bottom;
++
++       if (!crtc->mode)
++           continue;
++
++       crtc_bounds(crtc, &left, &right, &top, &bottom);
++       miPointerGetPosition(pDev, &nx, &ny);
++
++       if ((nx >= left) && (nx <= right) && (ny >= top) && (ny <= bottom)) {
++           if ((*x <= left) || (*x >= right)) {
++               int dx = *x - nx;
++
++               if (dx > 0)
++                   *x = right;
++               else if (dx < 0)
++                   *x = left;
++           }
++
++           if ((*y <= top) || (*y >= bottom)) {
++               int dy = *y - ny;
++
++               if (dy > 0)
++                   *y = bottom;
++               else if (dy < 0)
++                   *y = top;
++           }
++
++           return;
++       }
++    }
++}
+diff --git a/test/Makefile.am b/test/Makefile.am
+index 456221e..ccdb859 100644
+--- a/test/Makefile.am
++++ b/test/Makefile.am
+@@ -1,6 +1,6 @@
+ if UNITTESTS
+ SUBDIRS= . xi2
+-check_PROGRAMS = xkb input xtest
++check_PROGRAMS = xkb input xtest list fixes
+ check_LTLIBRARIES = libxservertest.la
+ 
+ TESTS=$(check_PROGRAMS)
+@@ -16,6 +16,8 @@ endif
+ xkb_LDADD=$(TEST_LDADD)
+ input_LDADD=$(TEST_LDADD)
+ xtest_LDADD=$(TEST_LDADD)
++list_LDADD=$(TEST_LDADD)
++fixes_LDADD=$(TEST_LDADD)
+ 
+ libxservertest_la_LIBADD = \
+             $(XSERVER_LIBS) \
 diff --git a/xfixes/cursor.c b/xfixes/cursor.c
 index fb608f6..5c55c95 100644
 --- a/xfixes/cursor.c
@@ -505,7 +914,7 @@ index fb608f6..5c55c95 100644
  }
  
 diff --git a/xfixes/xfixes.c b/xfixes/xfixes.c
-index e8c7bf1..de0e4db 100644
+index e8c7bf1..a57884b 100644
 --- a/xfixes/xfixes.c
 +++ b/xfixes/xfixes.c
 @@ -1,5 +1,6 @@
@@ -641,46 +1050,5 @@ index d005369..6ba276e 100644
  void PanoramiXFixesInit (void);
  void PanoramiXFixesReset (void);
 -- 
-1.7.4.4
-
-commit 703baece7ebd128a6742d0523d5b3ebe65126fa5
-Author: Peter Hutterer <peter.hutterer@who-t.net>
-Date:   Fri Feb 11 12:19:26 2011 +1000
+1.7.4
 
-    dix: Add IsFloating(device) wrapper.
-    
-    Simplifies check for floating devices.
-    
-    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-    Reviewed-by: Benjamin Tissoires <tissoire@cena.fr>
-
-diff --git a/dix/events.c b/dix/events.c
-index 4826781..f6d92cf 100644
---- a/dix/events.c
-+++ b/dix/events.c
-@@ -328,6 +328,13 @@ IsMaster(DeviceIntPtr dev)
-     return dev->type == MASTER_POINTER || dev->type == MASTER_KEYBOARD;
- }
- 
-+Bool
-+IsFloating(DeviceIntPtr dev)
-+{
-+    return GetMaster(dev, MASTER_KEYBOARD) == NULL;
-+}
-+
-+
- /**
-  * Max event opcode.
-  */
-diff --git a/include/dix.h b/include/dix.h
-index 12e4b59..3f99098 100644
---- a/include/dix.h
-+++ b/include/dix.h
-@@ -570,6 +570,7 @@ extern Bool _X_EXPORT IsPointerDevice( DeviceIntPtr dev);
- extern Bool _X_EXPORT IsKeyboardDevice(DeviceIntPtr dev);
- extern Bool IsPointerEvent(InternalEvent *event);
- extern _X_EXPORT Bool IsMaster(DeviceIntPtr dev);
-+extern _X_EXPORT Bool IsFloating(DeviceIntPtr dev);
- 
- extern _X_HIDDEN void CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master);
- extern _X_HIDDEN int CorePointerProc(DeviceIntPtr dev, int what);


Reply to: