Sync with the latest code of phone profile
[platform/framework/web/data-provider-master.git] / src / event.c
index f891e35..0604c11 100644 (file)
@@ -71,6 +71,7 @@ static struct info {
                .y = -1,
                .device = -1,
                .slot = -1,
+               .keycode = 0,
        },
 
        .event_listener_list = NULL,
@@ -83,7 +84,11 @@ struct event_listener {
 
        enum event_state state;
 
+#if defined(_USE_ECORE_TIME_GET)
+       double tv;
+#else
        struct timeval tv; /* Recording Activate / Deactivate time */
+#endif
        int x; /* RelX */
        int y; /* RelY */
 };
@@ -132,9 +137,13 @@ static inline int processing_input_event(struct input_event *event)
                        if (item) {
                                char event_ch = EVENT_CH;
 
+#if defined(_USE_ECORE_TIME_GET)
+                               s_info.event_data.tv = ecore_time_get();
+#else
                                if (gettimeofday(&s_info.event_data.tv, NULL) < 0) {
                                        ErrPrint("gettimeofday: %s\n", strerror(errno));
                                }
+#endif
 
                                memcpy(item, &s_info.event_data, sizeof(*item));
 
@@ -156,6 +165,7 @@ static inline int processing_input_event(struct input_event *event)
                        if (s_info.event_data.device < 0) {
                                s_info.event_data.x = -1;
                                s_info.event_data.y = -1;
+                               s_info.event_data.slot = -1;
                        }
                        break;
                /*
@@ -169,6 +179,8 @@ static inline int processing_input_event(struct input_event *event)
                }
                break;
        case EV_KEY:
+               DbgPrint("EV_KEY: 0x%X\n", event->value);
+               s_info.event_data.keycode = event->value;
                break;
        case EV_REL:
                break;
@@ -236,7 +248,7 @@ static inline int processing_input_event(struct input_event *event)
 static void *event_thread_main(void *data)
 {
        fd_set set;
-       int ret = 0;
+       long ret = 0;
        struct input_event input_event;
        char *ptr = (char *)&input_event;
        int offset = 0;
@@ -324,14 +336,14 @@ static inline void clear_all_listener_list(void)
                        case EVENT_STATE_DEACTIVATED:
                        default:
                                s_info.event_listener_list = eina_list_remove(s_info.event_listener_list, listener);
-                               free(listener);
+                               DbgFree(listener);
                                continue;
                        }
 
                        if (listener->event_cb(listener->state, &s_info.event_data, listener->cbdata) < 0) {
                                if (eina_list_data_find(s_info.event_listener_list, listener)) {
                                        s_info.event_listener_list = eina_list_remove(s_info.event_listener_list, listener);
-                                       free(listener);
+                                       DbgFree(listener);
                                        continue;
                                }
                        }
@@ -368,66 +380,81 @@ static Eina_Bool event_read_cb(void *data, Ecore_Fd_Handler *handler)
        item = eina_list_nth(s_info.event_list, 0);
        if (item) {
                s_info.event_list = eina_list_remove(s_info.event_list, item);
-       } else {
-               ErrPrint("Unable to get event\n");
        }
        CRITICAL_SECTION_END(&s_info.event_list_lock);
 
-       EINA_LIST_FOREACH_SAFE(s_info.event_listener_list, l, n, listener) {
-               switch (listener->state) {
-               case EVENT_STATE_ACTIVATE:
-                       if (timercmp(&listener->tv, &item->tv, >)) {
-                               /* Ignore previous events before activating this listener */
-                               continue;
-                       }
+       if (item) {
+               EINA_LIST_FOREACH_SAFE(s_info.event_listener_list, l, n, listener) {
+                       switch (listener->state) {
+                       case EVENT_STATE_ACTIVATE:
+#if defined(_USE_ECORE_TIME_GET)
+                               if (listener->tv > item->tv) {
+                                       continue;
+                               }
+#else
+                               if (timercmp(&listener->tv, &item->tv, >)) {
+                                       /* Ignore previous events before activating this listener */
+                                       continue;
+                               }
+#endif
 
-                       next_state = EVENT_STATE_ACTIVATED;
-                       cur_state = listener->state;
-                       break;
-               case EVENT_STATE_DEACTIVATE:
-                       if (timercmp(&listener->tv, &item->tv, >)) {
-                               /* Consuming all events occurred while activating this listener */
-                               cur_state = EVENT_STATE_ACTIVATED;
                                next_state = EVENT_STATE_ACTIVATED;
+                               cur_state = listener->state;
                                break;
-                       }
+                       case EVENT_STATE_DEACTIVATE:
+#if defined(_USE_ECORE_TIME_GET)
+                               if (listener->tv > item->tv) {
+                                       /* Consuming all events occurred while activating this listener */
+                                       cur_state = EVENT_STATE_ACTIVATED;
+                                       next_state = EVENT_STATE_ACTIVATED;
+                                       break;
+                               }
+#else
+                               if (timercmp(&listener->tv, &item->tv, >)) {
+                                       /* Consuming all events occurred while activating this listener */
+                                       cur_state = EVENT_STATE_ACTIVATED;
+                                       next_state = EVENT_STATE_ACTIVATED;
+                                       break;
+                               }
+#endif
 
-                       cur_state = listener->state;
-                       next_state = EVENT_STATE_DEACTIVATED;
-                       break;
-               case EVENT_STATE_ACTIVATED:
-                       cur_state = listener->state;
-                       next_state = listener->state;
-                       break;
-               case EVENT_STATE_DEACTIVATED:
-               default:
-                       /* Remove this from the list */
-                               /* Check the item again. the listener can be deleted from the callback */
-                       if (eina_list_data_find(s_info.event_listener_list, listener)) {
-                               s_info.event_listener_list = eina_list_remove(s_info.event_listener_list, listener);
-                               free(listener);
-                       }
+                               cur_state = listener->state;
+                               next_state = EVENT_STATE_DEACTIVATED;
+                               break;
+                       case EVENT_STATE_ACTIVATED:
+                               cur_state = listener->state;
+                               next_state = listener->state;
+                               break;
+                       case EVENT_STATE_DEACTIVATED:
+                       default:
+                               /* Remove this from the list */
+                                       /* Check the item again. the listener can be deleted from the callback */
+                               if (eina_list_data_find(s_info.event_listener_list, listener)) {
+                                       s_info.event_listener_list = eina_list_remove(s_info.event_listener_list, listener);
+                                       DbgFree(listener);
+                               }
 
-                       continue;
-               }
+                               continue;
+                       }
 
-               memcpy(&modified_item, item, sizeof(modified_item));
-               modified_item.x -= listener->x;
-               modified_item.y -= listener->y;
+                       memcpy(&modified_item, item, sizeof(modified_item));
+                       modified_item.x -= listener->x;
+                       modified_item.y -= listener->y;
 
-               if (listener->event_cb(cur_state, &modified_item, listener->cbdata) < 0) {
-                       if (eina_list_data_find(s_info.event_listener_list, listener)) {
-                               s_info.event_listener_list = eina_list_remove(s_info.event_listener_list, listener);
-                               free(listener);
-                               continue;
+                       if (listener->event_cb(cur_state, &modified_item, listener->cbdata) < 0) {
+                               if (eina_list_data_find(s_info.event_listener_list, listener)) {
+                                       s_info.event_listener_list = eina_list_remove(s_info.event_listener_list, listener);
+                                       DbgFree(listener);
+                                       continue;
+                               }
                        }
+
+                       listener->state = next_state;
                }
 
-               listener->state = next_state;
+               DbgFree(item);
        }
 
-       free(item);
-
        if (s_info.handle < 0 && !s_info.event_list) {
                /* This callback must has to clear all listeners in this case */
                clear_all_listener_list();
@@ -468,7 +495,7 @@ static int activate_thread(void)
                ErrPrint("Error: %s\n", strerror(errno));
        }
 
-       status = pipe2(s_info.evt_pipe, O_NONBLOCK | O_CLOEXEC);
+       status = pipe2(s_info.evt_pipe, O_CLOEXEC);
        if (status < 0) {
                ErrPrint("Unable to prepare evt pipe: %s\n", strerror(errno));
                if (close(s_info.handle) < 0) {
@@ -478,7 +505,7 @@ static int activate_thread(void)
                return LB_STATUS_ERROR_FAULT;
        }
 
-       status = pipe2(s_info.tcb_pipe, O_NONBLOCK | O_CLOEXEC);
+       status = pipe2(s_info.tcb_pipe, O_CLOEXEC);
        if (status < 0) {
                ErrPrint("Unable to prepare tcb pipe: %s\n", strerror(errno));
                if (close(s_info.handle) < 0) {
@@ -535,11 +562,15 @@ HAPI int event_activate(int x, int y, int (*event_cb)(enum event_state state, st
                return LB_STATUS_ERROR_MEMORY;
        }
 
+#if defined(_USE_ECORE_TIME_GET)
+       listener->tv = ecore_time_get();
+#else
        if (gettimeofday(&listener->tv, NULL) < 0) {
                ErrPrint("gettimeofday: %s\n", strerror(errno));
-               free(listener);
+               DbgFree(listener);
                return LB_STATUS_ERROR_FAULT;
        }
+#endif
 
        listener->event_cb = event_cb;
        listener->cbdata = data;
@@ -563,7 +594,7 @@ HAPI int event_activate(int x, int y, int (*event_cb)(enum event_state state, st
 
                        if ((ret = activate_thread()) < 0) {
                                s_info.event_listener_list = eina_list_remove(s_info.event_listener_list, listener);
-                               free(listener);
+                               DbgFree(listener);
                        }
                }
        } else {
@@ -597,7 +628,7 @@ HAPI int event_deactivate(int (*event_cb)(enum event_state state, struct event_d
 
        if (s_info.handle < 0) {
                ErrPrint("Event handler is not actiavated\n");
-               free(listener);
+               DbgFree(listener);
                return LB_STATUS_SUCCESS;
        }
 
@@ -614,7 +645,7 @@ HAPI int event_deactivate(int (*event_cb)(enum event_state state, struct event_d
        if (status != 0) {
                ErrPrint("Failed to join a thread: %s\n", strerror(errno));
        } else {
-               DbgPrint("Thread returns: %d\n", (int)ret);
+               DbgPrint("Thread returns: %p\n", ret);
        }
 
        if (close(s_info.handle) < 0) {
@@ -633,6 +664,7 @@ HAPI int event_deactivate(int (*event_cb)(enum event_state state, struct event_d
 
        s_info.event_data.x = -1;
        s_info.event_data.y = -1;
+       s_info.event_data.slot = -1;
        return LB_STATUS_SUCCESS;
 }