summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac2
-rw-r--r--src/grail-api.c66
-rw-r--r--src/grail-impl.h1
-rw-r--r--tools/grail-gesture.c10
4 files changed, 66 insertions, 13 deletions
diff --git a/configure.ac b/configure.ac
index e8ba92a..b04766b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,7 +23,7 @@ AC_PROG_CC
23AC_PROG_INSTALL 23AC_PROG_INSTALL
24 24
25PKG_CHECK_MODULES([MTDEV], [mtdev >= 1.1]) 25PKG_CHECK_MODULES([MTDEV], [mtdev >= 1.1])
26PKG_CHECK_MODULES([EVEMU], [utouch-evemu >= 1.0]) 26PKG_CHECK_MODULES([EVEMU], [utouch-evemu >= 1.0.5])
27PKG_CHECK_MODULES([FRAME], [utouch-frame >= 1.0]) 27PKG_CHECK_MODULES([FRAME], [utouch-frame >= 1.0])
28 28
29AC_CONFIG_FILES([Makefile 29AC_CONFIG_FILES([Makefile
diff --git a/src/grail-api.c b/src/grail-api.c
index c189ee9..5a0beb4 100644
--- a/src/grail-api.c
+++ b/src/grail-api.c
@@ -43,29 +43,43 @@ void grail_filter_abs_events(struct grail *ge, int usage)
43int grail_open(struct grail *ge, int fd) 43int grail_open(struct grail *ge, int fd)
44{ 44{
45 struct grail_impl *x; 45 struct grail_impl *x;
46 struct stat fs;
46 int ret; 47 int ret;
48
49 ret = fstat(fd, &fs);
50 if (ret)
51 return ret;
52
47 x = calloc(1, sizeof(*x)); 53 x = calloc(1, sizeof(*x));
48 if (!x) 54 if (!x)
49 return -ENOMEM; 55 return -ENOMEM;
50 56
51 x->evemu = evemu_new(0); 57 if (!fs.st_rdev)
58 x->fptest = fdopen(fd, "r");
59
60 x->evemu = evemu_new(x->fptest ? "fptest" : 0);
52 if (!x->evemu) { 61 if (!x->evemu) {
53 ret = -ENOMEM; 62 ret = -ENOMEM;
54 goto freemem; 63 goto freemem;
55 } 64 }
56 ret = evemu_extract(x->evemu, fd); 65 if (x->fptest)
66 ret = evemu_read(x->evemu, x->fptest) <= 0;
67 else
68 ret = evemu_extract(x->evemu, fd);
57 if (ret) 69 if (ret)
58 goto freemem; 70 goto freemem;
59 if (!utouch_frame_is_supported_mtdev(x->evemu)) { 71 if (!utouch_frame_is_supported_mtdev(x->evemu)) {
60 ret = -ENODEV; 72 ret = -ENODEV;
61 goto freemem; 73 goto freemem;
62 } 74 }
63 x->mtdev = mtdev_new_open(fd);
64 if (!x->mtdev) {
65 ret = -ENOMEM;
66 goto freemem;
67 }
68 75
76 if (!x->fptest) {
77 x->mtdev = mtdev_new_open(fd);
78 if (!x->mtdev) {
79 ret = -ENOMEM;
80 goto freemem;
81 }
82 }
69 x->fh = utouch_frame_new_engine(DIM_FRAMES, DIM_TOUCH, FRAME_RATE); 83 x->fh = utouch_frame_new_engine(DIM_FRAMES, DIM_TOUCH, FRAME_RATE);
70 if (!x->fh) { 84 if (!x->fh) {
71 ret = -ENOMEM; 85 ret = -ENOMEM;
@@ -91,9 +105,12 @@ int grail_open(struct grail *ge, int fd)
91 freeframe: 105 freeframe:
92 utouch_frame_delete_engine(x->fh); 106 utouch_frame_delete_engine(x->fh);
93 freedev: 107 freedev:
94 mtdev_close_delete(x->mtdev); 108 if (x->mtdev)
109 mtdev_close_delete(x->mtdev);
95 freemem: 110 freemem:
96 evemu_delete(x->evemu); 111 evemu_delete(x->evemu);
112 if (x->fptest)
113 fclose(x->fptest);
97 free(x); 114 free(x);
98 ge->impl = 0; 115 ge->impl = 0;
99 return ret; 116 return ret;
@@ -105,8 +122,11 @@ void grail_close(struct grail *ge, int fd)
105 gru_destroy(ge); 122 gru_destroy(ge);
106 gin_destroy(ge); 123 gin_destroy(ge);
107 utouch_frame_delete_engine(x->fh); 124 utouch_frame_delete_engine(x->fh);
108 mtdev_close_delete(x->mtdev); 125 if (x->mtdev)
126 mtdev_close_delete(x->mtdev);
109 evemu_delete(x->evemu); 127 evemu_delete(x->evemu);
128 if (x->fptest)
129 fclose(x->fptest);
110 free(x); 130 free(x);
111 ge->impl = 0; 131 ge->impl = 0;
112} 132}
@@ -114,7 +134,11 @@ void grail_close(struct grail *ge, int fd)
114int grail_idle(struct grail *ge, int fd, int ms) 134int grail_idle(struct grail *ge, int fd, int ms)
115{ 135{
116 struct grail_impl *x = ge->impl; 136 struct grail_impl *x = ge->impl;
117 return mtdev_idle(x->mtdev, fd, ms); 137 if (x->fptest)
138 return 0;
139 if (x->mtdev)
140 return mtdev_idle(x->mtdev, fd, ms);
141 return 1;
118} 142}
119 143
120void grail_get_units(const struct grail *ge, 144void grail_get_units(const struct grail *ge,
@@ -244,12 +268,34 @@ static void grail_pump_mtdev(struct grail *ge, const struct input_event *ev)
244 } 268 }
245} 269}
246 270
271static int grail_pull_fstest(struct grail *ge, int fd)
272{
273 struct grail_impl *impl = ge->impl;
274 struct input_event ev;
275 struct timeval evtime;
276 int count = 0;
277
278 memset(&evtime, 0, sizeof(evtime));
279 while (evemu_read_event_realtime(impl->fptest, &ev, &evtime) > 0) {
280 grail_pump_mtdev(ge, &ev);
281 count++;
282 }
283
284 fclose(impl->fptest);
285 impl->fptest = 0;
286
287 return count > 0 ? count : -1;
288}
289
247int grail_pull(struct grail *ge, int fd) 290int grail_pull(struct grail *ge, int fd)
248{ 291{
249 struct grail_impl *impl = ge->impl; 292 struct grail_impl *impl = ge->impl;
250 struct input_event ev; 293 struct input_event ev;
251 int ret, count = 0; 294 int ret, count = 0;
252 295
296 if (impl->fptest)
297 return grail_pull_fstest(ge, fd);
298
253 while ((ret = mtdev_get(impl->mtdev, fd, &ev, 1)) > 0) { 299 while ((ret = mtdev_get(impl->mtdev, fd, &ev, 1)) > 0) {
254 grail_pump_mtdev(ge, &ev); 300 grail_pump_mtdev(ge, &ev);
255 count++; 301 count++;
diff --git a/src/grail-impl.h b/src/grail-impl.h
index 2c63b90..7036382 100644
--- a/src/grail-impl.h
+++ b/src/grail-impl.h
@@ -44,6 +44,7 @@ struct grail_impl {
44 int filter_abs; 44 int filter_abs;
45 int ongoing; 45 int ongoing;
46 int gesture; 46 int gesture;
47 FILE *fptest;
47}; 48};
48 49
49#endif 50#endif
diff --git a/tools/grail-gesture.c b/tools/grail-gesture.c
index 368150e..7230c3b 100644
--- a/tools/grail-gesture.c
+++ b/tools/grail-gesture.c
@@ -82,6 +82,7 @@ static void loop_device(struct grail *ge, int fd)
82int main(int argc, char *argv[]) 82int main(int argc, char *argv[])
83{ 83{
84 struct grail ge; 84 struct grail ge;
85 struct stat fs;
85 int i, fd; 86 int i, fd;
86 87
87 if (argc < 3) { 88 if (argc < 3) {
@@ -104,7 +105,11 @@ int main(int argc, char *argv[])
104 fprintf(stderr, "error: could not open device\n"); 105 fprintf(stderr, "error: could not open device\n");
105 return -1; 106 return -1;
106 } 107 }
107 if (ioctl(fd, EVIOCGRAB, 1)) { 108 if (fstat(fd, &fs)) {
109 fprintf(stderr, "error: could not stat the device\n");
110 return -1;
111 }
112 if (fs.st_rdev && ioctl(fd, EVIOCGRAB, 1)) {
108 fprintf(stderr, "error: could not grab the device\n"); 113 fprintf(stderr, "error: could not grab the device\n");
109 return -1; 114 return -1;
110 } 115 }
@@ -121,7 +126,8 @@ int main(int argc, char *argv[])
121 loop_device(&ge, fd); 126 loop_device(&ge, fd);
122 grail_close(&ge, fd); 127 grail_close(&ge, fd);
123 128
124 ioctl(fd, EVIOCGRAB, 0); 129 if (fs.st_rdev)
130 ioctl(fd, EVIOCGRAB, 0);
125 close(fd); 131 close(fd);
126 return 0; 132 return 0;
127} 133}