xserver: Branch 'mpx' - 4 commits

Peter Hutterer whot at kemper.freedesktop.org
Sat Jun 30 16:49:09 PDT 2007


 Xext/geext.c  |   18 ++++++++----------
 Xext/geext.h  |   27 ++++++++++++++++++++++++++-
 Xi/exevents.c |    2 ++
 Xi/extinit.c  |   12 +++++++++++-
 dix/events.c  |   15 +++++++++++++++
 dix/grabs.c   |    1 +
 mi/mieq.c     |    8 +++-----
 7 files changed, 66 insertions(+), 17 deletions(-)

New commits:
diff-tree c1a16bdcfe7aa907fe78f27dc606a8e5a2699952 (from 08779c62ba2f4cbfa47e3cf738daf8abd74b60cf)
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed Jun 27 18:08:03 2007 +0930

    Add 'evfill' field to GEExtensions.
    We need this to allow extensions to fill in extra data for an event before it
    is sent to the client. This is probably to be used like
    FillUpEventsFromWindow().

diff --git a/Xext/geext.c b/Xext/geext.c
index f0801cb..0add5e1 100644
--- a/Xext/geext.c
+++ b/Xext/geext.c
@@ -41,15 +41,8 @@ int GEErrorBase;
 int GEClientPrivateIndex;
 int GEEventType; /* The opcode for all GenericEvents will have. */
 
-/* Struct to keep information about registered extensions
- */
-typedef struct _GEExtension {
-    /* event swap function */
-    void (*evswap)(xGenericEvent* from, xGenericEvent* to);
-} GEExtension, *GEExtensionPtr;
 
-/* All registered extensions */
-static GEExtension GEExtensions[MAXEXTENSIONS];
+GEExtension GEExtensions[MAXEXTENSIONS];
 
 /* Major available requests */
 static const int version_requests[] = {
@@ -249,11 +242,15 @@ GEExtensionInit(void)
 /* Register an extension with GE. The given swap function will be called each
  * time an event is sent to a client with different byte order.
  * @param extension The extensions major opcode 
- * @param ev_swap the event swap function.  
+ * @param ev_swap The event swap function.  
+ * @param ev_fill Called for an event before delivery. The extension now has
+ * the chance to fill in necessary fields for the event.
  */
 void GERegisterExtension(
         int extension, 
-        void (*ev_swap)(xGenericEvent* from, xGenericEvent* to)
+        void (*ev_swap)(xGenericEvent* from, xGenericEvent* to),
+        void (*ev_fill)(xGenericEvent* ev, DeviceIntPtr pDev, 
+                        WindowPtr pWin, GrabPtr pGrab)
         )
 {
     if ((extension & 0x7F) >=  MAXEXTENSIONS)
@@ -261,6 +258,7 @@ void GERegisterExtension(
 
     /* extension opcodes are > 128, might as well save some space here */
     GEExtensions[extension & 0x7f].evswap = ev_swap;
+    GEExtensions[extension & 0x7f].evfill = ev_fill;
 }
 
 
diff --git a/Xext/geext.h b/Xext/geext.h
index 7a73e81..bac4726 100644
--- a/Xext/geext.h
+++ b/Xext/geext.h
@@ -34,6 +34,23 @@ from the author.
 #define _GEEXT_H_
 #include <X11/extensions/geproto.h>
 
+/* Struct to keep information about registered extensions
+ *
+ * evswap ... use to swap event fields for different byte ordered clients.
+ * evfill ... use to fill various event fields from the given parameters.
+ */
+typedef struct _GEExtension {
+    void (*evswap)(xGenericEvent* from, xGenericEvent* to);
+    void (*evfill)(xGenericEvent* ev, 
+                    DeviceIntPtr pDev,  /* device */
+                    WindowPtr pWin,     /* event window */
+                    GrabPtr pGrab       /* current grab, may be NULL */
+                    );
+} GEExtension, *GEExtensionPtr;
+
+/* All registered extensions and their handling functions. */
+extern GEExtension GEExtensions[MAXEXTENSIONS];
+
 /* Returns the extension offset from the event */
 #define GEEXT(ev) (((xGenericEvent*)(ev))->extension)
 
@@ -50,11 +67,19 @@ from the author.
 #define GECLIENT(pWin) \
     (((pWin)->optional) ? (pWin)->optional->geMasks->geClients : NULL)
 
+/* Returns the event_fill for the given event */
+#define GEEventFill(ev) \
+    GEExtensions[GEEXTIDX(xE)].evfill
+
 /* Interface for other extensions */
 void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask);
 void GERegisterExtension(
         int extension,
-        void (*ev_dispatch)(xGenericEvent* from, xGenericEvent* to));
+        void (*ev_dispatch)(xGenericEvent* from, xGenericEvent* to),
+        void (*ev_fill)(xGenericEvent* ev, DeviceIntPtr pDev, 
+                        WindowPtr pWin, GrabPtr pGrab)
+        );
+
 void GEInitEvent(xGenericEvent* ev, int extension);
 
 
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 99518e1..70253fe 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -1151,6 +1151,16 @@ XIGEEventSwap(xGenericEvent* from, xGene
     }
 }
 
