From: Chris Dekter <[email protected]>

RECORD was disabled during the switch to internal events. This patch
modifies the record callback to work with internal events instead of
xEvents. The InternalEvents are converted to core/Xi events as needed.

Since record is a loadable extension, the EventTo* calls must be externed.

Signed-off-by: Peter Hutterer <[email protected]>
---

This is Chris' latest patch, cleaned up and reshuffled a bit.
I _think_ this is it now. cnee seems to report sane data and the code is
saner than the last patch sent to the list.
The only issue I have with this is that we've changed the definition of the
DeviceEventInfoRec. I'm not sure if that qualifies as ABI since no-one
except RECORD uses it, but in theory there could be other extensions that
relied on the old behaviour.
Though I doubt that, considering for the whole 1.7 cycle the callback wasn't
actually invoked, so we might have heard from them by now...


 Xi/exevents.c          |   13 +++--
 dix/events.c           |   15 +++---
 include/dix.h          |    6 +-
 include/eventconvert.h |    6 +-
 record/record.c        |  123 +++++++++++++++++++++++++++---------------------
 5 files changed, 91 insertions(+), 72 deletions(-)

diff --git a/Xi/exevents.c b/Xi/exevents.c
index cb2452b..6057c0e 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1031,16 +1031,19 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr 
device)
             break;
     }
 
-#if 0
-    /* FIXME: I'm broken. Please fix me. Thanks */
     if (DeviceEventCallback) {
        DeviceEventInfoRec eventinfo;
+       SpritePtr pSprite = device->spriteInfo->sprite;
 
-       eventinfo.events = (xEventPtr) xE;
-       eventinfo.count = count;
+       /* see comment in EnqueueEvents regarding the next three lines */
+       if (ev->any.type == ET_Motion)
+           ev->device_event.root = 
WindowTable[pSprite->hotPhys.pScreen->myNum]->drawable.id;
+
+       eventinfo.device = device;
+       eventinfo.event = ev;
        CallCallbacks(&DeviceEventCallback, (pointer) & eventinfo);
     }
-#endif
+
     grab = device->deviceGrab.grab;
 
     switch(event->type)
diff --git a/dix/events.c b/dix/events.c
index 85c8f9a..c085a75 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -1131,11 +1131,10 @@ EnqueueEvent(InternalEvent *ev, DeviceIntPtr device)
         event->type == ET_KeyRelease)
        AccessXCancelRepeatKey(device->key->xkbInfo, event->detail.key);
 
-#if 0
-        /* FIXME: I'm broken now. Please fix me. */
     if (DeviceEventCallback)
     {
        DeviceEventInfoRec eventinfo;
+
        /*  The RECORD spec says that the root window field of motion events
         *  must be valid.  At this point, it hasn't been filled in yet, so
         *  we do it here.  The long expression below is necessary to get
@@ -1145,14 +1144,14 @@ EnqueueEvent(InternalEvent *ev, DeviceIntPtr device)
         *  the data that GetCurrentRootWindow relies on hasn't been
         *  updated yet.
         */
-       if (xE->u.u.type == DeviceMotionNotify)
-           XE_KBPTR.root =
-               WindowTable[pSprite->hotPhys.pScreen->myNum]->drawable.id;
-       eventinfo.events = xE;
-       eventinfo.count = nevents;
+       if (ev->any.type == ET_Motion)
+           ev->device_event.root = 
WindowTable[pSprite->hotPhys.pScreen->myNum]->drawable.id;
+
+       eventinfo.event = ev;
+       eventinfo.device = device;
        CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo);
     }
