antognolli pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=b87afd1b943b260c92f8493647b7d9cae327656e

commit b87afd1b943b260c92f8493647b7d9cae327656e
Author: Rafael Antognolli <rafael.antogno...@intel.com>
Date:   Mon Oct 28 14:07:25 2013 -0200

    change init done bindings.
---
 src/lib/ecore_wayland/Ecore_Wayland.h              |  6 ++
 src/lib/ecore_wayland/ecore_wl.c                   | 65 ++++++++++++++++------
 .../engines/wayland/ecore_evas_wayland_egl.c       |  2 -
 .../engines/wayland/ecore_evas_wayland_shm.c       |  2 -
 4 files changed, 55 insertions(+), 20 deletions(-)

diff --git a/src/lib/ecore_wayland/Ecore_Wayland.h 
b/src/lib/ecore_wayland/Ecore_Wayland.h
index 30545b7..15c5940 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 ee614e0..8766834 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 9959c08..369d7ca 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 1e77a67..6cf845e 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))))
      {

-- 


Reply via email to