*/
EAPI Ecore_Select_Function ecore_main_loop_select_func_get(void);
+typedef void (*Ecore_Awake_Cb)(void *data);
+
+EAPI Eina_Bool ecore_main_awake_handler_add(Ecore_Awake_Cb func, void *data);
+EAPI void ecore_main_awake_handler_del(Ecore_Awake_Cb func);
+
/**
* Request ecore to integrate GLib's main loop.
*
maxfds = (ecore_fds >= glib_fds) ? ecore_fds : glib_fds;
ret = _ecore_glib_select_original(maxfds, rfds, wfds, efds, timeout);
+ _ecore_main_fdh_mark_active(rfds, wfds, efds);
+ _ecore_main_awake_handler_call();
+
ret = _ecore_glib_context_poll_to
(_ecore_glib_fds, reqfds, rfds, wfds, efds, ret);
# endif
#endif
+static Eina_List *awake_funcs = NULL;
+
#ifndef USE_G_MAIN_LOOP
static double t1 = 0.0;
static double t2 = 0.0;
return ret;
}
+int
+_ecore_main_fdh_mark_active(fd_set *rfds, fd_set *wfds, fd_set *exfds)
+{
+ Ecore_Fd_Handler *fdh;
+ Eina_List *l;
+ int ret = 0;
+
+ if (HAVE_EPOLL && epoll_fd >= 0)
+ ret = _ecore_main_fdh_epoll_mark_active();
+ else
+ {
+ EINA_INLIST_FOREACH(fd_handlers, fdh)
+ {
+ if (!fdh->delete_me)
+ {
+ if (FD_ISSET(fdh->fd, rfds))
+ fdh->read_active = EINA_TRUE;
+ if (FD_ISSET(fdh->fd, wfds))
+ fdh->write_active = EINA_TRUE;
+ if (FD_ISSET(fdh->fd, exfds))
+ fdh->error_active = EINA_TRUE;
+ _ecore_try_add_to_call_list(fdh);
+ if (fdh->read_active || fdh->write_active || fdh->error_active)
+ ret++;
+ }
+ }
+ }
+ EINA_LIST_FOREACH(file_fd_handlers, l, fdh)
+ {
+ if (!fdh->delete_me)
+ {
+ if (FD_ISSET(fdh->fd, rfds))
+ fdh->read_active = EINA_TRUE;
+ if (FD_ISSET(fdh->fd, wfds))
+ fdh->write_active = EINA_TRUE;
+ if (FD_ISSET(fdh->fd, exfds))
+ fdh->error_active = EINA_TRUE;
+ _ecore_try_add_to_call_list(fdh);
+ if (fdh->read_active || fdh->write_active || fdh->error_active)
+ ret++;
+ }
+ }
+
+ return ret;
+}
+
#ifdef USE_G_MAIN_LOOP
static inline int
return main_loop_select;
}
+EAPI Eina_Bool
+ecore_main_awake_handler_add(Ecore_Awake_Cb func, void *data)
+{
+ Ecore_Awake_Handler *handler;
+
+ if (!func) return EINA_FALSE;
+
+ handler = calloc(1, sizeof *handler);
+ if (!handler) return EINA_FALSE;
+
+ handler->func = func;
+ handler->data = (void*)data;
+ awake_funcs = eina_list_append(awake_funcs, handler);
+
+ return EINA_TRUE;
+}
+
+EAPI void
+ecore_main_awake_handler_del(Ecore_Awake_Cb func)
+{
+ Ecore_Awake_Handler *handler;
+ Eina_List *l, *ll;
+
+ if (!func) return;
+
+ EINA_LIST_FOREACH_SAFE(awake_funcs, l, ll, handler)
+ {
+ if (handler->func != func)
+ continue;
+
+ awake_funcs = eina_list_remove(awake_funcs, handler);
+ free(handler);
+ break;
+ }
+}
+
+void
+_ecore_main_awake_handler_call(void)
+{
+ Ecore_Awake_Handler *handler;
+ Eina_List *l, *ll;
+
+ EINA_LIST_FOREACH_SAFE(awake_funcs, l, ll, handler)
+ {
+ if (handler->func)
+ handler->func(handler->data);
+ }
+}
+
Ecore_Fd_Handler *
_ecore_main_fd_handler_add(int fd,
Ecore_Fd_Handler_Flags flags,
fd_handlers_to_delete = eina_list_free(fd_handlers_to_delete);
if (file_fd_handlers)
file_fd_handlers = eina_list_free(file_fd_handlers);
+ if (awake_funcs)
+ awake_funcs = eina_list_free(awake_funcs);
fd_handlers_to_call = NULL;
fd_handlers_to_call_current = NULL;
}
if (ret > 0)
{
+#ifndef HAVE_GLIB
if (HAVE_EPOLL && epoll_fd >= 0)
_ecore_main_fdh_epoll_mark_active();
else
_ecore_try_add_to_call_list(fdh);
}
}
+#endif
_ecore_main_fd_handlers_cleanup();
#ifdef _WIN32
_ecore_main_win32_handlers_cleanup();
#endif
+
+#ifndef HAVE_GLIB
+ _ecore_main_awake_handler_call();
+#endif
+
return 1;
}
return 0;
double wait);
void *_ecore_pipe_del(Ecore_Pipe *p);
+typedef struct _Ecore_Awake_Handler
+{
+ EINA_INLIST;
+ Ecore_Awake_Cb func;
+ void *data;
+} Ecore_Awake_Handler;
+
+void _ecore_main_awake_handler_call(void);
+int _ecore_main_fdh_mark_active(fd_set *rfds, fd_set *wfds, fd_set *exfds);
+
Ecore_Fd_Handler *
_ecore_main_fd_handler_add(int fd,
Ecore_Fd_Handler_Flags flags,
#include <assert.h>
#include <fcntl.h>
+#include "Ecore.h"
+#include "ecore_private.h"
#include "ecore_wl_private.h"
/*
static Eina_Bool _ecore_wl_cb_idle_enterer(void *data);
static Eina_Bool _ecore_wl_cb_handle_data(void *data, Ecore_Fd_Handler *hdl);
static void _ecore_wl_cb_pre_handle_data(void *data, Ecore_Fd_Handler *hdl);
+static void _ecore_wl_cb_awake(void *data);
static void _ecore_wl_cb_handle_global(void *data, struct wl_registry *registry, unsigned int id, const char *interface, unsigned int version EINA_UNUSED);
static void _ecore_wl_cb_handle_global_remove(void *data, struct wl_registry *registry EINA_UNUSED, unsigned int id);
static Eina_Bool _ecore_wl_xkb_init(Ecore_Wl_Display *ewd);
_ecore_wl_cb_pre_handle_data,
_ecore_wl_disp);
+ ecore_main_awake_handler_add(_ecore_wl_cb_awake, _ecore_wl_disp);
+
_ecore_wl_disp->idle_enterer =
ecore_idle_enterer_add(_ecore_wl_cb_idle_enterer, _ecore_wl_disp);
_ecore_wl_events_shutdown();
_ecore_wl_window_shutdown();
+ ecore_main_awake_handler_del(_ecore_wl_cb_awake);
if (_ecore_wl_disp->fd_hdl)
ecore_main_fd_handler_del(_ecore_wl_disp->fd_hdl);
if (_ecore_wl_disp->idle_enterer)
return ECORE_CALLBACK_RENEW;
cancel_read:
- wl_display_cancel_read(ewd->wl.display);
- ewd->wl.prepare_read = EINA_FALSE;
+ if (ewd->wl.prepare_read)
+ {
+ wl_display_cancel_read(ewd->wl.display);
+ ewd->wl.prepare_read = EINA_FALSE;
+ }
return ECORE_CALLBACK_CANCEL;
}
}
static void
+_ecore_wl_cb_awake(void *data)
+{
+ Ecore_Wl_Display *ewd;
+ Ecore_Fd_Handler_Flags flags = ECORE_FD_READ|ECORE_FD_WRITE|ECORE_FD_ERROR;
+
+ if (_ecore_wl_fatal_error) return;
+ if (!(ewd = data)) return;
+ if (!ewd->wl.prepare_read) return;
+ if (ecore_main_fd_handler_active_get(_ecore_wl_disp->fd_hdl, flags))
+ return;
+
+ wl_display_cancel_read(ewd->wl.display);
+ ewd->wl.prepare_read = EINA_FALSE;
+}
+
+static void
_ecore_wl_cb_handle_global(void *data, struct wl_registry *registry, unsigned int id, const char *interface, unsigned int version)
{
Ecore_Wl_Display *ewd;