generic-poky/meta/packages/xorg-xserver/xserver-kdrive-1.4.99.901/xcalibrate-new-input-world-order.patch
Marcin Juszkiewicz ff2e381fd7 xserver-kdrive: added 1.4.99.901 (1.5-rc) from OE
- 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
2008-04-23 10:29:06 +00:00

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