Enlightenment CVS committal

Author  : moom
Project : e17
Module  : proto

Dir     : e17/proto/etk/src/lib


Modified Files:
        etk_engine.c etk_engine.h etk_main.c etk_main.h etk_types.h 
        etk_window.c 


Log Message:
* Clean up etk_engine.c, fix some mem leaks, and implement 
etk_engine_shutdown()


===================================================================
RCS file: /cvs/e/e17/proto/etk/src/lib/etk_engine.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- etk_engine.c        27 Jul 2006 01:27:44 -0000      1.1
+++ etk_engine.c        27 Jul 2006 16:49:35 -0000      1.2
@@ -1,3 +1,4 @@
+/** @file etk_engine.c */
 #include <stdlib.h>
 #include <string.h>
 #include <limits.h>
@@ -7,24 +8,46 @@
 #include <Ecore_File.h>
 #include <Evas.h>
 
-#include "config.h"
 #include "etk_engine.h"
 #include "etk_utils.h"
+#include "config.h"
 
-Etk_Engine *engine = NULL;
-static Evas_List *etk_engines = NULL;
+/**
+ * @addtogroup Etk_Engine
+ * @{
+ */
+ 
+#define INHERIT(func) \
+   if (!inherit_to->func) \
+      inherit_to->func = inherit_from->func;
 
+static void _etk_engine_inheritance_set(Etk_Engine *inherit_to, Etk_Engine 
*inherit_from);
+ 
+static Etk_Engine *_engine = NULL;
+static Evas_List *_loaded_engines = NULL;
+static Evas_List *_etk_engines = NULL;
+
+/**************************
+ *
+ * Implementation
+ *
+ **************************/
+ 
+/**
+ * @internal
+ * @brief Initializes the engine system
+ * @return Returns ETK_TRUE on success, ETK_FALSE on failure
+ * @warning You should not call it manually, it's called by etk_init()
+ */
 Etk_Bool etk_engine_init()
 {
-   char dir[PATH_MAX];
    char *file;
    Ecore_List *files;
    
-   snprintf(dir, sizeof(dir), "%s/%s", PACKAGE_LIB_DIR, "etk/engines");
-   if (!ecore_file_exists(dir))
-     return ETK_FALSE;
+   if (!ecore_file_exists(PACKAGE_LIB_DIR "/etk/engines"))
+      return ETK_FALSE;
    
-   files = ecore_file_ls(dir);
+   files = ecore_file_ls(PACKAGE_LIB_DIR "/etk/engines");
    if (!files || (ecore_list_nodes(files) == 0))
      return ETK_FALSE;
    
@@ -34,540 +57,639 @@
       int len;
       
       len = strlen(file);
-      if (!strncmp(file + (len - 3), ".so", 3))
+      if (len > 3 && strncmp(&file[len - 3], ".so", 3) == 0)
       {
         file[len - 3] = '\0';
-        etk_engines = evas_list_append(etk_engines, strdup(file));
+        _etk_engines = evas_list_append(_etk_engines, strdup(file));
       }
    }
+   ecore_list_destroy(files);
+   
    return ETK_TRUE;
 }
 
+/**
+ * @internal
+ * @brief Shutdowns the engine system
+ * @warning You should not call it manually, it's called by etk_shutdown()
+ */
+void etk_engine_shutdown()
+{
+   /* Shutdowns all the loaded engines */
+   while (_loaded_engines)
+   {
+      Etk_Engine *engine;
+      void *(*engine_shutdown)();   
+      char filename[PATH_MAX];
+      void *handle;
+      
+      engine = _loaded_engines->data;
+      _loaded_engines = evas_list_remove(_loaded_engines, engine);
+      
+      if (!engine->engine_name)
+         continue;
+      
+      snprintf(filename, sizeof(filename), "%s/etk/engines/%s.so", 
PACKAGE_LIB_DIR, engine->engine_name);
+      
+      if (!ecore_file_exists(filename))
+      {
+         ETK_WARNING("Etk can not find requested engine!");
+         return;
+      }
+      
+      handle = dlopen(filename, RTLD_LAZY | RTLD_GLOBAL);
+      if (!handle)
+      {
+         ETK_WARNING("Etk can not dlopen requested engine!");
+         continue;
+      }
+
+      if ((engine_shutdown = dlsym(handle, "engine_shutdown")))
+         engine_shutdown();
+      
+      dlclose(handle);
+   }
+   
+   while (_etk_engines)
+   {
+      free(_etk_engines->data);
+      _etk_engines = evas_list_remove_list(_etk_engines, _etk_engines);
+   }
+   
+   _engine = NULL;
+}
+
+/**
+ * @brief Gets the list of the available engines
+ * @return Returns the list of the available engines
+ * @warning The returned list should not be modified or freed
+ */
 Evas_List *etk_engine_list_get()
 {
-   return etk_engines;
+   return _etk_engines;
 }
 
