xorg-server: Changes to 'ubuntu'
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 <bryce@bryceharrington.org>
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 <tjaalton@ubuntu.com> 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 <bryce@ubuntu.com> 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 <cdekter@gmail.com>
+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 <peter.hutterer@who-t.net>
+---
+ 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
Reply to: