6 #include "ecore_private.h"
8 #include "Ecore_Evas.h"
9 #include "ecore_evas_private.h"
12 static Eina_Hash *_registered_engines = NULL;
13 static Eina_List *_engines_paths = NULL;
14 static Eina_List *_engines_available = NULL;
15 static Eina_Module *_ecore_evas_vnc = NULL;
18 # define ECORE_EVAS_ENGINE_NAME "module.dll"
20 # define ECORE_EVAS_ENGINE_NAME "module.so"
24 _ecore_evas_vnc_server_module_try_load(const char *prefix,
25 Eina_Bool use_prefix_only)
30 m = eina_module_new(prefix);
35 snprintf(path, sizeof(path), "%s/vnc_server/%s/%s", prefix,
36 MODULE_ARCH, ECORE_EVAS_ENGINE_NAME);
37 m = eina_module_new(path);
42 if (!eina_module_load(m))
45 _ecore_evas_vnc = NULL;
53 _ecore_evas_vnc_server_module_load(void)
58 return _ecore_evas_vnc;
60 #if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
61 if (getuid() == geteuid())
64 if (getenv("EFL_RUN_IN_TREE"))
66 _ecore_evas_vnc = _ecore_evas_vnc_server_module_try_load(PACKAGE_BUILD_DIR
67 "/src/modules/ecore_evas/vnc_server/.libs/"
68 ECORE_EVAS_ENGINE_NAME,
71 return _ecore_evas_vnc;
75 prefix = eina_module_symbol_path_get(_ecore_evas_vnc_server_module_load,
77 _ecore_evas_vnc = _ecore_evas_vnc_server_module_try_load(prefix, EINA_FALSE);
82 _ecore_evas_vnc = _ecore_evas_vnc_server_module_try_load(PACKAGE_LIB_DIR"/ecore_evas",
85 ERR("Could not find a valid VNC module to load!");
87 return _ecore_evas_vnc;
91 _ecore_evas_engine_load(const char *engine)
95 Eina_Module *em = NULL;
96 Eina_Bool run_in_tree;
98 EINA_SAFETY_ON_NULL_RETURN_VAL(engine, NULL);
100 em = (Eina_Module *)eina_hash_find(_registered_engines, engine);
103 run_in_tree = !!getenv("EFL_RUN_IN_TREE");
105 EINA_LIST_FOREACH(_engines_paths, l, path)
107 char tmp[PATH_MAX] = "";
109 #if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
110 if (getuid() == geteuid())
116 snprintf(tmp, sizeof(tmp), "%s/%s/.libs/%s",
117 path, engine, ECORE_EVAS_ENGINE_NAME);
118 if (stat(tmp, &st) != 0)
124 snprintf(tmp, sizeof(tmp), "%s/%s/%s/%s",
125 path, engine, MODULE_ARCH, ECORE_EVAS_ENGINE_NAME);
127 em = eina_module_new(tmp);
130 if (!eina_module_load(em))
132 eina_module_free(em);
135 if (eina_hash_add(_registered_engines, engine, em))
143 _ecore_evas_engine_init(void)
145 char *paths[2] = { NULL, NULL };
149 /* avoid freeing modules ever to avoid deferred cb symbol problems */
150 // _registered_engines = eina_hash_string_small_new(EINA_FREE_CB(eina_module_free));
151 _registered_engines = eina_hash_string_small_new(NULL);
153 #if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
154 if (getuid() == geteuid())
157 if (getenv("EFL_RUN_IN_TREE"))
160 const char mp[] = PACKAGE_BUILD_DIR"/src/modules/ecore_evas/engines/";
161 if (stat(mp, &st) == 0)
163 _engines_paths = eina_list_append(_engines_paths, strdup(mp));
169 /* 1. libecore_evas.so/../ecore_evas/engines/ */
170 paths[0] = eina_module_symbol_path_get(_ecore_evas_engine_init, "/ecore_evas/engines");
172 /* 3. PREFIX/ecore_evas/engines/ */
173 paths[1] = strdup(PACKAGE_LIB_DIR "/ecore_evas/engines");
175 paths[1] = eina_module_symbol_path_get(_ecore_evas_engine_init, "/../lib/ecore_evas/engines");
178 for (j = 0; j < ((sizeof (paths) / sizeof (char*)) - 1); ++j)
179 for (i = j + 1; i < sizeof (paths) / sizeof (char*); ++i)
180 if (paths[i] && paths[j] && !strcmp(paths[i], paths[j]))
186 for (i = 0; i < sizeof (paths) / sizeof (char*); ++i)
188 _engines_paths = eina_list_append(_engines_paths, paths[i]);
192 _ecore_evas_engine_shutdown(void)
196 /* don't free modules to avoid fn callback deferred symbol problems
197 if (_registered_engines)
199 eina_hash_free(_registered_engines);
200 _registered_engines = NULL;
204 EINA_LIST_FREE(_engines_paths, path)
207 EINA_LIST_FREE(_engines_available, path)
208 eina_stringshare_del(path);
212 _file_exists(const char *file)
215 if (!file) return EINA_FALSE;
217 if (stat(file, &st) < 0) return EINA_FALSE;
222 _ecore_evas_available_engines_get(void)
224 Eina_File_Direct_Info *info;
226 Eina_List *l = NULL, *result = NULL;
229 if (_engines_available) return _engines_available;
231 EINA_LIST_FOREACH(_engines_paths, l, path)
233 it = eina_file_direct_ls(path);
237 EINA_ITERATOR_FOREACH(it, info)
240 snprintf(tmp, sizeof (tmp), "%s/%s/" ECORE_EVAS_ENGINE_NAME,
241 info->path, MODULE_ARCH);
243 if (_file_exists(tmp))
248 EVIL_PATH_SEP_WIN32_TO_UNIX(info->path);
250 name = strrchr(info->path, '/');
252 else name = info->path;
253 #define ADDENG(x) result = eina_list_append(result, eina_stringshare_add(x))
254 if (!strcmp(name, "fb"))
256 #ifdef BUILD_ECORE_EVAS_FB
260 else if (!strcmp(name, "x"))
262 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
263 ADDENG("opengl_x11");
265 #ifdef BUILD_ECORE_EVAS_SOFTWARE_XLIB
266 ADDENG("software_x11");
269 else if (!strcmp(name, "buffer"))
271 #ifdef BUILD_ECORE_EVAS_BUFFER
274 #ifdef BUILD_ECORE_EVAS_EWS
278 else if (!strcmp(name, "cocoa"))
280 #ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
281 ADDENG("opengl_cocoa");
284 else if (!strcmp(name, "psl1ght"))
286 #ifdef BUILD_ECORE_EVAS_PSL1GHT
290 else if (!strcmp(name, "sdl"))
292 #ifdef BUILD_ECORE_EVAS_OPENGL_SDL
293 ADDENG("opengl_sdl");
295 #ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL
299 else if (!strcmp(name, "wayland"))
301 #ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
302 ADDENG("wayland_shm");
304 #ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
305 ADDENG("wayland_egl");
308 else if (!strcmp(name, "win32"))
310 #ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
311 ADDENG("software_gdi");
313 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
314 ADDENG("software_ddraw");
316 #ifdef BUILD_ECORE_EVAS_DIRECT3D
319 #ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
320 ADDENG("opengl_glew");
323 else if (!strcmp(name, "drm"))
325 #ifdef BUILD_ECORE_EVAS_DRM
328 #ifdef BUILD_ECORE_EVAS_GL_DRM
334 eina_iterator_free(it);
338 _engines_available = result;