+/**
+ * @brief Checks whether the engine exists
+ * @param engine_name the name of the engine to find
+ * @return Return ETK_TRUE if the engine exists, ETK_FALSE otherwise
+ */
 Etk_Bool etk_engine_exists(const char *engine_name)
 {
    Evas_List *l;
    
-   for(l = etk_engine_list_get(); l; l = l->next)   
-     if(!strcmp(l->data, engine_name))
-       return ETK_TRUE;
+   for (l = _etk_engines; l; l = l->next)   
+   {
+      if (strcmp(l->data, engine_name) == 0)
+         return ETK_TRUE;
+   }
 
    return ETK_FALSE;
 }
 
+/**
+ * @brief Gets the engine used by Etk
+ * @return Returns the engine used by Etk or NULL if no engine is loaded yet
+ */
+Etk_Engine *etk_engine_get()
+{
+   return _engine;
+}
+
+/**
+ * @internal
+ * @brief Loads an engine. The loaded engine will automatically become the 
engine used by Etk
+ * @param engine_name the name of the engine to load
+ * @return Returns the loaded engine, or NULL if the engine could not be loaded
+ * @warning You should not call this function yourself, etk_init() calls it 
automatically
+ */
 Etk_Engine *etk_engine_load(const char *engine_name)
 {
    Etk_Engine *engine;
-   Etk_Engine *(*engine_init)(void);   
+   Etk_Engine *(*engine_init)();   
    char filename[PATH_MAX];
    void *handle;
    
-   snprintf(filename, sizeof(filename), "%s/etk/engines/%s.so", 
-           PACKAGE_LIB_DIR, engine_name);
+   if (!engine_name)
+      return NULL;
+   
+   snprintf(filename, sizeof(filename), "%s/etk/engines/%s.so", 
PACKAGE_LIB_DIR, engine_name);
    
-   if(!ecore_file_exists(filename))
+   if (!ecore_file_exists(filename))
    {
       ETK_WARNING("Etk can not find requested engine!");
-      return ETK_FALSE;
+      return NULL;
    }
    
    handle = dlopen(filename, RTLD_LAZY | RTLD_GLOBAL);
-   if(!handle)
+   if (!handle)
    {
       ETK_WARNING("Etk can not dlopen requested engine!");
-      return ETK_FALSE;
+      return NULL;
    }
 
    engine_init = dlsym(handle, "engine_init");
-   if(!engine_init)
-     {
-       ETK_WARNING("Etk can not find an initializer for this engine!");
-       return ETK_FALSE;
-     }
+   if (!engine_init)
+   {
+      ETK_WARNING("Etk can not find an initializer for this engine!");
+      dlclose(handle);
+      return NULL;
+   }
    
-   if((engine = engine_init()) == NULL)
-     {
+   if (!(engine = engine_init()))
+   {
       ETK_WARNING("Etk can not initialize requested engine!");
-      return ETK_FALSE;
+      dlclose(handle);
+      return NULL;
    }
    
+   dlclose(handle);
+   _engine = engine;
+   
    return engine;
 }
 
-Etk_Engine *etk_engine_get()
-{
-   return engine;
-}
-
-Etk_Bool etk_engine_inherit_from(Etk_Engine *engine, const char * inherit_name)
+/**
+ * @brief Makes the engine inherit from another exising engine: the methods of 
the base engine
+ * will be used by the inheriting engine
+ * @param engine the engine which will inherit from the methods of the base 
engine
+ * @param inherit_name the name of the engine from which @a engine will inherit
+ * @return Returns ETK_TRUE on success, ETK_FALSE otherwise
+ */
+Etk_Bool etk_engine_inherit_from(Etk_Engine *engine, const char *inherit_name)
 {
-   if(etk_engine_exists(inherit_name))
-   {
-      Etk_Engine *inherit_from;
-      
-      if((inherit_from = etk_engine_load(inherit_name)) == NULL)
-       return ETK_FALSE;
-      etk_engine_inheritence_set(engine, inherit_from);
-      return ETK_TRUE;
-   }
-   return ETK_FALSE;
-}
-
-void etk_engine_inheritence_set(Etk_Engine *inherit_to, Etk_Engine 
*inherit_from)
-{
-   inherit_to->super = inherit_from;
-   
-#define INHERIT(func) \
-   if(!inherit_to->func) \
-       inherit_to->func = inherit_from->func;
-   
-   INHERIT(window_constructor);
-   INHERIT(window_destructor);
-   INHERIT(window_show);
-   INHERIT(window_hide);
-   INHERIT(window_evas_get);
-   INHERIT(window_title_set);
-   INHERIT(window_title_get);
-   INHERIT(window_wmclass_set);
-   INHERIT(window_move);
-   INHERIT(window_resize);
-   INHERIT(window_size_min_set);
-   INHERIT(window_geometry_get);
-   INHERIT(window_center_on_window);
-   INHERIT(window_move_to_mouse);
-   INHERIT(window_modal_for_window);
-   INHERIT(window_iconify);
-   INHERIT(window_deiconify);
-   INHERIT(window_is_iconified);
-   INHERIT(window_maximize);
-   INHERIT(window_unmaximize);
-   INHERIT(window_is_maximized);
-   INHERIT(window_fullscreen);
-   INHERIT(window_unfullscreen);
-   INHERIT(window_is_fullscreen);
-   INHERIT(window_raise);
-   INHERIT(window_lower);   
-   INHERIT(window_sticky_set);
-   INHERIT(window_sticky_get);
-   INHERIT(window_focus);
-   INHERIT(window_unfocus);
-   INHERIT(window_is_focused);
-   INHERIT(window_decorated_set);
-   INHERIT(window_decorated_get);
-   INHERIT(window_shaped_set);
-   INHERIT(window_shaped_get);
-   INHERIT(window_skip_taskbar_hint_set);
-   INHERIT(window_skip_taskbar_hint_get);
-   INHERIT(window_skip_pager_hint_set);
-   INHERIT(window_skip_pager_hint_get);
-   INHERIT(window_dnd_aware_set);
-   INHERIT(window_pointer_set);
-   
-   INHERIT(popup_window_constructor);
-   INHERIT(popup_window_popup_at_xy);
-   INHERIT(popup_window_popup);
-   INHERIT(popup_window_popdown);
-   INHERIT(popup_window_popped_get);
-   
-   INHERIT(drag_constructor);
-   INHERIT(drag_begin);
+   Etk_Engine *inherit_from;
    
-   INHERIT(dnd_init);
-   INHERIT(dnd_shutdown);
+   if (!engine || !inherit_name)
+      return ETK_FALSE;
    
-   INHERIT(clipboard_text_request);
-   INHERIT(clipboard_text_set);
+   if (!(inherit_from = etk_engine_load(inherit_name)))
+     return ETK_FALSE;
    
-   INHERIT(selection_text_request);
-   INHERIT(selection_text_set);
-   INHERIT(selection_clear);
+   _etk_engine_inheritance_set(engine, inherit_from);
+   return ETK_TRUE;
 }
 
+/**************************
+ *
+ * Etk Engine's methods
+ *
+ **************************/
+
 void etk_engine_window_constructor(Etk_Window *window)
 {
-   if (!engine || !engine->window_constructor)
-     return;
-   engine->window_constructor(window);
+   if (!_engine || !_engine->window_constructor)
+      return;
+   _engine->window_constructor(window);
 }
 
 void etk_engine_window_destructor(Etk_Window *window)
 {
-   if (!engine || !engine->window_destructor)
-     return;   
-   engine->window_destructor(window);
+   if (!_engine || !_engine->window_destructor)
+      return;   
+   _engine->window_destructor(window);
 }
 
 void etk_engine_window_show(Etk_Window *window)
 {
-   if (!engine || !engine->window_show)
-     return;   
-   engine->window_show(window);
+   if (!_engine || !_engine->window_show)
+      return;   
+   _engine->window_show(window);
 }
 
 void etk_engine_window_hide(Etk_Window *window)
 {
-   if (!engine || !engine->window_hide)
-     return;   
-   engine->window_hide(window);
+   if (!_engine || !_engine->window_hide)
+      return;   
+   _engine->window_hide(window);
 }
 
 Evas *etk_engine_window_evas_get(Etk_Window *window)
 {
-   if (!engine || !engine->window_evas_get)
-     return NULL;
-   return engine->window_evas_get(window);
+   if (!_engine || !_engine->window_evas_get)
+      return NULL;
+   return _engine->window_evas_get(window);
 }
 
 void etk_engine_window_title_set(Etk_Window *window, const char *title)
 {
-   if (!engine || !engine->window_title_set)
-     return;   
-   engine->window_title_set(window, title);
+   if (!_engine || !_engine->window_title_set)
+      return;   
+   _engine->window_title_set(window, title);
 }
 
 const char *etk_engine_window_title_get(Etk_Window *window)
 {
-   if (!engine || !engine->window_title_get)
-     return NULL;   
-   return engine->window_title_get(window);
+   if (!_engine || !_engine->window_title_get)
+      return NULL;   
+   return _engine->window_title_get(window);
 }
 
 void etk_engine_window_wmclass_set(Etk_Window *window, const char 
*window_name, const char *window_class)
 {
-   if (!engine || !engine->window_wmclass_set)
-     return;   
-   engine->window_wmclass_set(window, window_name, window_class);
+   if (!_engine || !_engine->window_wmclass_set)
+      return;   
+   _engine->window_wmclass_set(window, window_name, window_class);
 }
 
 void etk_engine_window_move(Etk_Window *window, int x, int y)
 {
-   if (!engine || !engine->window_move)
-     return;   
-   engine->window_move(window, x, y);
+   if (!_engine || !_engine->window_move)
+      return;   
+   _engine->window_move(window, x, y);
 }
 
 void etk_engine_window_resize(Etk_Window *window, int w, int h)
 {
-   if (!engine || !engine->window_resize)
-     return;   
-   engine->window_resize(window, w, h);
+   if (!_engine || !_engine->window_resize)
+      return;   
+   _engine->window_resize(window, w, h);
 }
 
 void etk_engine_window_size_min_set(Etk_Window *window, int w, int h)
 {
-   if (!engine || !engine->window_size_min_set)
-     return;   
-   engine->window_size_min_set(window, w, h);
+   if (!_engine || !_engine->window_size_min_set)
+      return;   
+   _engine->window_size_min_set(window, w, h);
 }
 
 void etk_engine_window_geometry_get(Etk_Window *window, int *x, int *y, int 
*w, int *h)
 {
-   if (!engine || !engine->window_geometry_get)
-     return;   
-   engine->window_geometry_get(window, x, y, w, h);
+   if (!_engine || !_engine->window_geometry_get)
+      return;   
+   _engine->window_geometry_get(window, x, y, w, h);
 }
 
 void etk_engine_window_center_on_window(Etk_Window *window_to_center, 
Etk_Window *window)
 {
-   if (!engine || !engine->window_center_on_window)
-     return;   
-   engine->window_center_on_window(window_to_center, window);
+   if (!_engine || !_engine->window_center_on_window)
+      return;   
+   _engine->window_center_on_window(window_to_center, window);
 }
 
 void etk_engine_window_move_to_mouse(Etk_Window *window)
 {
-   if (!engine || !engine->window_move_to_mouse)
-     return;   
-   engine->window_move_to_mouse(window);
+   if (!_engine || !_engine->window_move_to_mouse)
+      return;   
+   _engine->window_move_to_mouse(window);
 }
 
 void etk_engine_window_modal_for_window(Etk_Window *window_to_modal, 
Etk_Window *window)
 {
-   if (!engine || !engine->window_modal_for_window)
-     return;   
-   engine->window_modal_for_window(window_to_modal, window);
+   if (!_engine || !_engine->window_modal_for_window)
+      return;   
+   _engine->window_modal_for_window(window_to_modal, window);
 }
 
 void etk_engine_window_iconify(Etk_Window *window)
 {
-   if (!engine || !engine->window_iconify)
-     return;   
-   engine->window_iconify(window);
+   if (!_engine || !_engine->window_iconify)
+      return;   
+   _engine->window_iconify(window);
 }
 
 void etk_engine_window_deiconify(Etk_Window *window)
 {
-   if (!engine || !engine->window_deiconify)
-     return;   
-   engine->window_deiconify(window);
+   if (!_engine || !_engine->window_deiconify)
+      return;   
+   _engine->window_deiconify(window);
 }
 
 Etk_Bool etk_engine_window_is_iconified(Etk_Window *window)
 {
-   if (!engine || !engine->window_is_iconified)
-     return ETK_FALSE;
-   return engine->window_is_iconified(window);
+   if (!_engine || !_engine->window_is_iconified)
+      return ETK_FALSE;
+   return _engine->window_is_iconified(window);
 }
 
 void etk_engine_window_maximize(Etk_Window *window)
 {
-   if (!engine || !engine->window_maximize)
-     return;   
-   engine->window_maximize(window);
+   if (!_engine || !_engine->window_maximize)
+      return;   
+   _engine->window_maximize(window);
 }
 
 void etk_engine_window_unmaximize(Etk_Window *window)
 {
-   if (!engine || !engine->window_unmaximize)
-     return;   
-   engine->window_unmaximize(window);
+   if (!_engine || !_engine->window_unmaximize)
+      return;   
+   _engine->window_unmaximize(window);
 }
 
 Etk_Bool etk_engine_window_is_maximized(Etk_Window *window)
 {
-   if (!engine || !engine->window_is_maximized)
-     return ETK_FALSE;   
-   return engine->window_is_maximized(window);
+   if (!_engine || !_engine->window_is_maximized)
+      return ETK_FALSE;   
+   return _engine->window_is_maximized(window);
 }
 
 void etk_engine_window_fullscreen(Etk_Window *window)
 {
-   if (!engine || !engine->window_fullscreen)
-     return;   
-   engine->window_fullscreen(window);
+   if (!_engine || !_engine->window_fullscreen)
+      return;   
+   _engine->window_fullscreen(window);
 }
 
 void etk_engine_window_unfullscreen(Etk_Window *window)
 {
-   if (!engine || !engine->window_unfullscreen)
-     return;   
-   engine->window_unfullscreen(window);
+   if (!_engine || !_engine->window_unfullscreen)
+      return;   
+   _engine->window_unfullscreen(window);
 }
 
 Etk_Bool etk_engine_window_is_fullscreen(Etk_Window *window)
 {
-   if (!engine || !engine->window_is_fullscreen)
-     return ETK_FALSE;   
-   return engine->window_is_fullscreen(window);
+   if (!_engine || !_engine->window_is_fullscreen)
+      return ETK_FALSE;   
+   return _engine->window_is_fullscreen(window);
 }
 
 void etk_engine_window_raise(Etk_Window *window)
 {
-   if (!engine || !engine->window_raise)
-     return;   
-   engine->window_raise(window);
+   if (!_engine || !_engine->window_raise)
+      return;   
+   _engine->window_raise(window);
 }
 
 void etk_engine_window_lower(Etk_Window *window)
 {
-   if (!engine || !engine->window_lower)
-     return;   
-   engine->window_lower(window);
+   if (!_engine || !_engine->window_lower)
+      return;   
+   _engine->window_lower(window);
 }
 
 void etk_engine_window_sticky_set(Etk_Window *window, Etk_Bool on)
 {
-   if (!engine || !engine->window_sticky_set)
-     return;   
-   engine->window_sticky_set(window, on);
+   if (!_engine || !_engine->window_sticky_set)
+      return;   
+   _engine->window_sticky_set(window, on);
 }
 
 Etk_Bool etk_engine_window_sticky_get(Etk_Window *window)
 {
-   if (!engine || !engine->window_sticky_get)
-     return;   
-   return engine->window_sticky_get(window);
+   if (!_engine || !_engine->window_sticky_get)
+      return ETK_FALSE;
+   return _engine->window_sticky_get(window);
 }
 
 void etk_engine_window_focus(Etk_Window *window)
 {
-   if (!engine || !engine->window_focus)
-     return;   
-   engine->window_focus(window);
+   if (!_engine || !_engine->window_focus)
+      return;   
+   _engine->window_focus(window);
 }
 
 void etk_engine_window_unfocus(Etk_Window *window)
 {
-   if (!engine || !engine->window_unfocus)
-     return;   
-   engine->window_unfocus(window);
+   if (!_engine || !_engine->window_unfocus)
+      return;   
+   _engine->window_unfocus(window);
 }
 
 Etk_Bool etk_engine_window_is_focused(Etk_Window *window)
 {
-   if (!engine || !engine->window_is_focused)
-     return ETK_FALSE;   
-   return engine->window_is_focused(window);
+   if (!_engine || !_engine->window_is_focused)
+      return ETK_FALSE;   
+   return _engine->window_is_focused(window);
 }
 
 void etk_engine_window_decorated_set(Etk_Window *window, Etk_Bool decorated)
 {
-   if (!engine || !engine->window_decorated_set)
-     return;   
-   engine->window_decorated_set(window, decorated);
+   if (!_engine || !_engine->window_decorated_set)
+      return;   
+   _engine->window_decorated_set(window, decorated);
 }
 
 Etk_Bool etk_engine_window_decorated_get(Etk_Window *window)
 {
-   if (!engine || !engine->window_decorated_get)
-     return ETK_FALSE;   
-   return engine->window_decorated_get(window);
+   if (!_engine || !_engine->window_decorated_get)
+      return ETK_FALSE;   
+   return _engine->window_decorated_get(window);
 }
 
 void etk_engine_window_shaped_set(Etk_Window *window, Etk_Bool shaped)
 {
-   if (!engine || !engine->window_shaped_set)
-     return;   
-   engine->window_shaped_set(window, shaped);
+   if (!_engine || !_engine->window_shaped_set)
+      return;   
+   _engine->window_shaped_set(window, shaped);
 }
 
 Etk_Bool etk_engine_window_shaped_get(Etk_Window *window)
 {
-   if (!engine || !engine->window_shaped_get)
-     return ETK_FALSE;   
-   return engine->window_shaped_get(window);
+   if (!_engine || !_engine->window_shaped_get)
+      return ETK_FALSE;   
+   return _engine->window_shaped_get(window);
 }
 
 void etk_engine_window_skip_taskbar_hint_set(Etk_Window *window, Etk_Bool 
skip_taskbar_hint)
 {
-   if (!engine || !engine->window_skip_taskbar_hint_set)
-     return;   
-   engine->window_skip_taskbar_hint_set(window, skip_taskbar_hint);
+   if (!_engine || !_engine->window_skip_taskbar_hint_set)
+      return;   
+   _engine->window_skip_taskbar_hint_set(window, skip_taskbar_hint);
 }
 
 Etk_Bool etk_engine_window_skip_taskbar_hint_get(Etk_Window *window)
 {
-   if (!engine || !engine->window_skip_taskbar_hint_get)
-     return ETK_FALSE;   
-   return engine->window_skip_taskbar_hint_get(window);
+   if (!_engine || !_engine->window_skip_taskbar_hint_get)
+      return ETK_FALSE;   
+   return _engine->window_skip_taskbar_hint_get(window);
 }
 
 void etk_engine_window_skip_pager_hint_set(Etk_Window *window, Etk_Bool 
skip_pager_hint)
 {
-   if (!engine || !engine->window_skip_pager_hint_set)
-     return;   
-   engine->window_skip_pager_hint_set(window, skip_pager_hint);
+   if (!_engine || !_engine->window_skip_pager_hint_set)
+      return;   
+   _engine->window_skip_pager_hint_set(window, skip_pager_hint);
 }
 
 Etk_Bool etk_engine_window_skip_pager_hint_get(Etk_Window *window)
 {
-   if (!engine || !engine->window_skip_pager_hint_get)
-     return ETK_FALSE;   
-   return engine->window_skip_pager_hint_get(window);
+   if (!_engine || !_engine->window_skip_pager_hint_get)
+      return ETK_FALSE;   
+   return _engine->window_skip_pager_hint_get(window);
 }
 
 void etk_engine_window_dnd_aware_set(Etk_Window *window, Etk_Bool on)
 {
-   if (!engine || !engine->window_dnd_aware_set)
-     return;   
-   engine->window_dnd_aware_set(window, on);
+   if (!_engine || !_engine->window_dnd_aware_set)
+      return;   
+   _engine->window_dnd_aware_set(window, on);
 }
 
 void etk_engine_window_pointer_set(Etk_Toplevel_Widget *toplevel_widget, 
Etk_Pointer_Type pointer_type)
 {
-   if (!engine || !engine->window_pointer_set)
-     return;   
-   engine->window_pointer_set(toplevel_widget, pointer_type);
+   if (!_engine || !_engine->window_pointer_set)
+      return;   
+   _engine->window_pointer_set(toplevel_widget, pointer_type);
 }
 
 void etk_engine_popup_window_constructor(Etk_Popup_Window *popup_window)
 {
-   if (!engine || !engine->popup_window_constructor)
-     return;   
-   engine->popup_window_constructor(popup_window);
+   if (!_engine || !_engine->popup_window_constructor)
+      return;   
+   _engine->popup_window_constructor(popup_window);
 }
 
 void etk_engine_popup_window_popup_at_xy(Etk_Popup_Window *popup_window, int 
x, int y)
 {
-   if (!engine || !engine->popup_window_popup_at_xy)
-     return;   
-   engine->popup_window_popup_at_xy(popup_window, x, y);
+   if (!_engine || !_engine->popup_window_popup_at_xy)
+      return;   
+   _engine->popup_window_popup_at_xy(popup_window, x, y);
 }
 
 void etk_engine_popup_window_popup(Etk_Popup_Window *popup_window)
 {
-   if (!engine || !engine->popup_window_popup)
-     return;   
-   engine->popup_window_popup(popup_window);
+   if (!_engine || !_engine->popup_window_popup)
+      return;   
+   _engine->popup_window_popup(popup_window);
 }
 
 void etk_engine_popup_window_popdown(Etk_Popup_Window *popup_window)
 {
-   if (!engine || !engine->popup_window_popdown)
-     return;   
-   engine->popup_window_popdown(popup_window);
+   if (!_engine || !_engine->popup_window_popdown)
+      return;   
+   _engine->popup_window_popdown(popup_window);
 }
 
 Evas_List **etk_engine_popup_window_popped_get()
 {
-   if (!engine || !engine->popup_window_popped_get)
-     return NULL;   
-   return engine->popup_window_popped_get();
+   if (!_engine || !_engine->popup_window_popped_get)
+      return NULL;   
+   return _engine->popup_window_popped_get();
 }
 
 void etk_engine_drag_constructor(Etk_Drag *drag)
 {
-   if (!engine || !engine->drag_constructor)
-     return;
-   return engine->drag_constructor(drag);   
+   if (!_engine || !_engine->drag_constructor)
+      return;
+   return _engine->drag_constructor(drag);   
 }
   
 void etk_engine_drag_begin(Etk_Drag *drag)
 {
-   if (!engine || !engine->drag_begin)
-     return;
-   return engine->drag_begin(drag);
+   if (!_engine || !_engine->drag_begin)
+      return;
+   return _engine->drag_begin(drag);
 }
 
 Etk_Bool etk_engine_dnd_init()
 {
-   if (!engine || !engine->dnd_init)
-          return ETK_FALSE;
-   return engine->dnd_init();
+   if (!_engine || !_engine->dnd_init)
+           return ETK_FALSE;
+   return _engine->dnd_init();
 }
 
 void etk_engine_dnd_shutdown()
 {
-   if (!engine || !engine->dnd_shutdown)
-     return;
-   engine->dnd_shutdown();
+   if (!_engine || !_engine->dnd_shutdown)
+      return;
+   _engine->dnd_shutdown();
 }
 
 void etk_engine_clipboard_text_request(Etk_Widget *widget)
 {
-   if (!engine || !engine->clipboard_text_request)
-     return;
-   engine->clipboard_text_request(widget);
+   if (!_engine || !_engine->clipboard_text_request)
+      return;
+   _engine->clipboard_text_request(widget);
 }
 
 void etk_engine_clipboard_text_set(Etk_Widget *widget, const char *text, int 
length)
 {
-   if (!engine || !engine->clipboard_text_set)
-     return;
-   engine->clipboard_text_set(widget, text, length);
+   if (!_engine || !_engine->clipboard_text_set)
+      return;
+   _engine->clipboard_text_set(widget, text, length);
 }
 
 void etk_engine_selection_text_request(Etk_Widget *widget)
 {
-   if (!engine || !engine->clipboard_text_request)
-     return;
-   engine->selection_text_request(widget);
+   if (!_engine || !_engine->clipboard_text_request)
+      return;
+   _engine->selection_text_request(widget);
 }
 
 void etk_engine_selection_text_set(Etk_Widget *widget, const char *text, int 
length)
 {
-   if (!engine || !engine->clipboard_text_set)
-     return;
-   engine->selection_text_set(widget, text, length);
+   if (!_engine || !_engine->clipboard_text_set)
+      return;
+   _engine->selection_text_set(widget, text, length);
 }
 
 void etk_engine_selection_clear()
 {
-   if (!engine || !engine->selection_clear)
-     return;
-   engine->selection_clear();
+   if (!_engine || !_engine->selection_clear)
+      return;
+   _engine->selection_clear();
+}
+
+/**************************
+ *
+ * Private functions
+ *
+ **************************/
+
+/* Copies the methods of "inherit_from" to "inherit_to" */
+static void _etk_engine_inheritance_set(Etk_Engine *inherit_to, Etk_Engine 
*inherit_from)
+{
+   inherit_to->super = inherit_from;
+   
+   INHERIT(window_constructor);
+   INHERIT(window_destructor);
+   INHERIT(window_show);
+   INHERIT(window_hide);
+   INHERIT(window_evas_get);
+   INHERIT(window_title_set);
+   INHERIT(window_title_get);
+   INHERIT(window_wmclass_set);
+   INHERIT(window_move);
+   INHERIT(window_resize);
+   INHERIT(window_size_min_set);
+   INHERIT(window_geometry_get);
+   INHERIT(window_center_on_window);
+   INHERIT(window_move_to_mouse);
+   INHERIT(window_modal_for_window);
+   INHERIT(window_iconify);
+   INHERIT(window_deiconify);
+   INHERIT(window_is_iconified);
+   INHERIT(window_maximize);
+   INHERIT(window_unmaximize);
+   INHERIT(window_is_maximized);
+   INHERIT(window_fullscreen);
+   INHERIT(window_unfullscreen);
+   INHERIT(window_is_fullscreen);
+   INHERIT(window_raise);
+   INHERIT(window_lower);   
+   INHERIT(window_sticky_set);
+   INHERIT(window_sticky_get);
+   INHERIT(window_focus);
+   INHERIT(window_unfocus);
+   INHERIT(window_is_focused);
+   INHERIT(window_decorated_set);
+   INHERIT(window_decorated_get);
+   INHERIT(window_shaped_set);
+   INHERIT(window_shaped_get);
+   INHERIT(window_skip_taskbar_hint_set);
+   INHERIT(window_skip_taskbar_hint_get);
+   INHERIT(window_skip_pager_hint_set);
+   INHERIT(window_skip_pager_hint_get);
+   INHERIT(window_dnd_aware_set);
+   INHERIT(window_pointer_set);
+   
+   INHERIT(popup_window_constructor);
+   INHERIT(popup_window_popup_at_xy);
+   INHERIT(popup_window_popup);
+   INHERIT(popup_window_popdown);
+   INHERIT(popup_window_popped_get);
+   
+   INHERIT(drag_constructor);
+   INHERIT(drag_begin);
+   
+   INHERIT(dnd_init);
+   INHERIT(dnd_shutdown);
+   
+   INHERIT(clipboard_text_request);
+   INHERIT(clipboard_text_set);
+   
+   INHERIT(selection_text_request);
+   INHERIT(selection_text_set);
+   INHERIT(selection_clear);
 }
===================================================================
RCS file: /cvs/e/e17/proto/etk/src/lib/etk_engine.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- etk_engine.h        27 Jul 2006 01:27:44 -0000      1.1
+++ etk_engine.h        27 Jul 2006 16:49:35 -0000      1.2
@@ -1,4 +1,4 @@
-/** @file etk_engine.h.h */
+/** @file etk_engine.h */
 #ifndef _ETK_ENGINE_H_
 #define _ETK_ENGINE_H_
 
@@ -9,12 +9,12 @@
 #include "etk_widget.h"
 #include "etk_toplevel_widget.h"
 
-struct _Etk_Engine
+struct Etk_Engine
 {
    void *engine_data;
    char *engine_name;
    Etk_Engine *super;
-      
+   
    void (*window_constructor)(Etk_Window *window);
    void (*window_destructor)(Etk_Window *window);   
    void (*window_show)(Etk_Window *window);
@@ -78,12 +78,15 @@
 };
 
 Etk_Bool etk_engine_init();
+void etk_engine_shutdown();
+
 Evas_List *etk_engine_list_get();
 Etk_Bool etk_engine_exists(const char *engine_name);
-Etk_Engine *etk_engine_load(const char *engine_name);
 Etk_Engine *etk_engine_get();
+
+Etk_Engine *etk_engine_load(const char *engine_name);
+void etk_engine_unload(Etk_Engine *engine);
 Etk_Bool etk_engine_inherit_from(Etk_Engine *engine, const char * 
inherit_name);
-void etk_engine_inheritence_set(Etk_Engine *inherit_to, Etk_Engine 
*inherit_from);
 
 void etk_engine_window_constructor(Etk_Window *window);
 void etk_engine_window_destructor(Etk_Window *window);
===================================================================
RCS file: /cvs/e/e17/proto/etk/src/lib/etk_main.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -3 -r1.25 -r1.26
--- etk_main.c  27 Jul 2006 01:04:52 -0000      1.25
+++ etk_main.c  27 Jul 2006 16:49:35 -0000      1.26
@@ -8,6 +8,7 @@
 #include <Ecore_Evas.h>
 #include <Evas.h>
 #include <Edje.h>
+#include "etk_engine.h"
 #include "etk_type.h"
 #include "etk_signal.h"
 #include "etk_object.h"
@@ -18,8 +19,6 @@
 #include "etk_tooltips.h"
 #include "config.h"
 
-extern Etk_Engine *engine;
-
 /**
  * @addtogroup Etk_Main
  * @{
@@ -62,45 +61,21 @@
       ETK_WARNING("Ecore initialization failed!");
       return ETK_FALSE;
    }
-   if (!ecore_evas_init())
+   if (!edje_init())
    {
-      ETK_WARNING("Ecore_Evas initialization failed!");
+      ETK_WARNING("Edje initialization failed!");
       return ETK_FALSE;
    }
-#if HAVE_ECORE_X   
-   if (!ecore_x_init(NULL))
+   if (!etk_engine_init())
    {
-      ETK_WARNING("Ecore_X initialization failed!");
+      ETK_WARNING("Etk_Engine initialization failed!");
       return ETK_FALSE;
    }
-#endif   
-   if (!edje_init())
+   if (!etk_engine_load(engine_name))
    {
-      ETK_WARNING("Edje initialization failed!");
+      ETK_WARNING("Etk can not load the requested engine!");
       return ETK_FALSE;
    }
-   
-   if(!etk_engine_init())
-   {
-      ETK_WARNING("Etk_Engine initialization failed!");
-      return ETK_FALSE;
-   }   
-         
-   if(etk_engine_exists(engine_name))
-   {
-      engine = etk_engine_load(engine_name);
-      if(!engine)
-      {
-        ETK_WARNING("Etk can not load requested engine!");
-        return ETK_FALSE;
-      }
-   }
-   else
-   {
-      ETK_WARNING("Etk can not load requested engine!");
-      return ETK_FALSE;      
-   }   
-   
    if (!etk_dnd_init())
    {
       ETK_WARNING("Etk_dnd initialization failed!");
@@ -135,8 +110,8 @@
    etk_theme_shutdown();
    etk_tooltips_shutdown();
    etk_dnd_shutdown();
+   etk_engine_shutdown();
    edje_shutdown();
-   ecore_evas_shutdown();
    ecore_shutdown();
    evas_shutdown();
    _etk_main_toplevel_widgets = evas_list_free(_etk_main_toplevel_widgets);
===================================================================
RCS file: /cvs/e/e17/proto/etk/src/lib/etk_main.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -3 -r1.4 -r1.5
--- etk_main.h  27 Jul 2006 01:04:52 -0000      1.4
+++ etk_main.h  27 Jul 2006 16:49:35 -0000      1.5
@@ -4,7 +4,7 @@
 
 #include <Evas.h>
 #include "etk_types.h"
-#include "etk_engine.h"
+
 /**
  * @defgroup Etk_Main The main functions of Etk
  * @brief The main functions of Etk, used to initialize or shutdown Etk, or to 
control the main loop
===================================================================
RCS file: /cvs/e/e17/proto/etk/src/lib/etk_types.h,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -3 -r1.48 -r1.49
--- etk_types.h 27 Jul 2006 01:04:52 -0000      1.48
+++ etk_types.h 27 Jul 2006 16:49:35 -0000      1.49
@@ -46,6 +46,7 @@
 typedef struct Etk_Dialog Etk_Dialog;
 typedef struct _Etk_Drag Etk_Drag;
 typedef struct Etk_Embed Etk_Embed;
+typedef struct Etk_Engine Etk_Engine;
 typedef struct _Etk_Entry Etk_Entry;
 typedef struct _Etk_Event_Key_Up_Down Etk_Event_Key_Up_Down;
 typedef struct _Etk_Event_Mouse_In_Out Etk_Event_Mouse_In_Out;
@@ -107,9 +108,18 @@
 typedef struct _Etk_Viewport Etk_Viewport;
 typedef struct _Etk_Widget Etk_Widget;
 typedef struct _Etk_Window Etk_Window;
-typedef struct _Etk_Engine Etk_Engine;
 
 typedef Etk_Engine *(*Etk_Engine_Constructor)(void);
+
+/**
+ * @struct Etk_Position
+ * @brief The structure of a position
+ */
+typedef struct Etk_Position
+{
+   int x;       /**< The x component */
+   int y;       /**< The y component */
+} Etk_Position;
 
 /**
  * @struct Etk_Size
===================================================================
RCS file: /cvs/e/e17/proto/etk/src/lib/etk_window.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -3 -r1.27 -r1.28
--- etk_window.c        27 Jul 2006 16:28:01 -0000      1.27
+++ etk_window.c        27 Jul 2006 16:49:35 -0000      1.28
@@ -3,11 +3,11 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "config.h"
-#include "etk_main.h"
+#include "etk_engine.h"
 #include "etk_utils.h"
 #include "etk_signal.h"
 #include "etk_signal_callback.h"
+#include "config.h"
 
 /**
  * @addtogroup Etk_Window



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to