This patch adds support for "EVIOCGRAB" on the input device, which
tells the kernel _not_ to deliver events of the touchscreen to
/dev/input/mice.  

This is probably what most people want, since unprocessed raw touchscreen
events should not be converted to emulated PS/2 mouse movements.

Signed-off-by: Harald Welte <laforge@openmoko.org>

Index: a/plugins/input-raw.c
===================================================================
--- a/plugins/input-raw.c	(revision 49)
+++ b/plugins/input-raw.c	(working copy)
@@ -18,6 +18,7 @@
 
 #include <errno.h>
 #include <stdio.h>
+#include <limits.h>
 
 #include <stdlib.h>
 #ifdef HAVE_UNISTD_H
@@ -33,6 +34,9 @@
 
 #include "tslib-private.h"
 
+#define GRAB_EVENTS_WANTED	1
+#define GRAB_EVENTS_ACTIVE	2
+
 struct tslib_input {
 	struct tslib_module_info module;
 
@@ -42,6 +46,7 @@
 
 	int	sane_fd;
 	int	using_syn;
+	int	grab_events;
 };
 
 static int check_fd(struct tslib_input *i)
@@ -64,6 +69,14 @@
 
 	if (bit & (1 << EV_SYN))
 		i->using_syn = 1;
+	
+	if (i->grab_events == GRAB_EVENTS_WANTED) {
+		if (ioctl(ts->fd, EVIOCGRAB, (void *)1)) {
+			fprintf(stderr, "Unable to grab selected input device\n");
+			return -1;
+		}
+		i->grab_events = GRAB_EVENTS_ACTIVE;
+	}
 
 	return 0;
 }
@@ -222,6 +235,15 @@
 
 static int ts_input_fini(struct tslib_module_info *inf)
 {
+	struct tslib_input *i = (struct tslib_input *)inf;
+	struct tsdev *ts = inf->dev;
+
+	if (i->grab_events == GRAB_EVENTS_ACTIVE) {
+		if (ioctl(ts->fd, EVIOCGRAB, (void *)0)) {
+			fprintf(stderr, "Unable to un-grab selected input device\n");
+		}
+	}
+
 	free(inf);
 	return 0;
 }
@@ -231,6 +253,36 @@
 	.fini	= ts_input_fini,
 };
 
+static int parse_raw_grab(struct tslib_module_info *inf, char *str, void *data)
+{
+	struct tslib_input *i = (struct tslib_input *)inf;
+	unsigned long v;
+	int err = errno;
+
+	v = strtoul(str, NULL, 0);
+
+	if (v == ULONG_MAX && errno == ERANGE)
+		return -1;
+	
+	errno = err;
+	switch ((int)data) {
+	case 1:
+		if (v)
+			i->grab_events = GRAB_EVENTS_WANTED;
+		break;
+	default:
+		return -1;
+	}
+	return 0;
+}
+
+static const struct tslib_vars raw_vars[] =
+{
+	{ "grab_events", (void *)1, parse_raw_grab },
+};
+
+#define NR_VARS (sizeof(raw_vars) / sizeof(raw_vars[0]))
+
 TSAPI struct tslib_module_info *mod_init(struct tsdev *dev, const char *params)
 {
 	struct tslib_input *i;
@@ -245,5 +297,12 @@
 	i->current_p = 0;
 	i->sane_fd = 0;
 	i->using_syn = 0;
+	i->grab_events = 0;
+
+	if (tslib_parse_vars(&i->module, raw_vars, NR_VARS, params)) {
+		free(i);
+		return NULL;
+	}
+
 	return &(i->module);
 }
