devilhorns pushed a commit to branch master.

commit e5202dc89fd3f8039034c7751390b16fa5ce7adb
Author: Chris Michael <[email protected]>
Date:   Tue Apr 9 13:04:30 2013 +0100

    Add an idler to defer shell module loading.
    
    Signed-off-by: Chris Michael <[email protected]>
---
 src/bin/e_comp_wl.c | 59 +++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 48 insertions(+), 11 deletions(-)

diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c
index f00049c..c7431ae 100644
--- a/src/bin/e_comp_wl.c
+++ b/src/bin/e_comp_wl.c
@@ -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)

-- 

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter

Reply via email to