-#endif
+
     if (event->type == ET_Motion)
     {
 #ifdef PANORAMIX
diff --git a/include/dix.h b/include/dix.h
index ed3acb6..6505fd0 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -576,8 +576,8 @@ typedef struct {
 extern _X_EXPORT CallbackListPtr DeviceEventCallback;
 
 typedef struct {
-    xEventPtr events;
-    int count;
+    InternalEvent *event;
+    DeviceIntPtr device;
 } DeviceEventInfoRec;
 
 extern int XItoCoreType(int xi_type);
@@ -585,7 +585,7 @@ extern Bool DevHasCursor(DeviceIntPtr pDev);
 extern Bool _X_EXPORT IsPointerDevice( DeviceIntPtr dev);
 extern Bool _X_EXPORT IsKeyboardDevice(DeviceIntPtr dev);
 extern Bool IsPointerEvent(InternalEvent *event);
-extern Bool IsMaster(DeviceIntPtr dev);
+extern _X_EXPORT Bool IsMaster(DeviceIntPtr dev);
 
 extern _X_HIDDEN void CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master);
 extern _X_HIDDEN int CorePointerProc(DeviceIntPtr dev, int what);
diff --git a/include/eventconvert.h b/include/eventconvert.h
index 277a6c4..b1196a0 100644
--- a/include/eventconvert.h
+++ b/include/eventconvert.h
@@ -30,9 +30,9 @@
 
 #define FP1616(integral, frac) ((integral) * (1 << 16) + (frac) * (1 << 16))
 
-_X_INTERNAL int EventToCore(InternalEvent *event, xEvent *core);
-_X_INTERNAL int EventToXI(InternalEvent *ev, xEvent **xi, int *count);
-_X_INTERNAL int EventToXI2(InternalEvent *ev, xEvent **xi);
+_X_EXPORT int EventToCore(InternalEvent *event, xEvent *core);
+_X_EXPORT int EventToXI(InternalEvent *ev, xEvent **xi, int *count);
+_X_EXPORT int EventToXI2(InternalEvent *ev, xEvent **xi);
 _X_INTERNAL int GetCoreType(InternalEvent* ev);
 _X_INTERNAL int GetXIType(InternalEvent* ev);
 _X_INTERNAL int GetXI2Type(InternalEvent* ev);
diff --git a/record/record.c b/record/record.c
index 242544f..1a10c9e 100644
--- a/record/record.c
+++ b/record/record.c
@@ -42,6 +42,8 @@ and Jim Haggerty of Metheus.
 #include "set.h"
 #include "swaprep.h"
 #include "inputstr.h"
+#include "eventconvert.h"
+
 
 #include <stdio.h>
 #include <assert.h>
@@ -139,7 +141,8 @@ static int RecordDeleteContext(
     XID /*id*/
 );
 
-
+void RecordExtensionInit(void);
+
 /***************************************************************************/
 
 /* client private stuff */
@@ -727,6 +730,59 @@ RecordADeliveredEventOrError(CallbackListPtr *pcbl, 
pointer nulldata, pointer ca
 } /* RecordADeliveredEventOrError */
 
 
+static void
+RecordSendProtocolEvents(RecordClientsAndProtocolPtr pRCAP,
+                       RecordContextPtr pContext,
+                       xEvent* pev, int count)
+{
+    int ev; /* event index */
+
+    for (ev = 0; ev < count; ev++, pev++)
+    {
+       if (RecordIsMemberOfSet(pRCAP->pDeviceEventSet,
+                   pev->u.u.type & 0177))
+       {
+           xEvent swappedEvent;
+           xEvent *pEvToRecord = pev;
+#ifdef PANORAMIX
+           xEvent shiftedEvent;
+
+           if (!noPanoramiXExtension &&
+                   (pev->u.u.type == MotionNotify ||
+                    pev->u.u.type == ButtonPress ||
+                    pev->u.u.type == ButtonRelease ||
+                    pev->u.u.type == KeyPress ||
+                    pev->u.u.type == KeyRelease)) {
+               int scr = XineramaGetCursorScreen(inputInfo.pointer);
+               memcpy(&shiftedEvent, pev, sizeof(xEvent));
+               shiftedEvent.u.keyButtonPointer.rootX +=
+                   panoramiXdataPtr[scr].x -
+                   panoramiXdataPtr[0].x;
+               shiftedEvent.u.keyButtonPointer.rootY +=
+                   panoramiXdataPtr[scr].y -
+                   panoramiXdataPtr[0].y;
+               pEvToRecord = &shiftedEvent;
+           }
+#endif /* PANORAMIX */
+
+           if (pContext->pRecordingClient->swapped)
+           {
+               (*EventSwapVector[pEvToRecord->u.u.type & 0177])
+                   (pEvToRecord, &swappedEvent);
+               pEvToRecord = &swappedEvent;
+           }
+
+           RecordAProtocolElement(pContext, NULL,
+                   XRecordFromServer,  pEvToRecord, SIZEOF(xEvent), 0);
+           /* make sure device events get flushed in the absence
+            * of other client activity
+            */
+           SetCriticalOutputPending();
+       }
+    } /* end for each event */
+
+} /* RecordADeviceEvent */
+
 /* RecordADeviceEvent
  *
  * Arguments:
@@ -756,55 +812,24 @@ RecordADeviceEvent(CallbackListPtr *pcbl, pointer 
nulldata, pointer calldata)
        {
            if (pRCAP->pDeviceEventSet)
            {
-               int ev; /* event index */
-               xEvent *pev = pei->events;
-               for (ev = 0; ev < pei->count; ev++, pev++)
-               {
-                   if (RecordIsMemberOfSet(pRCAP->pDeviceEventSet,
-                                           pev->u.u.type & 0177))
-                   {
-                       xEvent swappedEvent;
-                       xEvent *pEvToRecord = pev;
-#ifdef PANORAMIX
-                       xEvent shiftedEvent;
-
-                       if (!noPanoramiXExtension &&
-                           (pev->u.u.type == MotionNotify ||
-                            pev->u.u.type == ButtonPress ||
-                            pev->u.u.type == ButtonRelease ||
-                            pev->u.u.type == KeyPress ||
-                            pev->u.u.type == KeyRelease)) {
-                               int scr = 
XineramaGetCursorScreen(inputInfo.pointer);
-                               memcpy(&shiftedEvent, pev, sizeof(xEvent));
-                               shiftedEvent.u.keyButtonPointer.rootX +=
-                                   panoramiXdataPtr[scr].x - 
-                                       panoramiXdataPtr[0].x;
-                               shiftedEvent.u.keyButtonPointer.rootY +=
-                                   panoramiXdataPtr[scr].y -
-                                       panoramiXdataPtr[0].y;
-                               pEvToRecord = &shiftedEvent;
-                       }
-#endif /* PANORAMIX */
+               int count;
+               xEvent *xi_events = NULL;
 
-                       if (pContext->pRecordingClient->swapped)
-                       {
-                           (*EventSwapVector[pEvToRecord->u.u.type & 0177])
-                               (pEvToRecord, &swappedEvent);
-                           pEvToRecord = &swappedEvent;
-                       }
+               /* TODO check return values */
+               if (IsMaster(pei->device))
+               {
+                   xEvent xE;
+                   EventToCore(pei->event, &xE);
+                   RecordSendProtocolEvents(pRCAP, pContext, &xE, 1);
+               }
 
-                       RecordAProtocolElement(pContext, NULL,
-                          XRecordFromServer,  pEvToRecord, SIZEOF(xEvent), 0);
-                       /* make sure device events get flushed in the absence
-                        * of other client activity
-                        */
-                       SetCriticalOutputPending();
-                   }
-               } /* end for each event */
+               EventToXI(pei->event, &xi_events, &count);
+               RecordSendProtocolEvents(pRCAP, pContext, xi_events, count);
+               xfree(xi_events);
            } /* end this RCAP selects device events */
        } /* end for each RCAP on this context */
     } /* end for each enabled context */
-} /* RecordADeviceEvent */
+}
 
 
 /* RecordFlushAllContexts
@@ -2866,13 +2891,6 @@ RecordCloseDown(ExtensionEntry *extEntry)
 void 
 RecordExtensionInit(void)
 {
-    /* FIXME Record is currently broken. Dont initialize it so that clients
-     * that require it can bail out correctly rather than waiting for stuff
-     * that'll never happen */
-    ErrorF("record: RECORD extension enabled at configure time.\n");
-    ErrorF("record: This extension is known to be broken, disabling extension 
now..\n");
-    ErrorF("record: http://bugs.freedesktop.org/show_bug.cgi?id=20500\n";);
-#if 0
     ExtensionEntry *extentry;
 
     RTContext = CreateNewResourceType(RecordDeleteContext, "RecordContext");
@@ -2895,6 +2913,5 @@ RecordExtensionInit(void)
     }
     RecordErrorBase = extentry->errorBase;
 
-#endif
 } /* RecordExtensionInit */
 
-- 
1.6.6.1

_______________________________________________
xorg-devel mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to