From 0129cd863ad87b8090f150611be58ac9e6e9bfda Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Tue, 15 Feb 2011 16:39:58 +0100 Subject: Prepare for additional backends Rework the code slightly to make room for additional backends. Some fixes due to Chase Douglas have been incorporated as well. The device is mapped onto the whole screen, and the paint area is a window into it, regardless of where the window is on screen. Signed-off-by: Henrik Rydberg --- tools/mtview.c | 194 +++++++++++++++++++++++++++++++++------------------------ 1 file changed, 112 insertions(+), 82 deletions(-) diff --git a/tools/mtview.c b/tools/mtview.c index ea6730c..7d6fdc6 100644 --- a/tools/mtview.c +++ b/tools/mtview.c @@ -2,21 +2,24 @@ #include #include #include +#include +#include #include #include -#define XMARG 16 -#define YMARG 16 #define DEF_FRAC 0.15 #define DEF_WIDTH 0.05 #define DIM_TOUCH 32 +static int opcode; + struct windata { Display *dsp; - Window root, win; + Window win; GC gc; - int screen, width, height; + int screen; + float off_x, off_y; unsigned long white, black; unsigned long color[DIM_TOUCH]; int id[DIM_TOUCH]; @@ -32,26 +35,28 @@ static unsigned long new_color(struct windata *w) return lrand48() & 0xffffff; } -static void clear_screen(struct windata *w) +static void clear_screen(utouch_frame_handle fh, struct windata *w) { + const struct utouch_surface *s = utouch_frame_get_surface(fh); + int width = s->mapped_max_x - s->mapped_min_x; + int height = s->mapped_max_y - s->mapped_min_y; + XSetForeground(w->dsp, w->gc, w->black); - XFillRectangle(w->dsp, w->win, w->gc, 0, 0, w->width, w->height); + XFillRectangle(w->dsp, w->win, w->gc, 0, 0, width, height); } static void output_touch(utouch_frame_handle fh, struct windata *w, const struct utouch_contact *t) { const struct utouch_surface *s = utouch_frame_get_surface(fh); - - float x1 = s->min_x, y1 = s->min_y; - float x2 = s->max_x, y2 = s->max_y; - float dx = x2 - x1, dy = y2 - y1; + float dx = s->mapped_max_x - s->mapped_min_x; + float dy = s->mapped_max_y - s->mapped_min_y; + float x = t->x - w->off_x, y = t->y - w->off_y; float major = 0, minor = 0, angle = 0; if (s->use_pressure) { - float p = DEF_FRAC / s->max_pressure; - major = t->pressure * p * dx; - minor = t->pressure * p * dx; + major = DEF_FRAC * t->pressure * dy; + minor = DEF_FRAC * t->pressure * dx; angle = 0; } if (s->use_touch_major) { @@ -68,15 +73,6 @@ static void output_touch(utouch_frame_handle fh, struct windata *w, float as = fabs(sin(angle)); float mx = max(minor * ac, major * as); float my = max(major * ac, minor * as); - float ux = t->x - 0.5 * mx; - float uy = t->y - 0.5 * my; - float vx = t->x + 0.5 * mx; - float vy = t->y + 0.5 * my; - - float px = (ux - x1) / dx * w->width; - float py = (uy - y1) / dy * w->height; - float qx = (vx - x1) / dx * w->width; - float qy = (vy - y1) / dy * w->height; if (w->id[t->slot] != t->id) { w->id[t->slot] = t->id; @@ -84,7 +80,9 @@ static void output_touch(utouch_frame_handle fh, struct windata *w, } XSetForeground(w->dsp, w->gc, w->color[t->slot]); - XFillArc(w->dsp, w->win, w->gc, px, py, qx - px, qy - py, 0, 360 * 64); + + XFillArc(w->dsp, w->win, w->gc, x - mx / 2, y - my / 2, + mx, my, 0, 360 * 64); XFlush(w->dsp); } @@ -98,88 +96,105 @@ 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->win = XCreateSimpleWindow(w->dsp, XDefaultRootWindow(w->dsp), + 0, 0, 200, 200, 0, w->black, w->white); + w->gc = DefaultGC(w->dsp, w->screen); + + 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 set_screen_size_mtdev(utouch_frame_handle fh, + struct windata *w, + XEvent *xev) +{ + struct utouch_surface *s = utouch_frame_get_surface(fh); + XConfigureEvent *cev = (XConfigureEvent *)xev; + + s->mapped_min_x = 0; + s->mapped_min_y = 0; + s->mapped_max_x = DisplayWidth(w->dsp, w->screen); + s->mapped_max_y = DisplayHeight(w->dsp, w->screen); + s->mapped_max_pressure = 1; + + if (cev) { + w->off_x = cev->x; + w->off_y = cev->y; + } + + fprintf(stderr, "map: %f %f %f %f %f %f\n", + w->off_x, w->off_y, + s->mapped_min_x, s->mapped_min_y, + s->mapped_max_x, s->mapped_max_y); +} + +static void run_window_mtdev(utouch_frame_handle fh, struct mtdev *dev, int fd) { const struct utouch_frame *frame; struct input_event iev; + struct windata w; XEvent xev; - XSelectInput(w->dsp, w->win, - ButtonPressMask | ButtonReleaseMask | - ExposureMask | StructureNotifyMask); + if (init_window(&w)) + return; + + clear_screen(fh, &w); + + set_screen_size_mtdev(fh, &w, 0); + XSelectInput(w.dsp, w.win, StructureNotifyMask); - 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); + set_screen_size_mtdev(fh, &w, &xev); } } -} - -static void run_window(utouch_frame_handle fh, struct mtdev *dev, int fd) -{ - 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); - - - w.gc = XCreateGC(w.dsp, w.win, 0, NULL); - - event_loop(fh, dev, fd, &w); - - XDestroyWindow(w.dsp, w.win); - XCloseDisplay(w.dsp); + term_window(&w); } -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 \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 +224,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 +235,18 @@ int main(int argc, char *argv[]) return 0; } + +int main(int argc, char *argv[]) +{ + int id, ret; + + if (argc < 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return -1; + } + + id = atoi(argv[1]); + ret = run_mtdev(argv[1]); + + return ret; +} -- cgit v1.2.3