11 #include <linux/input.h>
22 #define CRITICAL_SECTION_BEGIN(lock) do { \
24 ret = pthread_mutex_lock(&lock); \
26 ErrPrint("Unable to get lock: %s\n", strerror(ret)); \
30 #define CRITICAL_SECTION_END(lock) do { \
32 ret = pthread_mutex_unlock(&lock); \
34 ErrPrint("Unable to unlock: %s\n", strerror(ret)); \
38 #define CANCEL_SECTION_BEGIN() do { \
40 ret = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); \
42 ErrPrint("Unable to set cancelate state: %s\n", strerror(ret)); \
45 #define CANCEL_SECTION_END() do { \
47 ret = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); \
49 ErrPrint("Unable to set cancelate state: %s\n", strerror(ret)); \
60 Eina_List *event_list;
62 pthread_mutex_t event_list_lock;
64 Ecore_Fd_Handler *event_handler;
66 int (*event_cb)(enum event_state state, struct event_data *event, void *data);
69 enum event_state event_state;
70 struct event_data event_data;
77 .event_handler = NULL,
82 .event_state = EVENT_STATE_DEACTIVATE,
91 HAPI int event_init(void)
94 ret = pthread_mutex_init(&s_info.event_list_lock, NULL);
96 ErrPrint("Mutex: %s\n", strerror(ret));
102 HAPI int event_fini(void)
105 ret = pthread_mutex_destroy(&s_info.event_list_lock);
107 ErrPrint("Mutex destroy failed: %s\n", strerror(ret));
111 static inline int processing_input_event(struct input_event *event)
113 struct event_data *item;
115 switch (event->type) {
117 switch (event->code) {
119 if (s_info.event_data.x < 0 || s_info.event_data.y < 0) {
120 /* Waiting full event packet */
124 item = malloc(sizeof(*item));
128 memcpy(item, &s_info.event_data, sizeof(*item));
130 CRITICAL_SECTION_BEGIN(s_info.event_list_lock);
131 s_info.event_list = eina_list_append(s_info.event_list, item);
132 CRITICAL_SECTION_END(s_info.event_list_lock);
135 if (write(s_info.evt_pipe[PIPE_WRITE], &event_ch, sizeof(event_ch)) != sizeof(event_ch)) {
136 ErrPrint("Unable to send an event: %s\n", strerror(errno));
147 DbgPrint("EV_SYN, SYN_DROPPED\n");
151 DbgPrint("EV_SYN, 0x%x\n", event->code);
160 switch (event->code) {
163 case ABS_MT_POSITION_X:
164 s_info.event_data.x = event->value - s_info.x;
166 case ABS_MT_POSITION_Y:
167 s_info.event_data.y = event->value - s_info.y;
171 case ABS_MT_TRACKING_ID:
172 s_info.event_data.device = event->value;
174 case ABS_MT_TOUCH_MAJOR:
176 case ABS_MT_TOUCH_MINOR:
178 case ABS_MT_WIDTH_MAJOR:
180 case ABS_MT_WIDTH_MINOR:
183 DbgPrint("EV_ABS, 0x%x\n", event->code);
204 DbgPrint("0x%X, 0x%X\n", event->type, event->code);
211 static void *event_main(void *data)
215 struct input_event input_event;
216 char *ptr = (char *)&input_event;
220 DbgPrint("event_main initiated\n");
223 CANCEL_SECTION_BEGIN();
225 FD_SET(s_info.handle, &set);
226 ret = select(s_info.handle + 1, &set, NULL, NULL, NULL);
229 if (errno == EINTR) {
230 DbgPrint("Select receives INTR\n");
231 CANCEL_SECTION_END();
234 ErrPrint("Error: %s\n", strerror(errno));
235 CANCEL_SECTION_END();
237 } else if (ret == 0) {
238 ErrPrint("Timeout expired\n");
239 CANCEL_SECTION_END();
240 return (void *)-ETIMEDOUT;
242 CANCEL_SECTION_END();
244 if (!FD_ISSET(s_info.handle, &set)) {
245 ErrPrint("Unexpected handle is toggled\n");
250 readsize = read(s_info.handle, ptr + offset, sizeof(input_event) - offset);
252 ErrPrint("Unable to read device: %s / fd: %d / offset: %d / size: %d - %d\n", strerror(errno), s_info.handle, offset, sizeof(input_event), readsize);
258 if (offset == sizeof(input_event)) {
260 if (processing_input_event(&input_event) < 0) {
270 static Eina_Bool event_read_cb(void *data, Ecore_Fd_Handler *handler)
273 struct event_data *item;
276 fd = ecore_main_fd_handler_fd_get(handler);
278 ErrPrint("Invalid fd\n");
279 return ECORE_CALLBACK_CANCEL;
282 if (read(fd, &event_ch, sizeof(event_ch)) != sizeof(event_ch)) {
283 ErrPrint("Unable to read event ch: %s\n", strerror(errno));
284 return ECORE_CALLBACK_CANCEL;
287 CRITICAL_SECTION_BEGIN(s_info.event_list_lock);
288 item = eina_list_nth(s_info.event_list, 0);
290 s_info.event_list = eina_list_remove(s_info.event_list, item);
292 ErrPrint("Unable to get event\n");
293 CRITICAL_SECTION_END(s_info.event_list_lock);
295 if (item && s_info.event_cb) {
296 switch (s_info.event_state) {
297 case EVENT_STATE_DEACTIVATE:
298 s_info.event_state = EVENT_STATE_ACTIVATE;
300 case EVENT_STATE_ACTIVATE:
301 s_info.event_state = EVENT_STATE_ACTIVATED;
303 case EVENT_STATE_ACTIVATED:
307 s_info.event_cb(s_info.event_state, item, s_info.cbdata);
311 return ECORE_CALLBACK_RENEW;
314 HAPI int event_activate(int x, int y, int (*event_cb)(enum event_state state, struct event_data *event, void *data), void *data)
318 if (s_info.handle >= 0) {
319 DbgPrint("Already activated\n");
323 s_info.handle = open(INPUT_PATH, O_RDONLY);
324 if (s_info.handle < 0) {
325 ErrPrint("Unable to access the device: %s\n", strerror(errno));
329 if (fcntl(s_info.handle, F_SETFD, FD_CLOEXEC) < 0)
330 ErrPrint("Error: %s\n", strerror(errno));
332 if (fcntl(s_info.handle, F_SETFL, O_NONBLOCK) < 0)
333 ErrPrint("Error: %s\n", strerror(errno));
335 status = pipe2(s_info.evt_pipe, O_NONBLOCK | O_CLOEXEC);
337 ErrPrint("Unable to prepare evt pipe: %s\n", strerror(errno));
338 if (close(s_info.handle) < 0)
339 ErrPrint("Failed to close handle: %s\n", strerror(errno));
344 s_info.event_handler = ecore_main_fd_handler_add(s_info.evt_pipe[PIPE_READ], ECORE_FD_READ, event_read_cb, NULL, NULL, NULL);
345 if (!s_info.event_handler) {
346 if (close(s_info.handle) < 0)
347 ErrPrint("Failed to close handle: %s\n", strerror(errno));
349 if (close(s_info.evt_pipe[PIPE_READ]) < 0)
350 ErrPrint("Failed to close handle: %s\n", strerror(errno));
352 if (close(s_info.evt_pipe[PIPE_WRITE]) < 0)
353 ErrPrint("Failed to close handle: %s\n", strerror(errno));
359 status = pthread_create(&s_info.tid, NULL, event_main, NULL);
361 ErrPrint("Failed to initiate the thread: %s\n", strerror(status));
362 ecore_main_fd_handler_del(s_info.event_handler);
363 s_info.event_handler = NULL;
365 if (close(s_info.handle) < 0)
366 ErrPrint("close: %s\n", strerror(errno));
369 if (close(s_info.evt_pipe[PIPE_READ]) < 0)
370 ErrPrint("close: %s\n", strerror(errno));
372 if (close(s_info.evt_pipe[PIPE_WRITE]) < 0)
373 ErrPrint("close: %s\n", strerror(errno));
378 s_info.event_cb = event_cb;
379 s_info.cbdata = data;
383 DbgPrint("Event handler activated\n");
387 HAPI int event_deactivate(void)
390 struct event_data *event;
393 if (s_info.handle < 0) {
394 ErrPrint("Event handler is not actiavated\n");
398 status = pthread_cancel(s_info.tid);
400 ErrPrint("Failed to cacnel a thread: %s\n", strerror(errno));
402 status = pthread_join(s_info.tid, &ret);
404 ErrPrint("Failed to join a thread: %s\n", strerror(errno));
405 else if (ret == PTHREAD_CANCELED)
406 DbgPrint("Thread is canceled\n");
408 ecore_main_fd_handler_del(s_info.event_handler);
409 s_info.event_handler = NULL;
411 if (close(s_info.evt_pipe[PIPE_READ]) < 0)
412 ErrPrint("Failed to close: %s\n", strerror(errno));
414 if (close(s_info.evt_pipe[PIPE_WRITE]) < 0)
415 ErrPrint("Failed to close: %s\n", strerror(errno));
417 if (close(s_info.handle) < 0)
418 ErrPrint("Unable to release the fd: %s\n", strerror(errno));
421 DbgPrint("Event handler deactivated\n");
423 EINA_LIST_FREE(s_info.event_list, event) {
424 if (s_info.event_cb) {
425 if (s_info.event_state == EVENT_STATE_DEACTIVATE) {
426 s_info.event_state = EVENT_STATE_ACTIVATE;
427 } else if (s_info.event_state == EVENT_STATE_ACTIVATE) {
428 s_info.event_state = EVENT_STATE_ACTIVATED;
430 s_info.event_cb(s_info.event_state, event, s_info.cbdata);
435 if (s_info.event_state != EVENT_STATE_DEACTIVATE) {
436 s_info.event_state = EVENT_STATE_DEACTIVATE;
439 s_info.event_cb(s_info.event_state, &s_info.event_data, s_info.cbdata);
442 s_info.event_data.x = -1;
443 s_info.event_data.y = -1;
448 HAPI int event_is_activated(void)
450 return s_info.handle >= 0;