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;
     }