summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2011-01-07 18:34:50 +0100
committerHenrik Rydberg <rydberg@euromail.se>2011-01-07 18:34:50 +0100
commit51a5b7aa634daeac4f54ad0c6d4a15555d90447d (patch)
tree99af5cb22eb0263236b502f5d1dcb9d7815dd489
parent2091bbf8356c468389948bcea81633b6fe63e351 (diff)
test
-rw-r--r--include/utouch/frame-xi2.h4
-rw-r--r--src/Makefile.am6
-rw-r--r--src/frame-impl.h1
-rw-r--r--src/frame-xi2.c116
-rw-r--r--src/frame.c1
-rw-r--r--tools/Makefile.am7
-rw-r--r--tools/utouch-frame-test-xi2.c5
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;
}