xserver: Branch 'mpx' - 3 commits

Peter Hutterer whot at kemper.freedesktop.org
Fri Apr 13 10:49:19 EEST 2007


 dix/events.c        |   77 +++++++++++++++++++++++++++++++++++-----------------
 dix/main.c          |    2 +
 dix/window.c        |   18 ++++++++++++
 include/window.h    |    2 +
 include/windowstr.h |    1 
 5 files changed, 75 insertions(+), 25 deletions(-)

New commits:
diff-tree ea27b09d3a973d9a4943f205b24940b8624cf405 (from 2bb3c81fc1ca98c909309f3af7e9c8ca6b695657)
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri Apr 13 17:15:22 2007 +0930

    Deliver FocusIn/FocusOut events for all devices.
    Don't use VCK in SetInputFocus and DeliverFocusedEvent.

diff --git a/dix/events.c b/dix/events.c
index 294aa2f..e515f10 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2787,9 +2787,9 @@ CheckDeviceGrabs(DeviceIntPtr device, xE
 void
 DeliverFocusedEvent(DeviceIntPtr keybd, xEvent *xE, WindowPtr window, int count)
 {
+    DeviceIntPtr pointer;
     WindowPtr focus = keybd->focus->win;
     int mskidx = 0;
-
     if (focus == FollowKeyboardWin)
 	focus = inputInfo.keyboard->focus->win;
     if (!focus)
@@ -2804,8 +2804,11 @@ DeliverFocusedEvent(DeviceIntPtr keybd, 
 	if (DeliverDeviceEvents(window, xE, NullGrab, focus, keybd, count))
 	    return;
     }
+    pointer = GetPairedPointer(keybd);
+    if (!pointer)
+        pointer = inputInfo.pointer;
     /* just deliver it to the focus window */
-    FixUpEventFromWindow(inputInfo.pointer, xE, focus, None, FALSE);
+    FixUpEventFromWindow(pointer, xE, focus, None, FALSE);
     if (xE->u.u.type & EXTENSION_EVENT_BASE)
 	mskidx = keybd->id;
     (void)DeliverEventsToWindow(keybd, focus, xE, count, filters[xE->u.u.type],
@@ -3632,13 +3635,8 @@ FocusEvent(DeviceIntPtr dev, int type, i
 {
     xEvent event;
 
-#ifdef XINPUT
     if (dev != inputInfo.keyboard)
-    {
 	DeviceFocusEvent(dev, type, mode, detail, pWin);
-	return;
-    }
-#endif
     event.u.focus.mode = mode;
     event.u.u.type = type;
     event.u.u.detail = detail;
@@ -3846,6 +3844,8 @@ SetInputFocus(
     WindowPtr focusWin;
     int mode, rc;
     TimeStamp time;
+    DeviceIntPtr keybd; /* used for FollowKeyboard or FollowKeyboardWin */
+
 
     UpdateCurrentTime();
     if ((revertTo != RevertToParent) &&
@@ -3857,10 +3857,22 @@ SetInputFocus(
 	return BadValue;
     }
     time = ClientTimeToServerTime(ctime);
+
+    if (IsKeyboardDevice(dev))
+        keybd = dev;
+    else
+    {
+        keybd = GetPairedKeyboard(dev);
+        if (!keybd) 
+            keybd = inputInfo.keyboard;
+    }
+
     if ((focusID == None) || (focusID == PointerRoot))
 	focusWin = (WindowPtr)(long)focusID;
     else if ((focusID == FollowKeyboard) && followOK)
-	focusWin = inputInfo.keyboard->focus->win;
+    {
+	focusWin = keybd->focus->win;
+    }
     else {
 	rc = dixLookupWindow(&focusWin, focusID, client, DixReadAccess);
 	if (rc != Success)
@@ -3876,7 +3888,7 @@ SetInputFocus(
 	return Success;
     mode = (dev->coreGrab.grab) ? NotifyWhileGrabbed : NotifyNormal;
     if (focus->win == FollowKeyboardWin)
-	DoFocusEvents(dev, inputInfo.keyboard->focus->win, focusWin, mode);
+	DoFocusEvents(dev, keybd->focus->win, focusWin, mode);
     else
 	DoFocusEvents(dev, focus->win, focusWin, mode);
     focus->time = time;
diff-tree 2bb3c81fc1ca98c909309f3af7e9c8ca6b695657 (from e7b47b1758ed20e75ee267b3a09e91bf2861f6fd)
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Thu Apr 12 16:35:43 2007 +0930

    Use paired kbd instead of VCK for EnterLeaveEvents, sanitize variable naming.

diff --git a/dix/events.c b/dix/events.c
index 444c103..294aa2f 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3436,7 +3436,7 @@ CommonAncestor(
 
 static void
 EnterLeaveEvent(
-    DeviceIntPtr pDev,
+    DeviceIntPtr mouse,
     int type,
     int mode,
     int detail,
@@ -3444,9 +3444,8 @@ EnterLeaveEvent(
     Window child)
 {
     xEvent              event;
-    DeviceIntPtr        keybd = inputInfo.keyboard;
     WindowPtr		focus;
-    DeviceIntPtr        mouse = pDev;
+    DeviceIntPtr        keybd;
     GrabPtr	        grab = mouse->coreGrab.grab;
     GrabPtr	        devgrab = mouse->deviceGrab.grab;
     Mask		mask;
@@ -3456,6 +3455,9 @@ EnterLeaveEvent(
     int                 mskidx;
     OtherInputMasks     *inputMasks;
 
+    if (!(keybd = GetPairedKeyboard(mouse)))
+        keybd = inputInfo.keyboard;
+
     if ((pWin == mouse->valuator->motionHintWindow) &&
 	(detail != NotifyInferior))
 	mouse->valuator->motionHintWindow = NullWindow;
@@ -3473,8 +3475,8 @@ EnterLeaveEvent(
     event.u.u.type = type;
     event.u.u.detail = detail;
     event.u.enterLeave.time = currentTime.milliseconds;
-    event.u.enterLeave.rootX = pDev->spriteInfo->sprite->hot.x;
-    event.u.enterLeave.rootY = pDev->spriteInfo->sprite->hot.y;
+    event.u.enterLeave.rootX = mouse->spriteInfo->sprite->hot.x;
+    event.u.enterLeave.rootY = mouse->spriteInfo->sprite->hot.y;
     /* Counts on the same initial structure of crossing & button events! */
     FixUpEventFromWindow(mouse, &event, pWin, None, FALSE);
     /* Enter/Leave events always set child */
@@ -3510,7 +3512,7 @@ EnterLeaveEvent(
                 (void)TryClientEvents(rClient(grab), &event, 1, mask,
                                       filters[type], grab);
             else
-                (void)DeliverEventsToWindow(pDev, pWin, &event, 1, filters[type],
+                (void)DeliverEventsToWindow(mouse, pWin, &event, 1, filters[type],
                                             NullGrab, 0);
         }
     }
@@ -3520,8 +3522,8 @@ EnterLeaveEvent(
         DeviceLeaveNotify;
     devEnterLeave->type = (type == EnterNotify) ? DeviceEnterNotify :
         DeviceLeaveNotify;
-    devEnterLeave->deviceid = pDev->id;
-    mskidx = pDev->id;
+    devEnterLeave->deviceid = mouse->id;
+    mskidx = mouse->id;
     inputMasks = wOtherInputMasks(pWin);
     if (inputMasks && 
        (filters[devEnterLeave->type] & inputMasks->deliverableEvents[mskidx]))
@@ -3530,9 +3532,9 @@ EnterLeaveEvent(
             (void)TryClientEvents(rClient(devgrab), (xEvent*)devEnterLeave, 1,
                                 mask, filters[devEnterLeave->type], devgrab);
 	else
-	    (void)DeliverEventsToWindow(pDev, pWin, (xEvent*)devEnterLeave, 
+	    (void)DeliverEventsToWindow(mouse, pWin, (xEvent*)devEnterLeave, 
                                         1, filters[devEnterLeave->type], 
-                                        NullGrab, pDev->id);
+                                        NullGrab, mouse->id);
     }
 
     if ((type == EnterNotify) && (mask & KeymapStateMask))
@@ -3550,7 +3552,7 @@ EnterLeaveEvent(
 	    (void)TryClientEvents(rClient(grab), (xEvent *)&ke, 1, mask,
 				  KeymapStateMask, grab);
 	else
-	    (void)DeliverEventsToWindow(pDev, pWin, (xEvent *)&ke, 1,
+	    (void)DeliverEventsToWindow(mouse, pWin, (xEvent *)&ke, 1,
 					KeymapStateMask, NullGrab, 0);
     }
 }
diff-tree e7b47b1758ed20e75ee267b3a09e91bf2861f6fd (from 547d720938b3668666d60110d79b150b1e9325c6)
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Thu Apr 12 16:24:42 2007 +0930

    Change core enter/leave semantics for multiple pointers.
    
    Send EnterNotify when first device enters the window, LeaveNotify when the
    last device leaves the window. Additional devices will not cause additional
    Enter/LeaveNotifies.

diff --git a/dix/events.c b/dix/events.c
index 46905aa..444c103 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2270,7 +2270,10 @@ DefineInitialRootWindow(WindowPtr win)
     while (pDev)
     {
         if (DevHasCursor(pDev))
+        {
             InitializeSprite(pDev, win);
+            win->devPrivates[EnterLeavePrivatesIndex].val++;
+        }
         pDev = pDev->next;
     }
 }
@@ -3447,6 +3450,7 @@ EnterLeaveEvent(
     GrabPtr	        grab = mouse->coreGrab.grab;
     GrabPtr	        devgrab = mouse->deviceGrab.grab;
     Mask		mask;
+    long*               inWindow; /* no of sprites inside pWin */
 
     deviceEnterNotify   *devEnterLeave;
     int                 mskidx;
@@ -3492,14 +3496,23 @@ EnterLeaveEvent(
              IsParent(focus, pWin)))
         event.u.enterLeave.flags |= ELFlagFocus;
 
+    inWindow = &pWin->devPrivates[EnterLeavePrivatesIndex].val;
+
+    (type == EnterNotify) ? (*inWindow)++ : (*inWindow)--;
+
     if (mask & filters[type])
     {
-	if (grab)
-	    (void)TryClientEvents(rClient(grab), &event, 1, mask,
-				  filters[type], grab);
-	else
-	    (void)DeliverEventsToWindow(pDev, pWin, &event, 1, filters[type],
-					NullGrab, 0);
+        /* only send core events for the first device to enter and the last
+           one to leave */
+        if ((*inWindow) == (LeaveNotify - type))
+        {
+            if (grab)
+                (void)TryClientEvents(rClient(grab), &event, 1, mask,
+                                      filters[type], grab);
+            else
+                (void)DeliverEventsToWindow(pDev, pWin, &event, 1, filters[type],
+                                            NullGrab, 0);
+        }
     }
 
     devEnterLeave = (deviceEnterNotify*)&event;
diff --git a/dix/main.c b/dix/main.c
index ac3bfad..f5b89ba 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -391,6 +391,8 @@ main(int argc, char *argv[], char *envp[
 		FatalError("failed to create scratch GCs");
 	    if (!CreateDefaultStipple(i))
 		FatalError("failed to create default stipple");
+            if (!InitWindowPrivates(pScreen))
+                FatalError("Failed to init window privates.");
 	    if (!CreateRootWindow(pScreen))
 		FatalError("failed to create root window");
 	}
diff --git a/dix/window.c b/dix/window.c
index 4e55319..5a03642 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -155,6 +155,8 @@ _X_EXPORT int screenIsSaved = SCREEN_SAV
 
 _X_EXPORT ScreenSaverStuffRec savedScreenInfo[MAXSCREENS];
 
+_X_EXPORT int EnterLeavePrivatesIndex = -1;
+
 #if 0
 extern void DeleteWindowFromAnyEvents();
 extern Mask EventMaskForClient();
@@ -3969,6 +3971,22 @@ WindowParentHasDeviceCursor(WindowPtr pW
     return FALSE;
 }
 
+/**
+ * Initialize some mandatory devPrivates for windows. 
+ *
+ * At the moment, this includes only the enter/leave semaphore.
+ *
+ * Returns TRUE on success.
+ */
+_X_EXPORT Bool
+InitWindowPrivates(ScreenPtr screen)
+{
+    if (EnterLeavePrivatesIndex == -1)
+        EnterLeavePrivatesIndex = AllocateWindowPrivateIndex();
+
+    return AllocateWindowPrivate(screen, EnterLeavePrivatesIndex, 0);
+}
+
 #ifndef NOLOGOHACK
 static void
 DrawLogo(WindowPtr pWin)
diff --git a/include/window.h b/include/window.h
index 87118e3..707272a 100644
--- a/include/window.h
+++ b/include/window.h
@@ -268,4 +268,6 @@ extern void DisableMapUnmapEvents(
 extern void EnableMapUnmapEvents(
     WindowPtr /* pWin */ );
 
+Bool InitWindowPrivates(
+    ScreenPtr /* screen */);
 #endif /* WINDOW_H */
diff --git a/include/windowstr.h b/include/windowstr.h
index 95954a7..4683abe 100644
--- a/include/windowstr.h
+++ b/include/windowstr.h
@@ -216,6 +216,7 @@ typedef struct _ScreenSaverStuff {
 
 extern int screenIsSaved;
 extern ScreenSaverStuffRec savedScreenInfo[MAXSCREENS];
+extern int EnterLeavePrivatesIndex;
 
 /*
  * this is the configuration parameter "NO_BACK_SAVE"



More information about the xorg-commit mailing list