Add an idler to defer shell module loading.

Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
Chris Michael 2013-04-09 13:04:30 +01:00
parent 65fb88c773
commit e5202dc89f
1 changed files with 48 additions and 11 deletions

View File

@ -2,10 +2,11 @@
#include "e_comp_wl.h"
#include <sys/mman.h>
/* local function prototypes */
/* compositor function prototypes */
static void _e_comp_wl_cb_bind(struct wl_client *client, void *data EINA_UNUSED, unsigned int version EINA_UNUSED, unsigned int id);
static Eina_Bool _e_comp_wl_cb_read(void *data EINA_UNUSED, Ecore_Fd_Handler *hdl EINA_UNUSED);
static Eina_Bool _e_comp_wl_cb_idle(void *data EINA_UNUSED);
static Eina_Bool _e_comp_wl_cb_module_idle(void *data EINA_UNUSED);
/* compositor interface prototypes */
static void _e_comp_wl_cb_surface_create(struct wl_client *client, struct wl_resource *resource, unsigned int id);
@ -116,13 +117,6 @@ e_comp_wl_init(void)
goto err;
}
/* try to add a display socket */
if (wl_display_add_socket(_e_wl_comp->wl.display, NULL) < 0)
{
ERR("Could not add a Wayland Display socket: %m");
goto err;
}
/* init compositor signals */
wl_signal_init(&_e_wl_comp->signals.destroy);
wl_signal_init(&_e_wl_comp->signals.activate);
@ -191,7 +185,10 @@ e_comp_wl_init(void)
goto err;
}
/* TODO: module idler */
/* create basic shell interface */
/* add an idler for deferred shell module loading */
_module_ilder = ecore_idler_add(_e_comp_wl_cb_module_idle, NULL);
/* get the displays event loop */
_e_wl_comp->wl.loop = wl_display_get_event_loop(_e_wl_comp->wl.display);
@ -209,13 +206,20 @@ e_comp_wl_init(void)
/* TODO: event handlers ?? */
/* flush any pending events */
wl_event_loop_dispatch(_e_wl_comp->wl.loop, 0);
/* try to add a display socket */
if (wl_display_add_socket(_e_wl_comp->wl.display, NULL) < 0)
{
ERR("Could not add a Wayland Display socket: %m");
goto err;
}
/* return success */
return EINA_TRUE;
err:
/* remove the module idler */
if (_module_idler) ecore_idler_del(_module_idler);
#ifdef HAVE_WAYLAND_EGL
/* terminate the egl display */
if (_e_wl_comp->egl.display)
@ -290,6 +294,39 @@ _e_comp_wl_cb_idle(void *data EINA_UNUSED)
return ECORE_CALLBACK_RENEW;
}
static Eina_Bool
_e_comp_wl_cb_module_idle(void *data EINA_UNUSED)
{
E_Module *mod = NULL;
/* if we are still in the process of loading modules, then we will wait */
if (e_module_loading_get()) return ECORE_CALLBACK_RENEW;
/* try to find the shell module, and create it if not found
*
* TODO: we should have a config variable somewhere to store which
* shell we want to load (tablet, mobile, etc) */
if (!(mod = e_module_find("wl_desktop_shell")))
mod = e_module_new("wl_desktop_shell");
/* if we have the module now, load it */
if (mod)
{
e_module_enable(mod);
_idler = NULL;
/* flush any pending events
*
* NB: This advertises out any globals so it needs to be deferred
* until after the shell has been loaded */
wl_event_loop_dispatch(_e_wl_comp->wl.loop, 0);
return ECORE_CALLBACK_CANCEL;
}
return ECORE_CALLBACK_RENEW;
}
/* compositor interface functions */
static void
_e_comp_wl_cb_surface_create(struct wl_client *client, struct wl_resource *resource, unsigned int id)