2009-01-13 01:20:53 -08:00
|
|
|
#ifndef _GNU_SOURCE
|
|
|
|
# define _GNU_SOURCE
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <dlfcn.h> /* dlopen,dlclose,etc */
|
|
|
|
|
2008-12-18 16:34:56 -08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "elementary_config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_EVIL
|
|
|
|
# include <Evil.h>
|
|
|
|
#endif
|
|
|
|
|
2008-09-29 23:58:56 -07:00
|
|
|
#include <Elementary.h>
|
|
|
|
#include "elm_priv.h"
|
|
|
|
|
2009-01-13 01:20:53 -08:00
|
|
|
|
2008-11-14 22:09:04 -08:00
|
|
|
static int _elm_signal_exit(void *data, int ev_type, void *ev);
|
2008-12-09 22:33:24 -08:00
|
|
|
#ifdef HAVE_ELEMENTARY_X
|
2008-11-14 22:09:04 -08:00
|
|
|
static int _elm_window_property_change(void *data, int ev_type, void *ev);
|
2008-12-09 22:33:24 -08:00
|
|
|
#endif
|
2008-11-14 22:09:04 -08:00
|
|
|
static void _elm_rescale(void);
|
|
|
|
|
2008-09-29 23:58:56 -07:00
|
|
|
char *_elm_appname = NULL;
|
|
|
|
Elm_Config *_elm_config = NULL;
|
2009-01-13 01:20:53 -08:00
|
|
|
const char *_elm_data_dir = NULL;
|
|
|
|
|
|
|
|
static Ecore_Event_Handler *_elm_event_property_change = NULL;
|
2008-12-09 22:43:21 -08:00
|
|
|
#ifdef HAVE_ELEMENTARY_X
|
2009-01-13 01:20:53 -08:00
|
|
|
static Ecore_X_Atom _elm_atom_enlightenment_scale = 0;
|
2008-12-09 22:43:21 -08:00
|
|
|
#endif
|
|
|
|
|
2008-09-29 23:58:56 -07:00
|
|
|
static int
|
|
|
|
_elm_signal_exit(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
elm_exit();
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2008-12-09 22:33:24 -08:00
|
|
|
#ifdef HAVE_ELEMENTARY_X
|
2008-11-14 22:09:04 -08:00
|
|
|
static int
|
|
|
|
_elm_window_property_change(void *data, int ev_type, void *ev)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Window_Property *event = ev;
|
|
|
|
|
|
|
|
if (event->win == ecore_x_window_root_first_get())
|
|
|
|
{
|
|
|
|
if (event->atom == _elm_atom_enlightenment_scale)
|
|
|
|
{
|
|
|
|
int val = 1000;
|
|
|
|
|
|
|
|
if (ecore_x_window_prop_card32_get(event->win,
|
|
|
|
event->atom,
|
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
double pscale;
|
|
|
|
|
|
|
|
pscale = _elm_config->scale;
|
|
|
|
if (val > 0) _elm_config->scale = (double)val / 1000.0;
|
|
|
|
if (pscale != _elm_config->scale) _elm_rescale();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
2008-12-09 22:33:24 -08:00
|
|
|
#endif
|
2008-11-14 22:09:04 -08:00
|
|
|
|
|
|
|
static void
|
|
|
|
_elm_rescale(void)
|
|
|
|
{
|
|
|
|
edje_scale_set(_elm_config->scale);
|
|
|
|
_elm_win_rescale();
|
|
|
|
}
|
|
|
|
|
2008-09-29 23:58:56 -07:00
|
|
|
EAPI void
|
|
|
|
elm_init(int argc, char **argv)
|
|
|
|
{
|
|
|
|
int i;
|
2009-01-13 01:20:53 -08:00
|
|
|
const char *elm_engine, *elm_scale, *elm_theme, *elm_prefix, *elm_data_dir;
|
|
|
|
char buf[PATH_MAX];
|
2008-09-29 23:58:56 -07:00
|
|
|
|
|
|
|
eet_init();
|
|
|
|
ecore_init();
|
|
|
|
ecore_app_args_set(argc, (const char **)argv);
|
|
|
|
ecore_file_init();
|
|
|
|
evas_init();
|
|
|
|
edje_init();
|
|
|
|
ecore_evas_init(); // FIXME: check errors
|
|
|
|
|
|
|
|
ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, _elm_signal_exit, NULL);
|
|
|
|
|
|
|
|
_elm_appname = strdup(ecore_file_file_get(argv[0]));
|
|
|
|
|
2008-12-09 22:33:24 -08:00
|
|
|
elm_engine = getenv("ELM_ENGINE");
|
|
|
|
elm_scale = getenv("ELM_SCALE");
|
2009-01-13 01:20:53 -08:00
|
|
|
elm_theme = getenv("ELM_THEME");
|
|
|
|
elm_prefix = getenv("ELM_PREFIX");
|
|
|
|
elm_data_dir = getenv("ELM_DATA_DIR");
|
2008-12-09 22:33:24 -08:00
|
|
|
|
2009-01-13 01:20:53 -08:00
|
|
|
if (!_elm_data_dir)
|
|
|
|
{
|
|
|
|
_elm_data_dir = eina_stringshare_add(elm_data_dir);
|
|
|
|
}
|
|
|
|
if (!_elm_data_dir)
|
|
|
|
{
|
|
|
|
if (elm_prefix)
|
|
|
|
{
|
|
|
|
snprintf(buf, sizeof(buf), "%s/share/elementary", elm_prefix);
|
|
|
|
_elm_data_dir = eina_stringshare_add(buf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#ifdef HAVE_DLADDR
|
|
|
|
if (!_elm_data_dir)
|
|
|
|
{
|
|
|
|
Dl_info elementary_dl;
|
|
|
|
// libelementary.so/../../share/elementary/
|
|
|
|
if (dladdr(elm_init, &elementary_dl))
|
|
|
|
{
|
|
|
|
char *dir, *dir2;
|
|
|
|
|
|
|
|
dir = ecore_file_dir_get(elementary_dl.dli_fname);
|
|
|
|
if (dir)
|
|
|
|
{
|
|
|
|
dir2 = ecore_file_dir_get(dir);
|
|
|
|
if (dir2)
|
|
|
|
{
|
|
|
|
snprintf(buf, sizeof(buf), "%s/share/elementary", dir2);
|
|
|
|
if (ecore_file_is_dir(buf))
|
|
|
|
_elm_data_dir = eina_stringshare_add(buf);
|
|
|
|
free(dir2);
|
|
|
|
}
|
|
|
|
free(dir);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
if (!_elm_data_dir)
|
|
|
|
{
|
|
|
|
_elm_data_dir = eina_stringshare_add(PACKAGE_DATA_DIR);
|
|
|
|
}
|
|
|
|
if (!_elm_data_dir)
|
|
|
|
{
|
|
|
|
_elm_data_dir = eina_stringshare_add("/");
|
|
|
|
}
|
|
|
|
|
2008-09-29 23:58:56 -07:00
|
|
|
// FIXME: actually load config
|
|
|
|
_elm_config = ELM_NEW(Elm_Config);
|
|
|
|
_elm_config->engine = ELM_SOFTWARE_X11;
|
2008-12-09 22:33:24 -08:00
|
|
|
if (elm_engine)
|
|
|
|
{
|
|
|
|
if ((!strcasecmp(elm_engine, "x11")) ||
|
|
|
|
(!strcasecmp(elm_engine, "x")) ||
|
|
|
|
(!strcasecmp(elm_engine, "software-x11")) ||
|
|
|
|
(!strcasecmp(elm_engine, "software_x11")))
|
|
|
|
_elm_config->engine = ELM_SOFTWARE_X11;
|
|
|
|
else if ((!strcasecmp(elm_engine, "x11-16")) ||
|
|
|
|
(!strcasecmp(elm_engine, "x16")) ||
|
|
|
|
(!strcasecmp(elm_engine, "software-16-x11")) ||
|
|
|
|
(!strcasecmp(elm_engine, "software_16_x11")))
|
|
|
|
_elm_config->engine = ELM_SOFTWARE_16_X11;
|
|
|
|
else if ((!strcasecmp(elm_engine, "xrender")) ||
|
|
|
|
(!strcasecmp(elm_engine, "xr")) ||
|
|
|
|
(!strcasecmp(elm_engine, "xrender-x11")) ||
|
|
|
|
(!strcasecmp(elm_engine, "xrender_x11")))
|
|
|
|
_elm_config->engine = ELM_XRENDER_X11;
|
|
|
|
else if ((!strcasecmp(elm_engine, "fb")) ||
|
|
|
|
(!strcasecmp(elm_engine, "software-fb")) ||
|
|
|
|
(!strcasecmp(elm_engine, "software_fb")))
|
|
|
|
_elm_config->engine = ELM_SOFTWARE_FB;
|
|
|
|
else if ((!strcasecmp(elm_engine, "opengl")) ||
|
|
|
|
(!strcasecmp(elm_engine, "gl")) ||
|
|
|
|
(!strcasecmp(elm_engine, "opengl-x11")) ||
|
|
|
|
(!strcasecmp(elm_engine, "opengl_x11")))
|
|
|
|
_elm_config->engine = ELM_OPENGL_X11;
|
2009-01-22 13:43:07 -08:00
|
|
|
else if ((!strcasecmp(elm_engine, "ddraw")) ||
|
|
|
|
(!strcasecmp(elm_engine, "software-ddraw")) ||
|
|
|
|
(!strcasecmp(elm_engine, "software_ddraw")))
|
|
|
|
_elm_config->engine = ELM_SOFTWARE_WIN32;
|
2009-01-10 06:48:30 -08:00
|
|
|
else if ((!strcasecmp(elm_engine, "wince-gdi")) ||
|
|
|
|
(!strcasecmp(elm_engine, "software-16-wince-gdi")) ||
|
|
|
|
(!strcasecmp(elm_engine, "software_16_wince_gdi")))
|
2008-12-18 16:34:56 -08:00
|
|
|
_elm_config->engine = ELM_SOFTWARE_16_WINCE;
|
2008-12-09 22:33:24 -08:00
|
|
|
}
|
|
|
|
|
2008-09-29 23:58:56 -07:00
|
|
|
_elm_config->thumbscroll_enable = 1;
|
|
|
|
_elm_config->thumbscroll_threshhold = 24;
|
|
|
|
_elm_config->thumbscroll_momentum_threshhold = 100.0;
|
|
|
|
_elm_config->thumbscroll_friction = 1.0;
|
|
|
|
_elm_config->scale = 1.0;
|
2008-12-09 22:33:24 -08:00
|
|
|
|
2008-11-01 20:47:45 -07:00
|
|
|
_elm_config->bgpixmap = 0;
|
2008-10-16 05:03:01 -07:00
|
|
|
_elm_config->compositing = 1;
|
2008-09-29 23:58:56 -07:00
|
|
|
|
|
|
|
if ((_elm_config->engine == ELM_SOFTWARE_X11) ||
|
|
|
|
(_elm_config->engine == ELM_SOFTWARE_16_X11) ||
|
|
|
|
(_elm_config->engine == ELM_XRENDER_X11) ||
|
2008-12-18 16:34:56 -08:00
|
|
|
(_elm_config->engine == ELM_OPENGL_X11) ||
|
2009-01-22 13:43:07 -08:00
|
|
|
(_elm_config->engine == ELM_SOFTWARE_WIN32) ||
|
2008-12-18 16:34:56 -08:00
|
|
|
(_elm_config->engine == ELM_SOFTWARE_16_WINCE))
|
2008-09-29 23:58:56 -07:00
|
|
|
{
|
2008-12-09 22:33:24 -08:00
|
|
|
#ifdef HAVE_ELEMENTARY_X
|
2008-10-07 23:38:20 -07:00
|
|
|
int val = 1000;
|
2008-09-29 23:58:56 -07:00
|
|
|
|
|
|
|
ecore_x_init(NULL);
|
2008-12-18 05:38:58 -08:00
|
|
|
if (!ecore_x_screen_is_composited(0))
|
|
|
|
_elm_config->compositing = 0;
|
2008-11-14 22:09:04 -08:00
|
|
|
_elm_atom_enlightenment_scale = ecore_x_atom_get("ENLIGHTENMENT_SCALE");
|
|
|
|
ecore_x_event_mask_set(ecore_x_window_root_first_get(),
|
|
|
|
ECORE_X_EVENT_MASK_WINDOW_PROPERTY);
|
|
|
|
_elm_event_property_change = ecore_event_handler_add
|
|
|
|
(ECORE_X_EVENT_WINDOW_PROPERTY, _elm_window_property_change, NULL);
|
2008-12-18 05:38:58 -08:00
|
|
|
/* FIXME if quickstart this happens in child */
|
2008-09-29 23:58:56 -07:00
|
|
|
if (ecore_x_window_prop_card32_get(ecore_x_window_root_first_get(),
|
2008-11-14 22:09:04 -08:00
|
|
|
_elm_atom_enlightenment_scale,
|
2008-10-07 23:38:20 -07:00
|
|
|
&val, 1) > 0)
|
|
|
|
{
|
|
|
|
if (val > 0) _elm_config->scale = (double)val / 1000.0;
|
|
|
|
}
|
2008-12-09 22:33:24 -08:00
|
|
|
#endif
|
2008-11-14 22:09:04 -08:00
|
|
|
}
|
2008-12-09 22:33:24 -08:00
|
|
|
|
|
|
|
if (elm_scale)
|
2009-01-13 01:20:53 -08:00
|
|
|
_elm_config->scale = atof(elm_scale);
|
|
|
|
|
|
|
|
if (elm_theme)
|
|
|
|
_elm_theme_parse(elm_theme);
|
|
|
|
else
|
|
|
|
_elm_theme_parse("default");
|
|
|
|
|
2008-12-18 05:38:58 -08:00
|
|
|
/* FIXME: implement quickstart below */
|
|
|
|
/* if !quickstart return
|
|
|
|
* else
|
|
|
|
* set up fast-start-fifo (in $ELM_FAST_START_FIFO)
|
|
|
|
* sit on blocking read
|
|
|
|
* read 2 bytes == length of data in bytes including nulls
|
|
|
|
* read N bytes (must be < (page_size - 2))
|
|
|
|
* format: exename\0exepath\0[arg1\0][arg2\0][...]
|
|
|
|
* dlopen exepath
|
|
|
|
* dlsym elm_main in exe
|
|
|
|
* if (elm_main ! exists)
|
|
|
|
* ecore_exe exename
|
|
|
|
* else
|
|
|
|
* fork()
|
|
|
|
* [child]
|
|
|
|
* call exit(elm_main());
|
|
|
|
* [parent]
|
|
|
|
* close x fd the nasty way (with close())
|
|
|
|
* ecore_x_shutdown()
|
|
|
|
* ecore_x_init() etc. etc. loop back to blocking on fifo read
|
|
|
|
*/
|
2008-09-29 23:58:56 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
elm_shutdown(void)
|
|
|
|
{
|
2008-10-06 18:23:49 -07:00
|
|
|
_elm_win_shutdown();
|
2008-12-09 22:33:24 -08:00
|
|
|
|
|
|
|
if ((_elm_config->engine == ELM_SOFTWARE_X11) ||
|
|
|
|
(_elm_config->engine == ELM_SOFTWARE_16_X11) ||
|
|
|
|
(_elm_config->engine == ELM_XRENDER_X11) ||
|
2008-12-18 16:34:56 -08:00
|
|
|
(_elm_config->engine == ELM_OPENGL_X11) ||
|
2009-01-22 13:43:07 -08:00
|
|
|
(_elm_config->engine == ELM_SOFTWARE_WIN32) ||
|
2008-12-18 16:34:56 -08:00
|
|
|
(_elm_config->engine == ELM_SOFTWARE_16_WINCE))
|
2008-12-09 22:33:24 -08:00
|
|
|
{
|
|
|
|
#ifdef HAVE_ELEMENTARY_X
|
|
|
|
ecore_event_handler_del(_elm_event_property_change);
|
|
|
|
_elm_event_property_change = NULL;
|
|
|
|
ecore_x_shutdown();
|
|
|
|
#endif
|
|
|
|
}
|
2009-01-13 01:20:53 -08:00
|
|
|
|
|
|
|
eina_stringshare_del(_elm_data_dir);
|
|
|
|
_elm_data_dir = NULL;
|
2008-10-06 18:23:49 -07:00
|
|
|
|
2008-09-29 23:58:56 -07:00
|
|
|
free(_elm_config);
|
|
|
|
free(_elm_appname);
|
|
|
|
ecore_evas_shutdown();
|
|
|
|
edje_shutdown();
|
|
|
|
evas_shutdown();
|
|
|
|
ecore_file_shutdown();
|
|
|
|
ecore_shutdown();
|
|
|
|
eet_shutdown();
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
elm_run(void)
|
|
|
|
{
|
|
|
|
ecore_main_loop_begin();
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
elm_exit(void)
|
|
|
|
{
|
|
|
|
ecore_main_loop_quit();
|
|
|
|
}
|