aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/xorg-xserver/xserver-kdrive/xcalibrate-new-input-world-order.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/xorg-xserver/xserver-kdrive/xcalibrate-new-input-world-order.patch')
-rw-r--r--recipes/xorg-xserver/xserver-kdrive/xcalibrate-new-input-world-order.patch159
1 files changed, 159 insertions, 0 deletions
diff --git a/recipes/xorg-xserver/xserver-kdrive/xcalibrate-new-input-world-order.patch b/recipes/xorg-xserver/xserver-kdrive/xcalibrate-new-input-world-order.patch
new file mode 100644
index 0000000000..2cc9e60d8d
--- /dev/null
+++ b/recipes/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;
+ }