xserver: Branch 'master' - 7 commits

Peter Hutterer whot at kemper.freedesktop.org
Sun Aug 2 19:45:17 PDT 2009


 dix/devices.c       |    2 ++
 dix/enterleave.c    |   10 +++++-----
 dix/enterleave.h    |    4 ++--
 hw/xnest/Events.c   |   10 +++++-----
 hw/xnest/Keyboard.c |    2 +-
 xfixes/cursor.c     |   38 ++++++++++++++++++++++++++------------
 6 files changed, 41 insertions(+), 25 deletions(-)

New commits:
commit 1e69fd4a60147287b31e53bfc61543fb17bb82c8
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Aug 3 12:03:26 2009 +1000

    xnest: fix up parameters to InitKeyboardDeviceStruct.
    
    IKDS takes a DeviceIntPtr as first argument, and an RMVLO struct as second.
    The keysyms stuff is long gone now.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xnest/Keyboard.c b/hw/xnest/Keyboard.c
index f94e260..191bec7 100644
--- a/hw/xnest/Keyboard.c
+++ b/hw/xnest/Keyboard.c
@@ -191,7 +191,7 @@ XkbError:
           (char *)values.auto_repeats,
           sizeof(values.auto_repeats));
 
-  InitKeyboardDeviceStruct(&pDev->public, &keySyms,
+  InitKeyboardDeviceStruct(pDev, NULL,
                            xnestBell, xnestChangeKeyboardControl);
   xfree(keymap);
   return Success;
commit 008658049cbeea35a9f76f98037aa2f4173f3573
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Aug 3 12:00:45 2009 +1000

    xnest: silence compiler warnings by typecasing properly.
    
    Events.c: In function ‘xnestQueueKeyEvent’:
    Events.c:112: warning: passing argument 2 of ‘mieqEnqueue’ from incompatible
    pointer type
    ../../mi/mi.h:203: note: expected ‘union InternalEvent *’ but argument is of
    type ‘struct xEvent *’
    Events.c: In function ‘xnestCollectEvents’:
    Events.c:141: warning: passing argument 2 of ‘mieqEnqueue’ from incompatible
    pointer type
    ../../mi/mi.h:203: note: expected ‘union InternalEvent *’ but argument is of
    type ‘struct xEvent *’
    Events.c:150: warning: passing argument 2 of ‘mieqEnqueue’ from incompatible
    pointer type
    ../../mi/mi.h:203: note: expected ‘union InternalEvent *’ but argument is of
    type ‘struct xEvent *’
    Events.c:160: warning: passing argument 2 of ‘mieqEnqueue’ from incompatible
    pointer type
    ../../mi/mi.h:203: note: expected ‘union InternalEvent *’ but argument is of
    type ‘struct xEvent *’
    Events.c:193: warning: passing argument 2 of ‘mieqEnqueue’ from incompatible
    pointer type
    ../../mi/mi.h:203: note: expected ‘union InternalEvent *’ but argument is of
    type ‘struct xEvent *’
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xnest/Events.c b/hw/xnest/Events.c
index c2c09aa..277718b 100644
--- a/hw/xnest/Events.c
+++ b/hw/xnest/Events.c
@@ -109,7 +109,7 @@ xnestQueueKeyEvent(int type, unsigned int keycode)
   lastEventTime = GetTimeInMillis();
   n = GetKeyboardEvents(xnestEvents, xnestKeyboardDevice, type, keycode);
   for (i = 0; i < n; i++)
-    mieqEnqueue(xnestKeyboardDevice, (xnestEvents + i)->event);
+    mieqEnqueue(xnestKeyboardDevice, (InternalEvent*)(xnestEvents + i)->event);
 }
 
 void
@@ -138,7 +138,7 @@ xnestCollectEvents(void)
       n = GetPointerEvents(xnestEvents, xnestPointerDevice, ButtonPress,
                            X.xbutton.button, POINTER_RELATIVE, 0, 0, NULL);
       for (i = 0; i < n; i++)
-        mieqEnqueue(xnestPointerDevice, (xnestEvents + i)->event);
+        mieqEnqueue(xnestPointerDevice, (InternalEvent*)(xnestEvents + i)->event);
       break;
       
     case ButtonRelease:
@@ -147,7 +147,7 @@ xnestCollectEvents(void)
       n = GetPointerEvents(xnestEvents, xnestPointerDevice, ButtonRelease,
                            X.xbutton.button, POINTER_RELATIVE, 0, 0, NULL);
       for (i = 0; i < n; i++)
