summaryrefslogtreecommitdiff
path: root/src/grail-api.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/grail-api.c')
-rw-r--r--src/grail-api.c66
1 files changed, 56 insertions, 10 deletions
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++;