CRUDE HACK ALERT: this patch adds a new device control (DEVICE_RAWEVENT) which cannot be exported in the protocol because the xDeviceRaweventCtl carries a C pointer to the tslib event hook. For lack of a better idea, I added this to get the event hook pointer from Xext/xcalibrate.c into tslib.c, where the now-private _raw_event_hook and _raw_event_closure pointers are manipulated instead of, like before, in the Xcalibrate extension itself. Index: xorg-server-1.4/Xext/xcalibrate.c =================================================================== --- xorg-server-1.4.orig/Xext/xcalibrate.c 2007-09-08 13:22:55.000000000 +0200 +++ xorg-server-1.4/Xext/xcalibrate.c 2007-09-08 16:03:17.000000000 +0200 @@ -33,14 +33,14 @@ #include "os.h" #include "dixstruct.h" #include "extnsionst.h" +#include "inputstr.h" /* for inputInfo */ #include "swaprep.h" +#include /* for XI_TOUCHSCREEN */ +#include /* for xDeviceCtl */ #include #include -extern void (*tslib_raw_event_hook)(int x, int y, int pressure, void *closure); -extern void *tslib_raw_event_closure; - static CARD8 XCalibrateReqCode; int XCalibrateEventBase; int XCalibrateReqBase; @@ -64,6 +64,31 @@ WriteEventsToClient (pClient, 1, (xEvent *) &ev); } +#define DEVICE_RAWEVENT 6 +typedef struct { + CARD16 control B16; + CARD16 length B16; + void *hook; +} xDeviceRaweventCtl; + +static void +xcalibrate_set_event_hook (void *hook, ClientPtr client) +{ + DeviceIntPtr devtmp; + Atom xiclass; + xDeviceRaweventCtl rawevent; + + rawevent.control = DEVICE_RAWEVENT; + rawevent.length = sizeof(rawevent); + rawevent.hook = hook; + + xiclass = MakeAtom(XI_TOUCHSCREEN, strlen(XI_TOUCHSCREEN), 1); + + for (devtmp = inputInfo.devices; devtmp; devtmp = devtmp->next) + if (devtmp->type == xiclass) + ChangeDeviceControl(client, devtmp, (xDeviceCtl *) &rawevent); +} + static int ProcXCalibrateQueryVersion (ClientPtr client) { @@ -124,8 +149,7 @@ { /* Start calibrating. */ xcalibrate_client = client; - tslib_raw_event_hook = xcalibrate_event_hook; - tslib_raw_event_closure = client; + xcalibrate_set_event_hook(xcalibrate_event_hook, client); rep.status = GrabSuccess; } else @@ -139,8 +163,7 @@ { /* Stop calibrating. */ xcalibrate_client = NULL; - tslib_raw_event_hook = NULL; - tslib_raw_event_closure = NULL; + xcalibrate_set_event_hook(NULL, NULL); rep.status = GrabSuccess; /* Cycle input off and on to reload configuration. */ @@ -277,8 +300,7 @@ { /* Stop calibrating. */ xcalibrate_client = NULL; - tslib_raw_event_hook = NULL; - tslib_raw_event_closure = NULL; + xcalibrate_set_event_hook(NULL, NULL); } } Index: xorg-server-1.4/hw/kdrive/linux/tslib.c =================================================================== --- xorg-server-1.4.orig/hw/kdrive/linux/tslib.c 2007-09-08 14:46:41.000000000 +0200 +++ xorg-server-1.4/hw/kdrive/linux/tslib.c 2007-09-08 16:10:57.000000000 +0200 @@ -56,6 +56,13 @@ int phys_screen; }; +void +tslib_set_raw_event_hook(KdPointerInfo *pi, void *hook, void *closure) +{ + struct TslibPrivate *private = pi->driverPrivate; + private->raw_event_hook = hook; + private->raw_event_closure = closure; +} static void TsRead (int fd, void *closure) Index: xorg-server-1.4/hw/kdrive/src/kinput.c =================================================================== --- xorg-server-1.4.orig/hw/kdrive/src/kinput.c 2007-09-08 14:45:01.000000000 +0200 +++ xorg-server-1.4/hw/kdrive/src/kinput.c 2007-09-08 16:09:32.000000000 +0200 @@ -2389,10 +2389,19 @@ return BadMatch; } +#define DEVICE_RAWEVENT 6 +typedef struct { + CARD16 control B16; + CARD16 length B16; + void *hook; +} xDeviceRaweventCtl; + int ChangeDeviceControl(register ClientPtr client, DeviceIntPtr pDev, xDeviceCtl *control) { + KdPointerInfo *pi; + switch (control->control) { case DEVICE_RESOLUTION: /* FIXME do something more intelligent here */ @@ -2406,6 +2415,24 @@ case DEVICE_ENABLE: return Success; + case DEVICE_RAWEVENT: + if (!pDev) + return BadImplementation; + + for (pi = kdPointers; pi; pi = pi->next) { + if (pi->dixdev && pi->dixdev->id == pDev->id) + break; + } + + if (!pi || !pi->dixdev || pi->dixdev->id != pDev->id) { + ErrorF("[ChangeDeviceControl] Failed to find pointer for device %d!\n", + pDev->id); + return BadImplementation; + } + + tslib_set_raw_event_hook(pi, ((xDeviceRaweventCtl *)control)->hook, client); + return Success; + default: return BadMatch; }