-        mieqEnqueue(xnestPointerDevice, (xnestEvents + i)->event);
+        mieqEnqueue(xnestPointerDevice, (InternalEvent*)(xnestEvents + i)->event);
       break;
       
     case MotionNotify:
@@ -157,7 +157,7 @@ xnestCollectEvents(void)
       n = GetPointerEvents(xnestEvents, xnestPointerDevice, MotionNotify,
                            0, POINTER_ABSOLUTE, 0, 2, valuators);
       for (i = 0; i < n; i++)
-        mieqEnqueue(xnestPointerDevice, (xnestEvents + i)->event);
+        mieqEnqueue(xnestPointerDevice, (InternalEvent*)(xnestEvents + i)->event);
       break;
       
     case FocusIn:
@@ -190,7 +190,7 @@ xnestCollectEvents(void)
           n = GetPointerEvents(xnestEvents, xnestPointerDevice, MotionNotify,
                                0, POINTER_ABSOLUTE, 0, 2, valuators);
           for (i = 0; i < n; i++)
-            mieqEnqueue(xnestPointerDevice, (xnestEvents + i)->event);
+            mieqEnqueue(xnestPointerDevice, (InternalEvent*)(xnestEvents + i)->event);
 	  xnestDirectInstallColormaps(pScreen);
 	}
       }
commit 664ac92d8bbe956dd6fd80fac5dc3161028803b2
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jul 31 14:38:35 2009 +1000

    xfixes: backup the DisplayCursor/CloseScreen proc before restoring it (#23034)
    
    The screen's DisplayCursor func is wrapped as
    AnimCurDisplayCursor -> CursorDisplayCursor -> miPointerDisplayCursor.
    
    Calling CursorDisplayCursor while an animated cursor was currently displayed
    would remove AnimCurDisplayCursor from the wrap stack. Thus, the next call
    to ChangeToCursor wouldn't update the animated cursor state. The block
    handler for animated cursors would then continuously overwrite the actual
    cursor, leaving an animated cursor everywhere on the screen.
    
    X.Org Bug 23034 <http://bugs.freedesktop.org/show_bug.cgi?id=23034>

diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index 45891bb..acc703a 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -131,7 +131,7 @@ typedef struct _CursorScreen {
 #define GetCursorScreenIfSet(s) GetCursorScreen(s)
 #define SetCursorScreen(s,p) dixSetPrivate(&(s)->devPrivates, CursorScreenPrivateKey, p)
 #define Wrap(as,s,elt,func)	(((as)->elt = (s)->elt), (s)->elt = func)
-#define Unwrap(as,s,elt)	((s)->elt = (as)->elt)
+#define Unwrap(as,s,elt,backup)	(((backup) = (s)->elt), (s)->elt = (as)->elt)
 
 /* The cursor doesn't show up until the first XDefineCursor() */
 static Bool CursorVisible = FALSE;
@@ -145,8 +145,9 @@ CursorDisplayCursor (DeviceIntPtr pDev,
 {
     CursorScreenPtr	cs = GetCursorScreen(pScreen);
     Bool		ret;
+    DisplayCursorProcPtr backupProc;
 
-    Unwrap (cs, pScreen, DisplayCursor);
+    Unwrap (cs, pScreen, DisplayCursor, backupProc);
 
     /*
      * Have to check ConnectionInfo to distinguish client requests from
@@ -184,7 +185,8 @@ CursorDisplayCursor (DeviceIntPtr pDev,
 	    }
 	}
     }
-    Wrap (cs, pScreen, DisplayCursor, CursorDisplayCursor);
+    Wrap (cs, pScreen, DisplayCursor, backupProc);
+
     return ret;
 }
 
@@ -193,9 +195,11 @@ CursorCloseScreen (int index, ScreenPtr pScreen)
 {
     CursorScreenPtr	cs = GetCursorScreen (pScreen);
     Bool		ret;
+    CloseScreenProcPtr	close_proc;
+    DisplayCursorProcPtr display_proc;
 
-    Unwrap (cs, pScreen, CloseScreen);
-    Unwrap (cs, pScreen, DisplayCursor);
+    Unwrap (cs, pScreen, CloseScreen, close_proc);
+    Unwrap (cs, pScreen, DisplayCursor, display_proc);
     deleteCursorHideCountsForScreen(pScreen);
     ret = (*pScreen->CloseScreen) (index, pScreen);
     xfree (cs);
commit f48dfcc1b772a09428e328c72124ea0d46a73416
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jul 31 10:44:28 2009 +1000

    xfixes: allocate CurrentCursor for all devices.
    
    XFixes requires cursor notifies to clients when the cursor changes. This
    should work on the ClientPointer and then on all master pointers. Hence
    change CurrentCursor to a MAXDEVICES array.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index d91dbff..45891bb 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -63,7 +63,7 @@
 static RESTYPE		CursorClientType;
 static RESTYPE		CursorHideCountType;
 static RESTYPE		CursorWindowType;
-static CursorPtr	CursorCurrent;
+static CursorPtr	CursorCurrent[MAXDEVICES];
 static CursorPtr        pInvisibleCursor = NULL;
 
 static int CursorScreenPrivateKeyIndex;
@@ -162,11 +162,11 @@ CursorDisplayCursor (DeviceIntPtr pDev,
 	ret = (*pScreen->DisplayCursor) (pDev, pScreen, pCursor);
     }
 
-    if (pCursor != CursorCurrent)
+    if (pCursor != CursorCurrent[pDev->id])
     {
 	CursorEventPtr	e;
 
-	CursorCurrent = pCursor;
+	CursorCurrent[pDev->id] = pCursor;
 	for (e = cursorEvents; e; e = e->next)
 	{
 	    if ((e->eventMask & XFixesDisplayCursorNotifyMask) &&
@@ -380,7 +380,7 @@ ProcXFixesGetCursorImage (ClientPtr client)
     int				npixels, width, height, rc, x, y;
 
     REQUEST_SIZE_MATCH(xXFixesGetCursorImageReq);
-    pCursor = CursorCurrent;
+    pCursor = CursorCurrent[PickPointer(client)->id];
     if (!pCursor)
 	return BadCursor;
     rc = XaceHook(XACE_RESOURCE_ACCESS, client, pCursor->id, RT_CURSOR,
@@ -532,7 +532,7 @@ ProcXFixesGetCursorImageAndName (ClientPtr client)
     int				rc, x, y;
 
     REQUEST_SIZE_MATCH(xXFixesGetCursorImageAndNameReq);
-    pCursor = CursorCurrent;
+    pCursor = CursorCurrent[PickPointer(client)->id];
     if (!pCursor)
 	return BadCursor;
     rc = XaceHook(XACE_RESOURCE_ACCESS, client, pCursor->id, RT_CURSOR,
@@ -916,7 +916,7 @@ ProcXFixesHideCursor (ClientPtr client)
 	for (dev = inputInfo.devices; dev; dev = dev->next)
 	{
 	    if (IsMaster(dev) && IsPointerDevice(dev))
-		CursorDisplayCursor(dev, pWin->drawable.pScreen, CursorCurrent);
+		CursorDisplayCursor(dev, pWin->drawable.pScreen, CursorCurrent[dev->id]);
 	}
     }
 
@@ -1015,7 +1015,7 @@ CursorFreeHideCount (pointer data, XID id)
     for (dev = inputInfo.devices; dev; dev = dev->next)
     {
         if (IsMaster(dev) && IsPointerDevice(dev))
-            CursorDisplayCursor(dev, pScreen, CursorCurrent);
+            CursorDisplayCursor(dev, pScreen, CursorCurrent[dev->id]);
     }
 
     return 1;
commit d3e5629fac224d53a972df5e2a87db02534f9b17
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jul 30 16:36:56 2009 +1000

    dix: call SetFocusOut and LeaveWindow when disabling a device.
    
    PointerWindows[x] would be set after removing a master pointer. Destroying
    this window then crashed the server.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/devices.c b/dix/devices.c
index 32fd445..53b7e2c 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -448,6 +448,8 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
     }
     OsReleaseSignals();
 
+    LeaveWindow(dev);
+    SetFocusOut(dev);
 
     *prev = dev->next;
     dev->next = inputInfo.off_devices;
diff --git a/dix/enterleave.c b/dix/enterleave.c
index 29b9349..c08cc31 100644
--- a/dix/enterleave.c
+++ b/dix/enterleave.c
@@ -166,7 +166,7 @@ EnterWindow(DeviceIntPtr dev, WindowPtr win, int mode)
 /**
  * Unset the presence flag for dev to mark that it is not in 'win' anymore.
  */
-static void
+void
 LeaveWindow(DeviceIntPtr dev)
 {
     PointerWindows[dev->id] = NULL;
diff --git a/dix/enterleave.h b/dix/enterleave.h
index 4da4e02..471f4ef 100644
--- a/dix/enterleave.h
+++ b/dix/enterleave.h
@@ -76,6 +76,7 @@ extern void EnterWindow(DeviceIntPtr dev,
                         WindowPtr win,
                         int mode);
 
+extern void LeaveWindow(DeviceIntPtr dev);
 
 extern void CoreFocusEvent(DeviceIntPtr kbd,
                            int type,
commit 97ed946cfccec5979c47b5fabf1ad56cc7d33ef4
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jul 30 16:36:30 2009 +1000

    dix: SetFocusOut and LeaveWindow don't need parameters other than dev.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/enterleave.c b/dix/enterleave.c
index 09b9f55..29b9349 100644
--- a/dix/enterleave.c
+++ b/dix/enterleave.c
@@ -167,7 +167,7 @@ EnterWindow(DeviceIntPtr dev, WindowPtr win, int mode)
  * Unset the presence flag for dev to mark that it is not in 'win' anymore.
  */
 static void
-LeaveWindow(DeviceIntPtr dev, WindowPtr win, int mode)
+LeaveWindow(DeviceIntPtr dev)
 {
     PointerWindows[dev->id] = NULL;
 }
@@ -185,7 +185,7 @@ SetFocusIn(DeviceIntPtr dev, WindowPtr win)
  * Unset the presence flag for dev to mark that it is not in 'win' anymore.
  */
 void
-SetFocusOut(DeviceIntPtr dev, WindowPtr win)
+SetFocusOut(DeviceIntPtr dev)
 {
     FocusWindows[dev->id] = NULL;
 }
@@ -550,7 +550,7 @@ CoreEnterLeaveEvents(DeviceIntPtr dev,
     if (!IsMaster(dev))
         return;
 
-    LeaveWindow(dev, from, mode);
+    LeaveWindow(dev);
 
     if (IsParent(from, to))
         CoreEnterLeaveToDescendant(dev, from, to, mode);
@@ -1223,7 +1223,7 @@ CoreFocusEvents(DeviceIntPtr dev,
     if (!IsMaster(dev))
         return;
 
-    SetFocusOut(dev, from);
+    SetFocusOut(dev);
 
     if (((to == NullWindow) || (to == PointerRootWin)) &&
         ((from == NullWindow) || (from == PointerRootWin)))
diff --git a/dix/enterleave.h b/dix/enterleave.h
index 746c5d4..4da4e02 100644
--- a/dix/enterleave.h
+++ b/dix/enterleave.h
@@ -92,6 +92,5 @@ extern void DeviceFocusEvent(DeviceIntPtr kbd,
 extern void SetFocusIn(DeviceIntPtr kbd,
                        WindowPtr win);
 
-extern void SetFocusOut(DeviceIntPtr dev,
-                        WindowPtr win);
+extern void SetFocusOut(DeviceIntPtr dev);
 #endif /* _ENTERLEAVE_H_ */
commit d040940efe041b57e6323921c380ceb2bb43f41e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jul 30 16:16:51 2009 +1000

    xfixes: FixesHideCursor should work on all master pointers.
    
    Presumably, a client calling HideCursor doesn't want any cursor displayed.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index 698e4d5..d91dbff 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -912,7 +912,12 @@ ProcXFixesHideCursor (ClientPtr client)
     ret = createCursorHideCount(client, pWin->drawable.pScreen);
 
     if (ret == Success) {
-        CursorDisplayCursor(PickPointer(client), pWin->drawable.pScreen, CursorCurrent);
+	DeviceIntPtr dev;
+	for (dev = inputInfo.devices; dev; dev = dev->next)
+	{
+	    if (IsMaster(dev) && IsPointerDevice(dev))
+		CursorDisplayCursor(dev, pWin->drawable.pScreen, CursorCurrent);
+	}
     }
 
     return ret;
@@ -1004,9 +1009,14 @@ CursorFreeHideCount (pointer data, XID id)
 {
     CursorHideCountPtr pChc = (CursorHideCountPtr) data;
     ScreenPtr pScreen = pChc->pScreen;
+    DeviceIntPtr dev;
 
     deleteCursorHideCount(pChc, pChc->pScreen);
-    CursorDisplayCursor(inputInfo.pointer, pScreen, CursorCurrent);
+    for (dev = inputInfo.devices; dev; dev = dev->next)
+    {
+        if (IsMaster(dev) && IsPointerDevice(dev))
+            CursorDisplayCursor(dev, pScreen, CursorCurrent);
+    }
 
     return 1;
 }


More information about the xorg-commit mailing list