+/**
+ * EventFill to fill various fields for events before they are delivered to
+ * the client.
+ */
+static void 
+XIGEEventFill(xGenericEvent* ev, DeviceIntPtr pDev, 
+              WindowPtr pWin, GrabPtr grab)
+{
+}
+
 /**********************************************************************
  *
  * IExtensionInit - initialize the input extension.
@@ -1195,7 +1205,7 @@ XInputExtensionInit(void)
 	EventSwapVector[DeviceLeaveNotify] = SEventIDispatch;
 
         /* init GE events */
-        GERegisterExtension(IReqCode, XIGEEventSwap);
+        GERegisterExtension(IReqCode, XIGEEventSwap, XIGEEventFill);
         SetGenericFilter(IReqCode, xi_filters);
     } else {
 	FatalError("IExtensionInit: AddExtensions failed\n");
diff --git a/dix/events.c b/dix/events.c
index 77d6275..d4af307 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2129,6 +2129,9 @@ FixUpEventFromWindow(
 {
     SpritePtr pSprite = pDev->spriteInfo->sprite;
 
+    if (xE->u.u.type == GenericEvent) /* just a safety barrier */
+        return;
+
     if (calcChild)
     {
         WindowPtr w= pSprite->spriteTrace[pSprite->spriteTraceGood-1];
@@ -2245,6 +2248,8 @@ DeliverDeviceEvents(WindowPtr pWin, xEve
             {
                 if (GEMaskIsSet(pWin, GEEXT(xE), filter))
                 {
+                    if (GEExtensions[GEEXTIDX(xE)].evfill)
+                        GEExtensions[GEEXTIDX(xE)].evfill(ge, dev, pWin, grab);
                     deliveries = DeliverEventsToWindow(dev, pWin, xE, count, 
                                                         filter, grab, 0);
                     if (deliveries > 0)
@@ -3270,6 +3275,8 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIn
                 if (!gemask)
                     return;
 
+                if (GEEventFill(xE))
+                    GEEventFill(xE)(ge, thisDev, grab->window, grab);
                 deliveries = TryClientEvents(rClient(grab), xE, count, 
                         gemask->mask,
                         generic_filters[GEEXTIDX(ge)][ge->evtype],
diff-tree 08779c62ba2f4cbfa47e3cf738daf8abd74b60cf (from 49136d3e9fe2d065090ee90c18a49f65fb027c9f)
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed Jun 27 11:16:55 2007 +0930

    Reset grab->next to NULL when we're creating a grab.
    
    This is definitely necessary in CheckDeviceGrabAndHintWindow (thanks to Paulo
    Zanoni for spotting it). We're resetting it everywhere else too, just to be
    save.

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 719e9db..c13b747 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1170,6 +1170,7 @@ CheckDeviceGrabAndHintWindow(WindowPtr p
 	tempGrab.confineTo = NullWindow;
 	tempGrab.cursor = NullCursor;
         tempGrab.genericMasks = NULL;
+        tempGrab.next = NULL;
 	(*dev->deviceGrab.ActivateGrab) (dev, &tempGrab, currentTime, TRUE);
     }
 }
diff --git a/dix/events.c b/dix/events.c
index 51bd2d8..77d6275 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2001,6 +2001,7 @@ DeliverEventsToWindow(DeviceIntPtr pDev,
 	GrabRec tempGrab;
         OtherInputMasks *inputMasks;
 
+        tempGrab.next = NULL;
 	tempGrab.device = pDev;
 	tempGrab.resource = client->clientAsMask;
 	tempGrab.window = pWin;
@@ -3023,6 +3024,7 @@ CheckPassiveGrabsOnWindow(
     tempGrab.detail.exact = xE->u.u.detail;
     tempGrab.detail.pMask = NULL;
     tempGrab.modifiersDetail.pMask = NULL;
+    tempGrab.next = NULL;
     for (; grab; grab = grab->next)
     {
 #ifdef XKB
@@ -4652,6 +4654,7 @@ ProcGrabPointer(ClientPtr client)
 		ConfineCursorToWindow(device, RootWindow(device), FALSE, FALSE);
 	    oldCursor = grab->cursor;
 	}
+        tempGrab.next = NULL;
 	tempGrab.cursor = cursor;
 	tempGrab.resource = client->clientAsMask;
 	tempGrab.ownerEvents = stuff->ownerEvents;
@@ -4820,6 +4823,7 @@ GrabDevice(ClientPtr client, DeviceIntPt
         /* Otherwise segfaults happen on grabbed MPX devices */
         memset(&tempGrab, 0, sizeof(GrabRec));
 
+        tempGrab.next = NULL;
 	tempGrab.window = pWin;
 	tempGrab.resource = client->clientAsMask;
 	tempGrab.ownerEvents = ownerEvents;
@@ -5192,6 +5196,7 @@ ProcUngrabKey(ClientPtr client)
     tempGrab.type = KeyPress;
     tempGrab.detail.exact = stuff->key;
     tempGrab.detail.pMask = NULL;
+    tempGrab.next = NULL;
 
     if (!DeletePassiveGrabFromList(&tempGrab))
 	return(BadAlloc);
@@ -5370,6 +5375,7 @@ ProcUngrabButton(ClientPtr client)
     tempGrab.type = ButtonPress;
     tempGrab.detail.exact = stuff->button;
     tempGrab.detail.pMask = NULL;
+    tempGrab.next = NULL;
 
     if (!DeletePassiveGrabFromList(&tempGrab))
 	return(BadAlloc);
@@ -5897,6 +5903,7 @@ ExtGrabDevice(ClientPtr client, 
     newGrab.confineTo      = confineTo;
     newGrab.eventMask      = xi_mask;
     newGrab.genericMasks   = NULL;
+    newGrab.next           = NULL;
 
     if (ge_masks)
     {
diff --git a/dix/grabs.c b/dix/grabs.c
index e1dd6c5..af471eb 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -106,6 +106,7 @@ CreateGrab(
     grab->confineTo = confineTo;
     grab->cursor = cursor;
     grab->genericMasks = NULL;
+    grab->next = NULL;
     if (cursor)
 	cursor->refcnt++;
     return grab;
diff-tree 49136d3e9fe2d065090ee90c18a49f65fb027c9f (from 8396bf7c8b4eb6b8f2d1e1ef19887064c69591da)
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Tue Jun 26 19:43:54 2007 +0930

    mieqEnqueue: use modulo for queue tail wrapping.
    
    This was previously committed by Michael Daenzer, but was lost during a pull.

diff --git a/mi/mieq.c b/mi/mieq.c
index ff20003..4b29950 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -119,7 +119,7 @@ mieqInit(void)
 void
 mieqEnqueue(DeviceIntPtr pDev, xEvent *e)
 {
-    HWEventQueueType       oldtail = miEventQueue.tail, newtail;
+    unsigned int           oldtail = miEventQueue.tail, newtail;
     EventListPtr           evt;
     int                    isMotion = 0;
     int                    evlen;
@@ -138,7 +138,7 @@ mieqEnqueue(DeviceIntPtr pDev, xEvent *e
         EventPtr               laste;
         deviceKeyButtonPointer *lastkbp;
 
-        laste = &miEventQueue.events[(oldtail ? oldtail : QUEUE_SIZE) - 1];
+        laste = &miEventQueue.events[(oldtail - 1) % QUEUE_SIZE];
         lastkbp = (deviceKeyButtonPointer *) laste->events->event;
 
         if (laste->nevents > 6) {
@@ -161,9 +161,7 @@ mieqEnqueue(DeviceIntPtr pDev, xEvent *e
 
     if (isMotion && isMotion == miEventQueue.lastMotion &&
         oldtail != miEventQueue.head) {
-	if (oldtail == 0)
-	    oldtail = QUEUE_SIZE;
-	oldtail = oldtail - 1;
+	oldtail = (oldtail - 1) % QUEUE_SIZE;
     }
     else {
     	newtail = (oldtail + 1) % QUEUE_SIZE;
diff-tree 8396bf7c8b4eb6b8f2d1e1ef19887064c69591da (from c4e850a781e3b85631cb386d24efcca2a835d4c9)
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Tue Jun 26 12:58:37 2007 +0930

    Init genericMasks to 0, make sure list is NULL terminated.

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 622e8cc..719e9db 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1169,6 +1169,7 @@ CheckDeviceGrabAndHintWindow(WindowPtr p
 	tempGrab.pointerMode = GrabModeAsync;
 	tempGrab.confineTo = NullWindow;
 	tempGrab.cursor = NullCursor;
+        tempGrab.genericMasks = NULL;
 	(*dev->deviceGrab.ActivateGrab) (dev, &tempGrab, currentTime, TRUE);
     }
 }
diff --git a/dix/events.c b/dix/events.c
index 58d9ed4..51bd2d8 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5912,6 +5912,7 @@ ExtGrabDevice(ClientPtr client, 
             last->next = xcalloc(1, sizeof(GenericMaskRec));
             last = last->next;
             *last = *ge_masks;
+            last->next = NULL;
             ge_masks = ge_masks->next;
         }
     }


More information about the xorg-commit mailing list