diff options
| -rw-r--r-- | configure.ac | 2 | ||||
| -rw-r--r-- | src/grail-api.c | 66 | ||||
| -rw-r--r-- | src/grail-impl.h | 1 | ||||
| -rw-r--r-- | tools/grail-gesture.c | 10 |
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 | |||
| 23 | AC_PROG_INSTALL | 23 | AC_PROG_INSTALL |
| 24 | 24 | ||
| 25 | PKG_CHECK_MODULES([MTDEV], [mtdev >= 1.1]) | 25 | PKG_CHECK_MODULES([MTDEV], [mtdev >= 1.1]) |
| 26 | PKG_CHECK_MODULES([EVEMU], [utouch-evemu >= 1.0]) | 26 | PKG_CHECK_MODULES([EVEMU], [utouch-evemu >= 1.0.5]) |
| 27 | PKG_CHECK_MODULES([FRAME], [utouch-frame >= 1.0]) | 27 | PKG_CHECK_MODULES([FRAME], [utouch-frame >= 1.0]) |
| 28 | 28 | ||
| 29 | AC_CONFIG_FILES([Makefile | 29 | AC_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) | |||
| 43 | int grail_open(struct grail *ge, int fd) | 43 | int 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) | |||
| 114 | int grail_idle(struct grail *ge, int fd, int ms) | 134 | int 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 | ||
| 120 | void grail_get_units(const struct grail *ge, | 144 | void 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 | ||
| 271 | static 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 | |||
| 247 | int grail_pull(struct grail *ge, int fd) | 290 | int 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) | |||
| 82 | int main(int argc, char *argv[]) | 82 | int 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 | } |
