From 20f59c125afe31a8bdb0ae6a74dd408e5fa00237 Mon Sep 17 00:00:00 2001
From: marha <marha@users.sourceforge.net>
Date: Thu, 7 Jan 2010 14:43:29 +0000
Subject: Added patches for bug
 http://bugs.freedesktop.org/show_bug.cgi?id=20500  
 0001-dix-EventToCore-needs-to-copy-the-root-window-too.patch  
 0001-Re-enable-the-RECORD-extension.patch

---
 xorg-server/Xi/exevents.c      | 37 ++++++++++++++++++++++++++++++-------
 xorg-server/dix/eventconvert.c |  1 +
 xorg-server/dix/events.c       | 32 ++++++++++++++++++++++++--------
 xorg-server/record/record.c    |  8 --------
 xorg-server/test/input.c       |  4 +++-
 5 files changed, 58 insertions(+), 24 deletions(-)

diff --git a/xorg-server/Xi/exevents.c b/xorg-server/Xi/exevents.c
index cb2452bb8..5f8e1fac5 100644
--- a/xorg-server/Xi/exevents.c
+++ b/xorg-server/Xi/exevents.c
@@ -1031,16 +1031,39 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
             break;
     }
 
-#if 0
-    /* FIXME: I'm broken. Please fix me. Thanks */
     if (DeviceEventCallback) {
-	DeviceEventInfoRec eventinfo;
+        DeviceEventInfoRec eventinfo;
+        SpritePtr pSprite = device->spriteInfo->sprite;
+        xEvent *xi_events = NULL;
+        int 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;
+
+        /* SDs send XI events only. MDs send both an XI event and a core
+         * event.
+         */
+        EventToXI(ev, &xi_events, &count);
+
+        eventinfo.events = (xEventPtr)xi_events;
+        eventinfo.count = count;
+        ErrorF("POE xi root is %lx\n", xi_events->u.keyButtonPointer.root);
+        CallCallbacks(&DeviceEventCallback, (pointer) & eventinfo);
+        xfree(xi_events);
+
+        if (IsMaster(device))
+        {
+            xEvent core;
+            EventToCore(ev, &core);
+            eventinfo.events = (xEventPtr)&core;
+            eventinfo.count = 1;
+            ErrorF("POE core root is %lx\n", core.u.keyButtonPointer.root);
+            CallCallbacks(&DeviceEventCallback, (pointer) & eventinfo);
+        }
 
-	eventinfo.events = (xEventPtr) xE;
-	eventinfo.count = count;
-	CallCallbacks(&DeviceEventCallback, (pointer) & eventinfo);
     }
-#endif
     grab = device->deviceGrab.grab;
 
     switch(event->type)
diff --git a/xorg-server/dix/eventconvert.c b/xorg-server/dix/eventconvert.c
index e25f3ee97..878dba576 100644
--- a/xorg-server/dix/eventconvert.c
+++ b/xorg-server/dix/eventconvert.c
@@ -119,6 +119,7 @@ EventToCore(InternalEvent *event, xEvent *core)
                 core->u.keyButtonPointer.rootX = e->root_x;
                 core->u.keyButtonPointer.rootY = e->root_y;
                 core->u.keyButtonPointer.state = e->corestate;
+                core->u.keyButtonPointer.root = e->root;
                 EventSetKeyRepeatFlag(core, (e->type == ET_KeyPress && e->key_repeat));
             }
             break;
diff --git a/xorg-server/dix/events.c b/xorg-server/dix/events.c
index 85c8f9abc..b5c88802c 100644
--- a/xorg-server/dix/events.c
+++ b/xorg-server/dix/events.c
@@ -1131,11 +1131,12 @@ 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;
+	xEvent *xi_events = NULL;
+	int count;
+
 	/*  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 +1146,29 @@ 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 =
+
+	if (ev->any.type == ET_Motion)
+	    ev->device_event.root =
 		WindowTable[pSprite->hotPhys.pScreen->myNum]->drawable.id;
-	eventinfo.events = xE;
-	eventinfo.count = nevents;
-	CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo);
+
+	EventToXI(ev, &xi_events, &count);
+
+	eventinfo.events = (xEventPtr)xi_events;
+	eventinfo.count = count;
+	CallCallbacks(&DeviceEventCallback, (pointer) & eventinfo);
+	xfree(xi_events);
+
+	if (IsMaster(device))
+	{
+	    xEvent core;
+	    EventToCore(ev, &core);
+	    eventinfo.events = (xEventPtr)&core;
+	    eventinfo.count = 1;
+	    CallCallbacks(&DeviceEventCallback, (pointer) & eventinfo);
+	}
+
     }
-#endif
+
     if (event->type == ET_Motion)
     {
 #ifdef PANORAMIX
diff --git a/xorg-server/record/record.c b/xorg-server/record/record.c
index 242544f5d..0ec92e167 100644
--- a/xorg-server/record/record.c
+++ b/xorg-server/record/record.c
@@ -2866,13 +2866,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 +2888,5 @@ RecordExtensionInit(void)
     }
     RecordErrorBase = extentry->errorBase;
 
-#endif
 } /* RecordExtensionInit */
 
diff --git a/xorg-server/test/input.c b/xorg-server/test/input.c
index 2de55bc63..63d1a1801 100644
--- a/xorg-server/test/input.c
+++ b/xorg-server/test/input.c
@@ -153,6 +153,7 @@ static void dix_event_to_core(int type)
     int rc;
     int state;
     int detail;
+    const int ROOT_WINDOW_ID = 0x100;
 
     /* EventToCore memsets the event to 0 */
 #define test_event() \
@@ -165,7 +166,7 @@ static void dix_event_to_core(int type)
     g_assert(core.u.keyButtonPointer.state == state); \
     g_assert(core.u.keyButtonPointer.eventX == 0); \
     g_assert(core.u.keyButtonPointer.eventY == 0); \
-    g_assert(core.u.keyButtonPointer.root == 0); \
+    g_assert(core.u.keyButtonPointer.root == ROOT_WINDOW_ID); \
     g_assert(core.u.keyButtonPointer.event == 0); \
     g_assert(core.u.keyButtonPointer.child == 0); \
     g_assert(core.u.keyButtonPointer.sameScreen == FALSE);
@@ -181,6 +182,7 @@ static void dix_event_to_core(int type)
     ev.time     = time;
     ev.root_y   = x;
     ev.root_x   = y;
+    ev.root     = ROOT_WINDOW_ID;
     ev.corestate = state;
     ev.detail.key = detail;
 
-- 
cgit v1.2.3