debian/changelog                             |   10 
 debian/patches/108_reenable_record_ext.patch |  304 +++++++++++++++++++++++++++
 debian/patches/series                        |    1 
 3 files changed, 314 insertions(+), 1 deletion(-)

New commits:
commit 4b0b9b00d460f11c14cd7c3d04ede4ce4d6c4c4a
Author: Bryce Harrington <[email protected]>
Date:   Mon Feb 22 17:38:43 2010 -0800

    Add patch to re-enable record extension

diff --git a/debian/changelog b/debian/changelog
index 1cef4c1..a68154c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,9 +1,17 @@
 xorg-server (2:1.7.5-1ubuntu2) UNRELEASED; urgency=low
 
+  [Timo Aaltonen]
   * Add 107_dont_filter_input_subsys.diff so for instance serial wacom
     devices are initialized by the udev backend (LP: #522318)
 
- -- Timo Aaltonen <[email protected]>  Sun, 21 Feb 2010 12:46:10 +0200
+  [Bryce Harrington]
+  * Add 108_reenable_record_ext.patch: Upstream patch to make the
+    record callback work with the new internal core/Xi events mechanism
+    instead of xEvents. With this fix, the record extension can be
+    re-enabled.
+    (LP: #315456)
+  
+ -- Bryce Harrington <[email protected]>  Mon, 22 Feb 2010 17:29:28 -0800
 
 xorg-server (2:1.7.5-1ubuntu1) lucid; urgency=low
 
diff --git a/debian/patches/108_reenable_record_ext.patch 
b/debian/patches/108_reenable_record_ext.patch
new file mode 100644
index 0000000..67ac9ea
--- /dev/null
+++ b/debian/patches/108_reenable_record_ext.patch
@@ -0,0 +1,304 @@
+From e7667ff71336523a03c442d248c690e0557d1518 Mon Sep 17 00:00:00 2001
+From: Chris Dekter <[email protected]>
+Date: Wed, 28 Oct 2009 12:51:58 +1000
+Subject: [PATCH] Re-enable RECORD extension.
+
+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]>
+---
+ 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
+
diff --git a/debian/patches/series b/debian/patches/series
index dcb30c5..07199af 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -17,6 +17,7 @@
 #105_fglrx_autodetect.patch
 106_nouveau_autodetect.patch
 107_dont_filter_input_subsys.diff
+108_reenable_record_ext.patch
 121_only_switch_vt_when_active.diff
 #143_default_to_vesa.patch
 157_check_null_modes.patch


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]
Archive: http://lists.debian.org/[email protected]

Reply via email to