[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: