.y = -1,
.device = -1,
.slot = -1,
+ .keycode = 0,
},
.event_listener_list = NULL,
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 */
};
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));
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;
/*
}
break;
case EV_KEY:
+ DbgPrint("EV_KEY: 0x%X\n", event->value);
+ s_info.event_data.keycode = event->value;
break;
case EV_REL:
break;
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;
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;
}
}
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();
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) {
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) {
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;
if ((ret = activate_thread()) < 0) {
s_info.event_listener_list = eina_list_remove(s_info.event_listener_list, listener);
- free(listener);
+ DbgFree(listener);
}
}
} else {
if (s_info.handle < 0) {
ErrPrint("Event handler is not actiavated\n");
- free(listener);
+ DbgFree(listener);
return LB_STATUS_SUCCESS;
}
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) {
s_info.event_data.x = -1;
s_info.event_data.y = -1;
+ s_info.event_data.slot = -1;
return LB_STATUS_SUCCESS;
}