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: Chris Dekter <cdekter@gmail.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
4e8bf12b13
commit
122fc0e7a0
|
@ -1051,16 +1051,19 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* FIXME: I'm broken. Please fix me. Thanks */
|
|
||||||
if (DeviceEventCallback) {
|
if (DeviceEventCallback) {
|
||||||
DeviceEventInfoRec eventinfo;
|
DeviceEventInfoRec eventinfo;
|
||||||
|
SpritePtr pSprite = device->spriteInfo->sprite;
|
||||||
|
|
||||||
eventinfo.events = (xEventPtr) xE;
|
/* see comment in EnqueueEvents regarding the next three lines */
|
||||||
eventinfo.count = count;
|
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);
|
CallCallbacks(&DeviceEventCallback, (pointer) & eventinfo);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
grab = device->deviceGrab.grab;
|
grab = device->deviceGrab.grab;
|
||||||
|
|
||||||
switch(event->type)
|
switch(event->type)
|
||||||
|
|
15
dix/events.c
15
dix/events.c
|
@ -1131,11 +1131,10 @@ EnqueueEvent(InternalEvent *ev, DeviceIntPtr device)
|
||||||
event->type == ET_KeyRelease)
|
event->type == ET_KeyRelease)
|
||||||
AccessXCancelRepeatKey(device->key->xkbInfo, event->detail.key);
|
AccessXCancelRepeatKey(device->key->xkbInfo, event->detail.key);
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* FIXME: I'm broken now. Please fix me. */
|
|
||||||
if (DeviceEventCallback)
|
if (DeviceEventCallback)
|
||||||
{
|
{
|
||||||
DeviceEventInfoRec eventinfo;
|
DeviceEventInfoRec eventinfo;
|
||||||
|
|
||||||
/* The RECORD spec says that the root window field of motion events
|
/* 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
|
* 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
|
* 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
|
* the data that GetCurrentRootWindow relies on hasn't been
|
||||||
* updated yet.
|
* updated yet.
|
||||||
*/
|
*/
|
||||||
if (xE->u.u.type == DeviceMotionNotify)
|
if (ev->any.type == ET_Motion)
|
||||||
XE_KBPTR.root =
|
ev->device_event.root = WindowTable[pSprite->hotPhys.pScreen->myNum]->drawable.id;
|
||||||
WindowTable[pSprite->hotPhys.pScreen->myNum]->drawable.id;
|
|
||||||
eventinfo.events = xE;
|
eventinfo.event = ev;
|
||||||
eventinfo.count = nevents;
|
eventinfo.device = device;
|
||||||
CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo);
|
CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
if (event->type == ET_Motion)
|
if (event->type == ET_Motion)
|
||||||
{
|
{
|
||||||
#ifdef PANORAMIX
|
#ifdef PANORAMIX
|
||||||
|
|
|
@ -576,8 +576,8 @@ typedef struct {
|
||||||
extern _X_EXPORT CallbackListPtr DeviceEventCallback;
|
extern _X_EXPORT CallbackListPtr DeviceEventCallback;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
xEventPtr events;
|
InternalEvent *event;
|
||||||
int count;
|
DeviceIntPtr device;
|
||||||
} DeviceEventInfoRec;
|
} DeviceEventInfoRec;
|
||||||
|
|
||||||
extern int XItoCoreType(int xi_type);
|
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 IsPointerDevice( DeviceIntPtr dev);
|
||||||
extern Bool _X_EXPORT IsKeyboardDevice(DeviceIntPtr dev);
|
extern Bool _X_EXPORT IsKeyboardDevice(DeviceIntPtr dev);
|
||||||
extern Bool IsPointerEvent(InternalEvent *event);
|
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 void CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master);
|
||||||
extern _X_HIDDEN int CorePointerProc(DeviceIntPtr dev, int what);
|
extern _X_HIDDEN int CorePointerProc(DeviceIntPtr dev, int what);
|
||||||
|
|
|
@ -30,9 +30,9 @@
|
||||||
|
|
||||||
#define FP1616(integral, frac) ((integral) * (1 << 16) + (frac) * (1 << 16))
|
#define FP1616(integral, frac) ((integral) * (1 << 16) + (frac) * (1 << 16))
|
||||||
|
|
||||||
_X_INTERNAL int EventToCore(InternalEvent *event, xEvent *core);
|
_X_EXPORT int EventToCore(InternalEvent *event, xEvent *core);
|
||||||
_X_INTERNAL int EventToXI(InternalEvent *ev, xEvent **xi, int *count);
|
_X_EXPORT int EventToXI(InternalEvent *ev, xEvent **xi, int *count);
|
||||||
_X_INTERNAL int EventToXI2(InternalEvent *ev, xEvent **xi);
|
_X_EXPORT int EventToXI2(InternalEvent *ev, xEvent **xi);
|
||||||
_X_INTERNAL int GetCoreType(InternalEvent* ev);
|
_X_INTERNAL int GetCoreType(InternalEvent* ev);
|
||||||
_X_INTERNAL int GetXIType(InternalEvent* ev);
|
_X_INTERNAL int GetXIType(InternalEvent* ev);
|
||||||
_X_INTERNAL int GetXI2Type(InternalEvent* ev);
|
_X_INTERNAL int GetXI2Type(InternalEvent* ev);
|
||||||
|
|
|
@ -42,6 +42,8 @@ and Jim Haggerty of Metheus.
|
||||||
#include "set.h"
|
#include "set.h"
|
||||||
#include "swaprep.h"
|
#include "swaprep.h"
|
||||||
#include "inputstr.h"
|
#include "inputstr.h"
|
||||||
|
#include "eventconvert.h"
|
||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
@ -139,7 +141,8 @@ static int RecordDeleteContext(
|
||||||
XID /*id*/
|
XID /*id*/
|
||||||
);
|
);
|
||||||
|
|
||||||
|
void RecordExtensionInit(void);
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
||||||
/* client private stuff */
|
/* client private stuff */
|
||||||
|
@ -727,38 +730,14 @@ RecordADeliveredEventOrError(CallbackListPtr *pcbl, pointer nulldata, pointer ca
|
||||||
} /* RecordADeliveredEventOrError */
|
} /* RecordADeliveredEventOrError */
|
||||||
|
|
||||||
|
|
||||||
/* RecordADeviceEvent
|
|
||||||
*
|
|
||||||
* Arguments:
|
|
||||||
* pcbl is &DeviceEventCallback.
|
|
||||||
* nulldata is NULL.
|
|
||||||
* calldata is a pointer to a DeviceEventInfoRec (include/dix.h)
|
|
||||||
* which provides information about device events that occur.
|
|
||||||
*
|
|
||||||
* Returns: nothing.
|
|
||||||
*
|
|
||||||
* Side Effects:
|
|
||||||
* The device event is recorded by all contexts that have registered
|
|
||||||
* it for this client.
|
|
||||||
*/
|
|
||||||
static void
|
static void
|
||||||
RecordADeviceEvent(CallbackListPtr *pcbl, pointer nulldata, pointer calldata)
|
RecordSendProtocolEvents(RecordClientsAndProtocolPtr pRCAP,
|
||||||
{
|
RecordContextPtr pContext,
|
||||||
DeviceEventInfoRec *pei = (DeviceEventInfoRec *)calldata;
|
xEvent* pev, int count)
|
||||||
RecordContextPtr pContext;
|
|
||||||
RecordClientsAndProtocolPtr pRCAP;
|
|
||||||
int eci; /* enabled context index */
|
|
||||||
|
|
||||||
for (eci = 0; eci < numEnabledContexts; eci++)
|
|
||||||
{
|
|
||||||
pContext = ppAllContexts[eci];
|
|
||||||
for (pRCAP = pContext->pListOfRCAP; pRCAP; pRCAP = pRCAP->pNextRCAP)
|
|
||||||
{
|
|
||||||
if (pRCAP->pDeviceEventSet)
|
|
||||||
{
|
{
|
||||||
int ev; /* event index */
|
int ev; /* event index */
|
||||||
xEvent *pev = pei->events;
|
|
||||||
for (ev = 0; ev < pei->count; ev++, pev++)
|
for (ev = 0; ev < count; ev++, pev++)
|
||||||
{
|
{
|
||||||
if (RecordIsMemberOfSet(pRCAP->pDeviceEventSet,
|
if (RecordIsMemberOfSet(pRCAP->pDeviceEventSet,
|
||||||
pev->u.u.type & 0177))
|
pev->u.u.type & 0177))
|
||||||
|
@ -801,10 +780,56 @@ RecordADeviceEvent(CallbackListPtr *pcbl, pointer nulldata, pointer calldata)
|
||||||
SetCriticalOutputPending();
|
SetCriticalOutputPending();
|
||||||
}
|
}
|
||||||
} /* end for each event */
|
} /* end for each event */
|
||||||
|
|
||||||
|
} /* RecordADeviceEvent */
|
||||||
|
|
||||||
|
/* RecordADeviceEvent
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* pcbl is &DeviceEventCallback.
|
||||||
|
* nulldata is NULL.
|
||||||
|
* calldata is a pointer to a DeviceEventInfoRec (include/dix.h)
|
||||||
|
* which provides information about device events that occur.
|
||||||
|
*
|
||||||
|
* Returns: nothing.
|
||||||
|
*
|
||||||
|
* Side Effects:
|
||||||
|
* The device event is recorded by all contexts that have registered
|
||||||
|
* it for this client.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
RecordADeviceEvent(CallbackListPtr *pcbl, pointer nulldata, pointer calldata)
|
||||||
|
{
|
||||||
|
DeviceEventInfoRec *pei = (DeviceEventInfoRec *)calldata;
|
||||||
|
RecordContextPtr pContext;
|
||||||
|
RecordClientsAndProtocolPtr pRCAP;
|
||||||
|
int eci; /* enabled context index */
|
||||||
|
|
||||||
|
for (eci = 0; eci < numEnabledContexts; eci++)
|
||||||
|
{
|
||||||
|
pContext = ppAllContexts[eci];
|
||||||
|
for (pRCAP = pContext->pListOfRCAP; pRCAP; pRCAP = pRCAP->pNextRCAP)
|
||||||
|
{
|
||||||
|
if (pRCAP->pDeviceEventSet)
|
||||||
|
{
|
||||||
|
int count;
|
||||||
|
xEvent *xi_events = NULL;
|
||||||
|
|
||||||
|
/* TODO check return values */
|
||||||
|
if (IsMaster(pei->device))
|
||||||
|
{
|
||||||
|
xEvent xE;
|
||||||
|
EventToCore(pei->event, &xE);
|
||||||
|
RecordSendProtocolEvents(pRCAP, pContext, &xE, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
EventToXI(pei->event, &xi_events, &count);
|
||||||
|
RecordSendProtocolEvents(pRCAP, pContext, xi_events, count);
|
||||||
|
xfree(xi_events);
|
||||||
} /* end this RCAP selects device events */
|
} /* end this RCAP selects device events */
|
||||||
} /* end for each RCAP on this context */
|
} /* end for each RCAP on this context */
|
||||||
} /* end for each enabled context */
|
} /* end for each enabled context */
|
||||||
} /* RecordADeviceEvent */
|
}
|
||||||
|
|
||||||
|
|
||||||
/* RecordFlushAllContexts
|
/* RecordFlushAllContexts
|
||||||
|
@ -2866,13 +2891,6 @@ RecordCloseDown(ExtensionEntry *extEntry)
|
||||||
void
|
void
|
||||||
RecordExtensionInit(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;
|
ExtensionEntry *extentry;
|
||||||
|
|
||||||
RTContext = CreateNewResourceType(RecordDeleteContext, "RecordContext");
|
RTContext = CreateNewResourceType(RecordDeleteContext, "RecordContext");
|
||||||
|
@ -2895,6 +2913,5 @@ RecordExtensionInit(void)
|
||||||
}
|
}
|
||||||
RecordErrorBase = extentry->errorBase;
|
RecordErrorBase = extentry->errorBase;
|
||||||
|
|
||||||
#endif
|
|
||||||
} /* RecordExtensionInit */
|
} /* RecordExtensionInit */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue