diff --git a/src/lib/ecore_wayland/Ecore_Wayland.h b/src/lib/ecore_wayland/Ecore_Wayland.h index 30545b7343..15c59405e9 100644 --- a/src/lib/ecore_wayland/Ecore_Wayland.h +++ b/src/lib/ecore_wayland/Ecore_Wayland.h @@ -120,6 +120,8 @@ struct _Ecore_Wl_Display struct wl_list outputs; struct wl_list globals; /** @since 1.7.6 */ + Eina_Bool init_done; + struct { struct xkb_context *context; @@ -366,6 +368,10 @@ struct _Ecore_Wl_Event_Interfaces_Bound Eina_Bool compositor : 1; Eina_Bool shm : 1; Eina_Bool shell : 1; + Eina_Bool output : 1; + Eina_Bool seat : 1; + Eina_Bool data_device_manager : 1; + Eina_Bool subcompositor : 1; }; /** diff --git a/src/lib/ecore_wayland/ecore_wl.c b/src/lib/ecore_wayland/ecore_wl.c index ee614e0e4b..8766834e7e 100644 --- a/src/lib/ecore_wayland/ecore_wl.c +++ b/src/lib/ecore_wayland/ecore_wl.c @@ -22,6 +22,7 @@ static void _ecore_wl_animator_callback(void *data, struct wl_callback *callback static Eina_Bool _ecore_wl_animator_window_add(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata EINA_UNUSED); static void _ecore_wl_signal_exit(void); static void _ecore_wl_signal_exit_free(void *data EINA_UNUSED, void *event); +static void _ecore_wl_init_callback(void *data, struct wl_callback *callback, uint32_t serial EINA_UNUSED); /* local variables */ static int _ecore_wl_init_count = 0; @@ -40,6 +41,11 @@ static const struct wl_callback_listener _ecore_wl_sync_listener = _ecore_wl_sync_callback }; +static const struct wl_callback_listener _ecore_wl_init_sync_listener = +{ + _ecore_wl_init_callback +}; + static const struct wl_callback_listener _ecore_wl_anim_listener = { _ecore_wl_animator_callback @@ -66,9 +72,40 @@ EAPI int ECORE_WL_EVENT_SELECTION_DATA_READY = 0; EAPI int ECORE_WL_EVENT_DATA_SOURCE_CANCELLED = 0; EAPI int ECORE_WL_EVENT_INTERFACES_BOUND = 0; +static void +_ecore_wl_init_callback(void *data, struct wl_callback *callback, uint32_t serial EINA_UNUSED) +{ + Ecore_Wl_Display *ewd = data; + Ecore_Wl_Event_Interfaces_Bound *ev; + + wl_callback_destroy(callback); + ewd->init_done = EINA_TRUE; + + if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Interfaces_Bound)))) + return; + + ev->compositor = (ewd->wl.compositor != NULL); + ev->shm = (ewd->wl.shm != NULL); + ev->shell = (ewd->wl.shell != NULL); + ev->output = (ewd->output != NULL); + ev->seat = (ewd->input != NULL); + ev->data_device_manager = (ewd->wl.data_device_manager != NULL); + ev->subcompositor = (ewd->wl.subcompositor != NULL); + + ecore_event_add(ECORE_WL_EVENT_INTERFACES_BOUND, ev, NULL, NULL); +} + +static void +_ecore_wl_init_wait(void) +{ + while (!_ecore_wl_disp->init_done) + wl_display_dispatch(_ecore_wl_disp->wl.display); +} + EAPI int ecore_wl_init(const char *name) { + struct wl_callback *callback; LOGFN(__FILE__, __LINE__, __FUNCTION__); if (++_ecore_wl_init_count != 1) return _ecore_wl_init_count; @@ -181,6 +218,10 @@ ecore_wl_init(const char *name) _ecore_wl_window_init(); _ecore_wl_events_init(); + callback = wl_display_sync(_ecore_wl_disp->wl.display); + wl_callback_add_listener(callback, &_ecore_wl_init_sync_listener, + _ecore_wl_disp); + return _ecore_wl_init_count; } @@ -212,6 +253,9 @@ EAPI struct wl_shm * ecore_wl_shm_get(void) { if (!_ecore_wl_disp) return NULL; + + _ecore_wl_init_wait(); + return _ecore_wl_disp->wl.shm; } @@ -228,6 +272,9 @@ ecore_wl_globals_get(void) { if ((!_ecore_wl_disp) || (!_ecore_wl_disp->wl.display)) return NULL; + + _ecore_wl_init_wait(); + return &(_ecore_wl_disp->globals); } @@ -236,6 +283,7 @@ ecore_wl_registry_get(void) { if ((!_ecore_wl_disp) || (!_ecore_wl_disp->wl.display)) return NULL; + return _ecore_wl_disp->wl.registry; } @@ -249,8 +297,7 @@ ecore_wl_screen_size_get(int *w, int *h) if ((!_ecore_wl_disp) || (!_ecore_wl_disp->wl.display)) return; - if (!_ecore_wl_disp->output) - ecore_wl_sync(); + _ecore_wl_init_wait(); if (!_ecore_wl_disp->output) return; @@ -545,20 +592,6 @@ _ecore_wl_cb_handle_global(void *data, struct wl_registry *registry, unsigned in ewd->wl.data_device_manager = wl_registry_bind(registry, id, &wl_data_device_manager_interface, 1); } - - if ((ewd->wl.compositor) && (ewd->wl.shm) && (ewd->wl.shell)) - { - Ecore_Wl_Event_Interfaces_Bound *ev; - - if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Interfaces_Bound)))) - return; - - ev->compositor = (ewd->wl.compositor != NULL); - ev->shm = (ewd->wl.shm != NULL); - ev->shell = (ewd->wl.shell != NULL); - - ecore_event_add(ECORE_WL_EVENT_INTERFACES_BOUND, ev, NULL, NULL); - } } static void diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c index 9959c085ed..369d7ca561 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c @@ -112,8 +112,6 @@ ecore_evas_wayland_egl_new_internal(const char *disp_name, unsigned int parent, ERR("Failed to initialize Ecore_Wayland"); return NULL; } - else if (count >= 1) - ecore_wl_display_iterate(); if (!(ee = calloc(1, sizeof(Ecore_Evas)))) { diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c index 1e77a67c20..6cf845e6ca 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c @@ -111,8 +111,6 @@ ecore_evas_wayland_shm_new_internal(const char *disp_name, unsigned int parent, ERR("Failed to initialize Ecore_Wayland"); return NULL; } - else if (count >= 1) - ecore_wl_display_iterate(); if (!(ee = calloc(1, sizeof(Ecore_Evas)))) {