diff options
author | Henrik Rydberg <rydberg@euromail.se> | 2011-01-10 21:34:40 +0100 |
---|---|---|
committer | Henrik Rydberg <rydberg@euromail.se> | 2011-01-10 21:34:40 +0100 |
commit | 2a8f16a63e939f8991c6a92bf20aec31f23bdef8 (patch) | |
tree | ee9b5b0252e00debd56b8391a7462787a820958a | |
parent | 9607b34bf384cd341f2ac2a7a06f1021eff14363 (diff) |
mt events through X
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | tools/Makefile.am | 6 | ||||
-rw-r--r-- | tools/mtview.c | 211 |
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; +} |