static int _ecore_wl_shutdown(Eina_Bool close);
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_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_effect_end,
};
-static void
+static void
xdg_shell_ping(void *data EINA_UNUSED, struct xdg_shell *shell, uint32_t serial)
{
xdg_shell_pong(shell, serial);
ECORE_FD_READ | ECORE_FD_WRITE | ECORE_FD_ERROR,
_ecore_wl_cb_handle_data, _ecore_wl_disp,
NULL, NULL);
+ ecore_main_fd_handler_prepare_callback_set(_ecore_wl_disp->fd_hdl,
+ _ecore_wl_cb_pre_handle_data,
+ _ecore_wl_disp);
_ecore_wl_disp->idle_enterer =
ecore_idle_enterer_add(_ecore_wl_cb_idle_enterer, _ecore_wl_disp);
EAPI void
ecore_wl_sync(void)
{
-
int ret;
if ((!_ecore_wl_disp) || (!_ecore_wl_disp->wl.display)) return;
_ecore_wl_sync_wait(_ecore_wl_disp);
_ecore_wl_fatal_error = EINA_TRUE;
_ecore_wl_signal_exit();
- return ECORE_CALLBACK_CANCEL;
+ goto cancel_read;
}
- /* wl_display_dispatch_pending(ewd->wl.display); */
-
if (ecore_main_fd_handler_active_get(hdl, ECORE_FD_READ))
- ret = wl_display_dispatch(ewd->wl.display);
+ {
+ wl_display_read_events(ewd->wl.display);
+ ret = wl_display_dispatch_pending(ewd->wl.display);
+ }
else if (ecore_main_fd_handler_active_get(hdl, ECORE_FD_WRITE))
{
ret = wl_display_flush(ewd->wl.display);
if (ret == 0)
- ecore_main_fd_handler_active_set(hdl, ECORE_FD_READ);
+ ecore_main_fd_handler_active_set(hdl, ECORE_FD_READ);
+ wl_display_cancel_read(ewd->wl.display);
}
+ else
+ goto cancel_read;
if ((ret < 0) && ((errno != EAGAIN) && (errno != EINVAL)))
{
/* raise exit signal */
_ecore_wl_signal_exit();
- return ECORE_CALLBACK_CANCEL;
+ goto cancel_read;
}
+ ewd->wl.prepare_read = EINA_FALSE;
return ECORE_CALLBACK_RENEW;
+
+cancel_read:
+ wl_display_cancel_read(ewd->wl.display);
+ ewd->wl.prepare_read = EINA_FALSE;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_ecore_wl_cb_pre_handle_data(void *data, Ecore_Fd_Handler *hdl EINA_UNUSED)
+{
+ Ecore_Wl_Display *ewd;
+
+ if (_ecore_wl_fatal_error) return;
+
+ if (!(ewd = data)) return;
+
+ if (ewd->wl.prepare_read) return;
+
+ while (wl_display_prepare_read(ewd->wl.display) != 0)
+ {
+ wl_display_dispatch_pending(ewd->wl.display);
+ }
+ wl_display_flush(ewd->wl.display);
+
+ ewd->wl.prepare_read = EINA_TRUE;
}
static void