summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2011-01-10 21:34:40 +0100
committerHenrik Rydberg <rydberg@euromail.se>2011-01-10 21:34:40 +0100
commit2a8f16a63e939f8991c6a92bf20aec31f23bdef8 (patch)
treeee9b5b0252e00debd56b8391a7462787a820958a
parent9607b34bf384cd341f2ac2a7a06f1021eff14363 (diff)
mt events through X
-rw-r--r--configure.ac2
-rw-r--r--tools/Makefile.am6
-rw-r--r--tools/mtview.c211
3 files changed, 165 insertions, 54 deletions
diff --git a/configure.ac b/configure.ac
index 5e177c7..df11d0a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -26,6 +26,8 @@ PKG_CHECK_MODULES([MTDEV], [mtdev >= 1.1])
PKG_CHECK_MODULES([EVEMU], [utouch-evemu >= 1.0])
PKG_CHECK_MODULES([FRAME], [utouch-frame >= 1.0])
PKG_CHECK_MODULES([X11], [x11])
+PKG_CHECK_MODULES(XINPUT, x11 xext [xi >= 1.2] [inputproto >= 1.5])
+PKG_CHECK_MODULES(XI2_1, [xi >= 1.4.99.1] [inputproto >= 2.0.99.1])
AC_CONFIG_FILES([Makefile
tools/Makefile
diff --git a/tools/Makefile.am b/tools/Makefile.am
index f33b5e5..51de4e4 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -2,5 +2,9 @@ bin_PROGRAMS = mtview
INCLUDES=-I$(top_srcdir)/include/
+AM_CFLAGS = $(XINPUT_CFLAGS)
+
mtview_SOURCES = mtview.c
-mtview_LDFLAGS = -lX11 -lutouch-frame -lutouch-evemu -lmtdev -lm
+mtview_LDFLAGS = \
+ -lutouch-frame -lutouch-evemu -lmtdev \
+ $(XINPUT_LIBS) $(X11_LIBS) -lm
diff --git a/tools/mtview.c b/tools/mtview.c
index ea6730c..0cfbc57 100644
--- a/tools/mtview.c
+++ b/tools/mtview.c
@@ -1,7 +1,8 @@
-#include <X11/Xlib.h>
+#include <utouch/frame-xi2.h>
+#include <utouch/frame-mtdev.h>
+#include <linux/input.h>
#include <stdio.h>
#include <fcntl.h>
-#include <utouch/frame-mtdev.h>
#include <string.h>
#include <math.h>
@@ -12,6 +13,9 @@
#define DIM_TOUCH 32
+static int opcode;
+struct mtdev;
+
struct windata {
Display *dsp;
Window root, win;
@@ -98,88 +102,130 @@ static void report_frame(utouch_frame_handle fh,
output_touch(fh, w, frame->active[i]);
}
-static void event_loop(utouch_frame_handle fh,
- struct mtdev *dev, int fd,
- struct windata *w)
+static int init_window(struct windata *w)
+{
+ int event, err;
+ int i;
+ memset(w, 0, sizeof(w));
+ for (i = 0; i < DIM_TOUCH; i++)
+ w->id[i] = -1;
+
+ w->dsp = XOpenDisplay(NULL);
+ if (!w->dsp)
+ return -1;
+ if (!XQueryExtension(w->dsp, "XInputExtension", &opcode, &event, &err))
+ return -1;
+
+ w->screen = DefaultScreen(w->dsp);
+ w->white = WhitePixel(w->dsp, w->screen);
+ w->black = BlackPixel(w->dsp, w->screen);
+ w->width = DisplayWidth(w->dsp, w->screen) - XMARG;
+ w->height = DisplayHeight(w->dsp, w->screen) - YMARG;
+
+ w->root = DefaultRootWindow(w->dsp);
+ w->win = XCreateSimpleWindow(w->dsp, w->root,
+ 0, 0, w->width, w->height,
+ 0, w->black, w->white);
+
+
+ w->gc = XCreateGC(w->dsp, w->win, 0, NULL);
+
+ XMapWindow(w->dsp, w->win);
+ XFlush(w->dsp);
+
+ return 0;
+}
+
+static void term_window(struct windata *w)
+{
+ XDestroyWindow(w->dsp, w->win);
+ XCloseDisplay(w->dsp);
+}
+
+static void run_window_mtdev(utouch_frame_handle fh, struct mtdev *dev, int fd)
{
+ long eventMask = StructureNotifyMask;
const struct utouch_frame *frame;
struct input_event iev;
+ struct windata w;
XEvent xev;
+ int i;
+
+ if (init_window(&w))
+ return;
+
+ XSelectInput(w.dsp, w.win, eventMask);
+
+ do {
+ XNextEvent(w.dsp, &xev);
+ } while (xev.type != MapNotify);
+
- XSelectInput(w->dsp, w->win,
+ XSelectInput(w.dsp, w.win,
ButtonPressMask | ButtonReleaseMask |
ExposureMask | StructureNotifyMask);
- clear_screen(w);
+ clear_screen(&w);
+
while (1) {
while (!mtdev_idle(dev, fd, 100)) {
while (mtdev_get(dev, fd, &iev, 1) > 0) {
frame = utouch_frame_pump_mtdev(fh, &iev);
if (frame)
- report_frame(fh, frame, w);
+ report_frame(fh, frame, &w);
}
}
- while (XPending(w->dsp)) {
- XNextEvent(w->dsp, &xev);
+ while (XPending(w.dsp)) {
+ XNextEvent(w.dsp, &xev);
}
}
+
+ term_window(&w);
}
-static void run_window(utouch_frame_handle fh, struct mtdev *dev, int fd)
+static void run_window_xi2(struct windata *w,
+ utouch_frame_handle fh,
+ XIDeviceInfo *dev)
{
- struct windata w;
- int i;
- memset(&w, 0, sizeof(w));
- for (i = 0; i < DIM_TOUCH; i++)
- w.id[i] = -1;
-
- w.dsp = XOpenDisplay(NULL);
- if (!w.dsp)
- return;
-
- w.screen = DefaultScreen(w.dsp);
- w.white = WhitePixel(w.dsp, w.screen);
- w.black = BlackPixel(w.dsp, w.screen);
- w.width = DisplayWidth(w.dsp, w.screen) - XMARG;
- w.height = DisplayHeight(w.dsp, w.screen) - YMARG;
-
- w.root = DefaultRootWindow(w.dsp);
- w.win = XCreateSimpleWindow(w.dsp, w.root,
- 0, 0, w.width, w.height,
- 0, w.black, w.white);
-
- XMapWindow(w.dsp, w.win);
-
- long eventMask = StructureNotifyMask;
- XSelectInput(w.dsp, w.win, eventMask);
-
- XEvent ev;
- do {
- XNextEvent(w.dsp, &ev);
- } while (ev.type != MapNotify);
+ const struct utouch_frame *frame;
+ XIEventMask mask;
+ fprintf(stderr, "xi2 running\n");
- w.gc = XCreateGC(w.dsp, w.win, 0, NULL);
+ mask.deviceid = XIAllDevices;
+ mask.mask_len = XIMaskLen(XI_TouchMotion);
+ mask.mask = calloc(mask.mask_len, sizeof(char));
- event_loop(fh, dev, fd, &w);
+ XISetMask(mask.mask, XI_TouchBegin);
+ XISetMask(mask.mask, XI_TouchMotion);
+ XISetMask(mask.mask, XI_TouchEnd);
+ XISelectEvents(w->dsp, w->win, &mask, 1);
- XDestroyWindow(w.dsp, w.win);
- XCloseDisplay(w.dsp);
+ while (1) {
+ XEvent ev;
+ XIDeviceEvent *event = (void*)&ev;
+ XGenericEventCookie *cookie = &ev.xcookie;
+ XNextEvent(w->dsp, &ev);
+
+ if (XGetEventData(w->dsp, cookie) &&
+ cookie->type == GenericEvent &&
+ cookie->extension == opcode) {
+ frame = utouch_frame_pump_xi2(fh, cookie->data);
+ if (frame)
+ report_frame(fh, frame, w);
+ }
+ XFreeEventData(w->dsp, cookie);
+ }
}
-int main(int argc, char *argv[])
+static int run_mtdev(const char *name)
{
struct evemu_device *evemu;
struct mtdev *mtdev;
utouch_frame_handle fh;
int fd;
- if (argc < 2) {
- fprintf(stderr, "Usage: %s <device>\n", argv[0]);
- return -1;
- }
-
- fd = open(argv[1], O_RDONLY | O_NONBLOCK);
+ fd = open(name, O_RDONLY | O_NONBLOCK);
if (fd < 0) {
fprintf(stderr, "error: could not open device\n");
return -1;
@@ -209,7 +255,7 @@ int main(int argc, char *argv[])
return -1;
}
- run_window(fh, mtdev, fd);
+ run_window_mtdev(fh, mtdev, fd);
utouch_frame_delete_engine(fh);
mtdev_close_delete(mtdev);
@@ -220,3 +266,62 @@ int main(int argc, char *argv[])
return 0;
}
+
+static int run_xi2(int id)
+{
+ struct windata w;
+ XIDeviceInfo *info, *dev;
+ utouch_frame_handle fh;
+ int ndevice;
+ int i;
+
+ if (init_window(&w)) {
+ fprintf(stderr, "error: could not init window\n");
+ return -1;
+ }
+
+ info = XIQueryDevice(w.dsp, XIAllDevices, &ndevice);
+ dev = 0;
+ for (i = 0; i < ndevice; i++)
+ if (info[i].deviceid == id)
+ dev = &info[i];
+ if (!dev)
+ return -1;
+
+ if (!utouch_frame_is_supported_xi2(w.dsp, dev)) {
+ fprintf(stderr, "error: unsupported device\n");
+ return -1;
+ }
+
+ fh = utouch_frame_new_engine(100, 32, 100);
+ if (!fh || utouch_frame_init_xi2(fh, w.dsp, dev)) {
+ fprintf(stderr, "error: could not init frame\n");
+ return -1;
+ }
+
+ run_window_xi2(&w, fh, dev);
+
+ utouch_frame_delete_engine(fh);
+ XIFreeDeviceInfo(info);
+ term_window(&w);
+
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ int id, ret;
+
+ if (argc < 2) {
+ fprintf(stderr, "Usage: %s <device>\n", argv[0]);
+ return -1;
+ }
+
+ id = atoi(argv[1]);
+ if (id)
+ ret = run_xi2(id);
+ else
+ ret = run_mtdev(argv[1]);
+
+ return ret;
+}