diff options
Diffstat (limited to 'packages/xorg-xserver/xserver-kdrive/xcalibrate-new-input-world-order.patch')
-rw-r--r-- | packages/xorg-xserver/xserver-kdrive/xcalibrate-new-input-world-order.patch | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/packages/xorg-xserver/xserver-kdrive/xcalibrate-new-input-world-order.patch b/packages/xorg-xserver/xserver-kdrive/xcalibrate-new-input-world-order.patch new file mode 100644 index 0000000000..2cc9e60d8d --- /dev/null +++ b/packages/xorg-xserver/xserver-kdrive/xcalibrate-new-input-world-order.patch @@ -0,0 +1,159 @@ +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 <X11/extensions/XI.h> /* for XI_TOUCHSCREEN */ ++#include <X11/extensions/XIproto.h> /* for xDeviceCtl */ + #include <X11/extensions/xcalibrateproto.h> + #include <X11/extensions/xcalibratewire.h> + +-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; + } |