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