diff options
author | Henrik Rydberg <rydberg@euromail.se> | 2011-01-07 18:34:50 +0100 |
---|---|---|
committer | Henrik Rydberg <rydberg@euromail.se> | 2011-01-07 18:34:50 +0100 |
commit | 51a5b7aa634daeac4f54ad0c6d4a15555d90447d (patch) | |
tree | 99af5cb22eb0263236b502f5d1dcb9d7815dd489 | |
parent | 2091bbf8356c468389948bcea81633b6fe63e351 (diff) |
test
-rw-r--r-- | include/utouch/frame-xi2.h | 4 | ||||
-rw-r--r-- | src/Makefile.am | 6 | ||||
-rw-r--r-- | src/frame-impl.h | 1 | ||||
-rw-r--r-- | src/frame-xi2.c | 116 | ||||
-rw-r--r-- | src/frame.c | 1 | ||||
-rw-r--r-- | tools/Makefile.am | 7 | ||||
-rw-r--r-- | tools/utouch-frame-test-xi2.c | 5 |
7 files changed, 89 insertions, 51 deletions
diff --git a/include/utouch/frame-xi2.h b/include/utouch/frame-xi2.h index 602bd9b..d7dff55 100644 --- a/include/utouch/frame-xi2.h +++ b/include/utouch/frame-xi2.h @@ -27,10 +27,10 @@ #include <utouch/frame.h> #include <X11/extensions/XInput2.h> -int utouch_frame_is_supported_xi2(const XIDeviceInfo *dev); +int utouch_frame_is_supported_xi2(Display *dpy, const XIDeviceInfo *dev); int utouch_frame_init_xi2(utouch_frame_handle fh, - const XIDeviceInfo *dev); + Display *dpy, const XIDeviceInfo *dev); const struct utouch_frame * utouch_frame_pump_xi2(utouch_frame_handle fh, const XIDeviceEvent *ev); diff --git a/src/Makefile.am b/src/Makefile.am index 34f0462..52cdbcb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -3,8 +3,10 @@ lib_LTLIBRARIES = libutouch-frame.la libutouch_frame_la_LDFLAGS = \ -version-info @LIB_VERSION@ \ -lm \ - $(EVEMU_LIBS) - $(MTDEV_LIBS) + $(EVEMU_LIBS) \ + $(MTDEV_LIBS) \ + $(XINPUT_LIBS) \ + $(X11_LIBS) libutouch_frame_la_SOURCES = \ frame-impl.h \ diff --git a/src/frame-impl.h b/src/frame-impl.h index c31f7da..96e978b 100644 --- a/src/frame-impl.h +++ b/src/frame-impl.h @@ -13,6 +13,7 @@ struct utouch_frame_engine { struct utouch_surface *surface; struct utouch_frame **frames; struct utouch_frame *next; + int *evmap; }; #endif diff --git a/src/frame-xi2.c b/src/frame-xi2.c index 635a346..5edf9ce 100644 --- a/src/frame-xi2.c +++ b/src/frame-xi2.c @@ -18,14 +18,15 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. * ****************************************************************************/ - #include <utouch/frame-xi2.h> #include "frame-impl.h" -#include <linux/input.h> +#include <stdlib.h> #include <errno.h> #include <math.h> -int utouch_frame_is_supported_xi2(const XIDeviceInfo *dev) +#include <stdio.h> + +int utouch_frame_is_supported_xi2(Display *dpy, const XIDeviceInfo *dev) { int i; @@ -37,15 +38,33 @@ int utouch_frame_is_supported_xi2(const XIDeviceInfo *dev) return 0; } +static int *create_evmap(int size) +{ + int *evmap; + + size <<= 2; + evmap = malloc(size); + if (evmap) + memset(evmap, -1, size); + + return evmap; +} + int utouch_frame_init_xi2(utouch_frame_handle fh, - const XIDeviceInfo *dev) + Display *dpy, const XIDeviceInfo *dev) { struct utouch_surface *s = fh->surface; XITouchValuatorClassInfo *v; + const char *name; float tmp; int i; - if (!utouch_frame_is_supported_xi2(dev)) + free(fh->evmap); + fh->evmap = create_evmap(dev->num_classes); + if (!fh->evmap) + return -ENOMEM; + + if (!utouch_frame_is_supported_xi2(dpy, dev)) return -ENODEV; s->phys_width = 100; @@ -58,50 +77,59 @@ int utouch_frame_init_xi2(utouch_frame_handle fh, if (dev->classes[i]->type != XITouchValuatorClass) continue; v = (void *)dev->classes[i]; - switch (v->label) { - case ABS_MT_POSITION_X: + if (v->number > i) + continue; + name = XGetAtomName(dpy, v->label); + if (!strcmp(name, "Abs MT Position X")) { + fh->evmap[v->number] = 0; s->min_x = v->min; s->max_x = v->max; if (v->resolution <= 0) break; s->phys_width = (v->max - v->min) / v->resolution; - break; - case ABS_MT_POSITION_Y: + } + if (!strcmp(name, "Abs MT Position Y")) { + fh->evmap[v->number] = 1; s->min_y = v->min; s->max_y = v->max; if (v->resolution <= 0) break; s->phys_height = (v->max - v->min) / v->resolution; - break; - case ABS_MT_TOUCH_MAJOR: + } + if (!strcmp(name, "Abs MT Touch Major")) { + fh->evmap[v->number] = 2; s->use_touch_major = 1; - break; - case ABS_MT_TOUCH_MINOR: + } + if (!strcmp(name, "Abs MT Touch Minor")) { + fh->evmap[v->number] = 3; s->use_touch_minor = 1; - break; - case ABS_MT_WIDTH_MAJOR: + } + if (!strcmp(name, "Abs MT Width Major")) { + fh->evmap[v->number] = 4; s->use_width_major = 1; - break; - case ABS_MT_WIDTH_MINOR: + } + if (!strcmp(name, "Abs MT Width Minor")) { + fh->evmap[v->number] = 5; s->use_width_minor = 1; - break; - case ABS_MT_ORIENTATION: + } + if (!strcmp(name, "Abs MT Orientation")) { + fh->evmap[v->number] = 6; s->use_orientation = 1; fh->max_orient = v->max > 0 ? v->max : 1; - break; - case ABS_MT_PRESSURE: + } + if (!strcmp(name, "Abs MT Pressure")) { + fh->evmap[v->number] = 7; s->use_pressure = 1; s->max_pressure = v->max > 0 ? v->max : 256; if (v->resolution <= 0) break; s->phys_pressure = v->max / v->resolution; - break; -#ifdef ABS_MT_DISTANCE - case ABS_MT_DISTANCE: + } + if (!strcmp(name, "Abs MT Distance")) { + fh->evmap[v->number] = 8; s->use_distance = 1; - break; -#endif } + XFree(name); } return 0; @@ -162,12 +190,6 @@ static int handle_abs_event(utouch_frame_handle fh, } } -static utouch_frame_time_t get_evtime_ms(const struct input_event *syn) -{ - static const utouch_frame_time_t ms = 1000; - return syn->time.tv_usec / ms + syn->time.tv_sec * ms; -} - static void print_deviceevent(XIDeviceEvent* event) { double *val; @@ -233,14 +255,28 @@ static void print_deviceevent(XIDeviceEvent* event) const struct utouch_frame * utouch_frame_pump_xi2(utouch_frame_handle fh, const XIDeviceEvent *ev) { - const struct utouch_frame *f = 0; + const double *value = ev->valuators.values; + const unsigned char *mask = ev->valuators.mask; + int nbyte = ev->valuators.mask_len; + int nbit = nbyte << 3; + struct utouch_contact *t; + int i; -#if 0 - if (ev->type == EV_SYN && ev->code == SYN_REPORT) - f = utouch_frame_sync(fh, get_evtime_ms(ev)); - else if (ev->type == EV_ABS) - handle_abs_event(fh, ev); -#endif + switch (ev->evtype) { + case XI_TouchBegin: + break; + case XI_TouchMotion: + break; + case XI_TouchEnd: + break; + } - return f; + for (i = 0; i < nbit; i++) { + if (!XIMaskIsSet(mask, i)) + continue; + fprintf(stderr, "%d\n", value[i]); + } + + //return utouch_frame_sync(fh, ev->time); + return 0; } diff --git a/src/frame.c b/src/frame.c index 9c4be97..1ac2e36 100644 --- a/src/frame.c +++ b/src/frame.c @@ -181,6 +181,7 @@ out: void utouch_frame_delete_engine(utouch_frame_handle fh) { + free(fh->evmap); destroy_frame(fh->next, fh->num_slots); destroy_frames(fh->frames, fh->num_frames, fh->num_slots); free(fh->surface); diff --git a/tools/Makefile.am b/tools/Makefile.am index 8c91029..772b986 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -6,10 +6,9 @@ INCLUDES=-I$(top_srcdir)/include/ AM_CFLAGS = $(XINPUT_CFLAGS) utouch_frame_test_mtdev_SOURCES = utouch-frame-test-mtdev.c -utouch_frame_test_mtdev_LDFLAGS = -L$(top_builddir)/src/.libs/ \ - -lutouch-frame -lutouch-evemu -lmtdev -lm +utouch_frame_test_mtdev_LDFLAGS = \ + -L$(top_builddir)/src/.libs/ -lutouch-frame -lutouch-evemu -lmtdev utouch_frame_test_xi2_SOURCES = utouch-frame-test-xi2.c utouch_frame_test_xi2_LDFLAGS = $(XINPUT_LIBS) $(X11_LIBS) \ - -L$(top_builddir)/src/.libs/ \ - -lutouch-frame -lutouch-evemu -lmtdev -lm + -L$(top_builddir)/src/.libs/ -lutouch-frame diff --git a/tools/utouch-frame-test-xi2.c b/tools/utouch-frame-test-xi2.c index 3351a5a..eb19eb7 100644 --- a/tools/utouch-frame-test-xi2.c +++ b/tools/utouch-frame-test-xi2.c @@ -24,7 +24,6 @@ #define MTDEV_NO_LEGACY_API -#include <X11/Xlib.h> #include <utouch/frame-xi2.h> #include <string.h> #include <stdio.h> @@ -60,7 +59,7 @@ static int init_frame(struct frame_test *test) test->fh = utouch_frame_new_engine(100, 32, 100); if (!test->fh) return -1; - return utouch_frame_init_xi2(test->fh, test->dev); + return utouch_frame_init_xi2(test->fh, test->display, test->dev); } static void destroy_all(struct frame_test *test) @@ -159,7 +158,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "error: could not describe device\n"); return -1; } - if (!utouch_frame_is_supported_xi2(test.dev)) { + if (!utouch_frame_is_supported_xi2(test.display, test.dev)) { fprintf(stderr, "error: unsupported device\n"); return -1; } |