change init done bindings.

This commit is contained in:
Rafael Antognolli 2013-10-28 14:07:25 -02:00
parent e35c7b19fb
commit b87afd1b94
4 changed files with 55 additions and 20 deletions

View File

@ -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;
};
/**

View File

@ -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

View File

@ -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))))
{

View File

@ -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))))
{