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]

