- moved common (1.3.0.0/1.4.99.901) patches to xserver-kdrive TODO: merge xmodmap and "-mouse tslib" from OE git-svn-id: https://svn.o-hand.com/repos/poky/trunk@4317 311d38ba-8fff-0310-9ca6-ca027cbcb966
160 lines
4.8 KiB
Diff
160 lines
4.8 KiB
Diff
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;
|
|
}
|