re-jig elm config stuff to be in its own file and modularise it a little.
authorCarsten Haitzler <raster@rasterman.com>
Fri, 7 May 2010 15:49:06 +0000 (15:49 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Fri, 7 May 2010 15:49:06 +0000 (15:49 +0000)
will be modified more soon to support x prop.

SVN revision: 48669

src/lib/Makefile.am
src/lib/elm_config.c [new file with mode: 0644]
src/lib/elm_main.c
src/lib/elm_priv.h

index 76fa6fc..f2711bf 100644 (file)
@@ -74,6 +74,7 @@ elm_flip.c \
 elm_conform.c \
 elm_mapbuf.c \
 elm_thumb.c \
+elm_config.c \
 \
 elc_anchorblock.c \
 elc_anchorview.c \
diff --git a/src/lib/elm_config.c b/src/lib/elm_config.c
new file mode 100644 (file)
index 0000000..aa53797
--- /dev/null
@@ -0,0 +1,508 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#include <Elementary.h>
+#include "elm_priv.h"
+
+Elm_Config *_elm_config = NULL;
+char *_elm_profile = NULL;
+static Eet_Data_Descriptor *_config_edd = NULL;
+static Ecore_Event_Handler *_prop_change_handler = NULL;
+#ifdef HAVE_ELEMENTARY_X
+static Ecore_X_Atom _atom_e_scale = 0;
+static Ecore_X_Atom _atom_e_finger_size = 0;
+static Ecore_X_Atom _atom_e_theme = 0;
+#endif
+
+#ifdef HAVE_ELEMENTARY_X
+static int
+_prop_change(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
+{
+   Ecore_X_Event_Window_Property *event = ev;
+
+   if (event->win == ecore_x_window_root_first_get())
+     {
+       if (event->atom == _atom_e_scale)
+         {
+            unsigned 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();
+              }
+         }
+       else if (event->atom == _atom_e_finger_size)
+         {
+            unsigned int val = 1000;
+
+            if (ecore_x_window_prop_card32_get(event->win,
+                                               event->atom,
+                                               &val, 1) > 0)
+              {
+                 int pfinger_size;
+
+                 pfinger_size = _elm_config->finger_size;
+                 _elm_config->finger_size = val;
+                 if (pfinger_size != _elm_config->finger_size) _elm_rescale();
+              }
+         }
+       else if (event->atom == _atom_e_theme)
+         {
+             char *val = NULL;
+             
+             val = ecore_x_window_prop_string_get(event->win,
+                                                  event->atom);
+            eina_stringshare_replace(&_elm_config->theme, val);
+            if (val)
+              {
+                 _elm_theme_parse(val);
+                 free(val);
+                 _elm_rescale();
+              }
+         }
+     }
+   return 1;
+}
+#endif
+
+static void
+_desc_init(void)
+{
+   Eet_Data_Descriptor_Class eddc;
+   
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Elm_Config);
+   eddc.func.str_direct_alloc = NULL;
+   eddc.func.str_direct_free = NULL;
+   
+   _config_edd = eet_data_descriptor_file_new(&eddc);
+   if (!_config_edd)
+     {
+        printf("EEEK! eet_data_descriptor_file_new() failed\n");
+        return;
+     }
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "engine", engine, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_enable", thumbscroll_enable, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_threshhold", thumbscroll_threshhold, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_momentum_threshhold", thumbscroll_momentum_threshhold, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_friction", thumbscroll_friction, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_bounce_friction", thumbscroll_bounce_friction, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "page_scroll_friction", page_scroll_friction, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "bring_in_scroll_friction", bring_in_scroll_friction, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "zoom_friction", zoom_friction, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_bounce_enable", thumbscroll_bounce_enable, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "scale", scale, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "bgpixmap", bgpixmap, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "compositing", compositing, EET_T_INT);
+   // EET_DATA_DESCRIPTOR_ADD_LIST(_config_edd, Elm_Config, "font_dirs", font_dirs, sub_edd);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "font_hinting", font_hinting, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "image_cache", image_cache, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "font_cache", font_cache, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "finger_size", finger_size, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "fps", fps, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "theme", theme, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "modules", modules, EET_T_STRING);
+}
+
+static void
+_desc_shutdown(void)
+{
+   if (!_config_edd) return;
+   eet_data_descriptor_free(_config_edd);
+   _config_edd = NULL;
+}
+
+static void
+_profile_get(void)
+{
+   Eet_File *ef = NULL;
+   const char *home = NULL;
+   char buf[PATH_MAX], *p, *s;
+   int len = 0;
+
+   _elm_profile = strdup("default");
+   
+   // if env var - use profile without question
+   s = getenv("ELM_PROFILE");
+   if (s)
+     {
+        free(_elm_profile);
+        _elm_profile = strdup(s);
+        return;
+     }
+   
+   home = getenv("HOME");
+   if (!home) home = "/";
+   
+   // usser profile
+   snprintf(buf, sizeof(buf), "%s/.elementary/config/profile.cfg", home);
+   ef = eet_open(buf, EET_FILE_MODE_READ);
+   if (ef)
+     {
+        p = eet_read(ef, "config", &len);
+        if (p)
+          {
+             free(_elm_profile);
+             _elm_profile = malloc(len + 1);
+             memcpy(_elm_profile, p, len);
+             _elm_profile[len] = 0;
+             free(p);
+          }
+        eet_close(ef);
+        if (!p) ef = NULL;
+     }
+   if (ef) return;
+   
+   // system profile
+   snprintf(buf, sizeof(buf), "%s/config/profile.cfg", _elm_data_dir);
+   ef = eet_open(buf, EET_FILE_MODE_READ);
+   if (ef)
+     {
+        p = eet_read(ef, "config", &len);
+        if (p)
+          {
+             free(_elm_profile);
+             _elm_profile = malloc(len + 1);
+             memcpy(_elm_profile, p, len);
+             _elm_profile[len] = 0;
+             free(p);
+          }
+        eet_close(ef);
+     }
+}
+
+void
+_config_load(void)
+{
+   Eet_File *ef = NULL;
+   char buf[PATH_MAX];
+   const char *home = NULL;
+   
+   home = getenv("HOME");
+   if (!home) home = "/";
+   
+   // user config
+   snprintf(buf, sizeof(buf), "%s/.elementary/config/%s/base.cfg", home, _elm_profile);
+   ef = eet_open(buf, EET_FILE_MODE_READ);
+   if (ef)
+     {
+        _elm_config = eet_data_read(ef, _config_edd, "config");
+        eet_close(ef);
+     }
+   if (_elm_config) return;
+   
+   // system config
+   snprintf(buf, sizeof(buf), "%s/config/%s/base.cfg", _elm_data_dir, _elm_profile);
+   ef = eet_open(buf, EET_FILE_MODE_READ);
+   if (ef)
+     {
+        _elm_config = eet_data_read(ef, _config_edd, "config");
+        eet_close(ef);
+     }
+   if (_elm_config) return;
+
+   // config load fail - defaults
+   _elm_config = ELM_NEW(Elm_Config);
+   _elm_config->engine = ELM_SOFTWARE_X11;
+   _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->thumbscroll_bounce_friction = 0.5;
+   _elm_config->page_scroll_friction = 0.5;
+   _elm_config->bring_in_scroll_friction = 0.5;
+   _elm_config->zoom_friction = 0.5;
+   _elm_config->thumbscroll_bounce_enable = 1;
+   _elm_config->scale = 1.0;
+   _elm_config->bgpixmap = 0;
+   _elm_config->font_hinting = 2;
+   _elm_config->font_dirs = NULL;
+   _elm_config->image_cache = 4096;
+   _elm_config->font_cache = 512;
+   _elm_config->finger_size = 40;
+   _elm_config->compositing = 1;
+   _elm_config->fps = 60.0;
+   _elm_config->theme = eina_stringshare_add("default");
+   _elm_config->modules = NULL;
+}
+
+static void
+_misc_env_get(void)
+{
+   char buf[PATH_MAX], *p, *s;
+   
+   s = getenv("ELM_ENGINE");
+   if (s)
+     {
+        if ((!strcasecmp(s, "x11")) ||
+            (!strcasecmp(s, "x")) ||
+            (!strcasecmp(s, "software-x11")) ||
+            (!strcasecmp(s, "software_x11")))
+          _elm_config->engine = ELM_SOFTWARE_X11;
+        else if ((!strcasecmp(s, "x11-16")) ||
+                 (!strcasecmp(s, "x16")) ||
+                 (!strcasecmp(s, "software-16-x11")) ||
+                 (!strcasecmp(s, "software_16_x11")))
+          _elm_config->engine = ELM_SOFTWARE_16_X11;
+        else if ((!strcasecmp(s, "xrender")) ||
+                 (!strcasecmp(s, "xr")) ||
+                 (!strcasecmp(s, "xrender-x11")) ||
+                 (!strcasecmp(s, "xrender_x11")))
+          _elm_config->engine = ELM_XRENDER_X11;
+        else if ((!strcasecmp(s, "fb")) ||
+                 (!strcasecmp(s, "software-fb")) ||
+                 (!strcasecmp(s, "software_fb")))
+          _elm_config->engine = ELM_SOFTWARE_FB;
+        else if ((!strcasecmp(s, "directfb")) ||
+                 (!strcasecmp(s, "dfb")))
+          _elm_config->engine = ELM_SOFTWARE_DIRECTFB;
+        else if ((!strcasecmp(s, "sdl")) ||
+                 (!strcasecmp(s, "software-sdl")) ||
+                 (!strcasecmp(s, "software_sdl")))
+          _elm_config->engine = ELM_SOFTWARE_SDL;
+        else if ((!strcasecmp(s, "sdl-16")) ||
+                 (!strcasecmp(s, "software-16-sdl")) ||
+                 (!strcasecmp(s, "software_16_sdl")))
+          _elm_config->engine = ELM_SOFTWARE_16_SDL;
+        else if ((!strcasecmp(s, "opengl")) ||
+                 (!strcasecmp(s, "gl")) ||
+                 (!strcasecmp(s, "opengl-x11")) ||
+                 (!strcasecmp(s, "opengl_x11")))
+          _elm_config->engine = ELM_OPENGL_X11;
+        else if ((!strcasecmp(s, "opengl-sdl")) ||
+                 (!strcasecmp(s, "opengl_sdl")) ||
+                 (!strcasecmp(s, "gl-sdl")) ||
+                 (!strcasecmp(s, "gl_sdl")))
+          _elm_config->engine = ELM_OPENGL_SDL;
+        else if ((!strcasecmp(s, "gdi")) ||
+                 (!strcasecmp(s, "software-gdi")) ||
+                 (!strcasecmp(s, "software_gdi")))
+          _elm_config->engine = ELM_SOFTWARE_WIN32;
+        else if ((!strcasecmp(s, "wince-gdi")) ||
+                 (!strcasecmp(s, "software-16-wince-gdi")) ||
+                 (!strcasecmp(s, "software_16_wince_gdi")))
+          _elm_config->engine = ELM_SOFTWARE_16_WINCE;
+     }
+
+   s = getenv("ELM_THUMBSCROLL_ENABLE");
+   if (s) _elm_config->thumbscroll_enable = atoi(s);
+   s = getenv("ELM_THUMBSCROLL_THRESHOLD");
+   if (s) _elm_config->thumbscroll_threshhold = atoi(s);
+   // FIXME: floatformat locale issues here 1.0 vs 1,0 - should just be 1.0
+   s = getenv("ELM_THUMBSCROLL_MOMENTUM_THRESHOLD");
+   if (s) _elm_config->thumbscroll_momentum_threshhold = atof(s);
+   s = getenv("ELM_THUMBSCROLL_FRICTION");
+   if (s) _elm_config->thumbscroll_friction = atof(s);
+   s = getenv("ELM_PAGE_SCROLL_FRICTION");
+   if (s) _elm_config->page_scroll_friction = atof(s);
+   s = getenv("ELM_BRING_IN_SCROLL_FRICTION");
+   if (s) _elm_config->bring_in_scroll_friction = atof(s);
+   s = getenv("ELM_ZOOM_FRICTION");
+   if (s) _elm_config->zoom_friction = atof(s);
+
+   s = getenv("ELM_THEME");
+   if (s) eina_stringshare_replace(&_elm_config->theme, s);
+   printf("theme: %s\n", _elm_config->theme);
+   _elm_theme_parse(_elm_config->theme);
+
+   s = getenv("ELM_FONT_HINTING");
+   if (s)
+     {
+       if      (!strcasecmp(s, "none"))     _elm_config->font_hinting = 0;
+       else if (!strcasecmp(s, "auto"))     _elm_config->font_hinting = 1;
+       else if (!strcasecmp(s, "bytecode")) _elm_config->font_hinting = 2;
+     }
+
+   s = getenv("ELM_FONT_PATH");
+   if (s)
+     {
+       const char *p, *pp;
+       char *buf2;
+
+        EINA_LIST_FREE(_elm_config->font_dirs, p)
+          {
+             eina_stringshare_del(p);
+          }
+        
+       buf2 = alloca(strlen(s) + 1);
+       p = s;
+       pp = p;
+       for (;;)
+         {
+            if ((*p == ':') || (*p == 0))
+              {
+                 int len;
+
+                 len = p - pp;
+                 strncpy(buf2, pp, len);
+                 buf2[len] = 0;
+                 _elm_config->font_dirs = 
+                    eina_list_append(_elm_config->font_dirs, 
+                                     eina_stringshare_add(buf2));
+                 if (*p == 0) break;
+                 p++;
+                 pp = p;
+              }
+            else
+              {
+                 if (*p == 0) break;
+                 p++;
+              }
+         }
+     }
+
+   s = getenv("ELM_IMAGE_CACHE");
+   if (s) _elm_config->image_cache = atoi(s);
+
+   s = getenv("ELM_FONT_CACHE");
+   if (s) _elm_config->font_cache = atoi(s);
+
+   s = getenv("ELM_SCALE");
+   if (s) _elm_config->scale = atof(s);
+   
+   _elm_config->finger_size = (double)_elm_config->finger_size * _elm_config->scale;
+   s = getenv("ELM_FINGER_SIZE");
+   if (s) _elm_config->finger_size = atoi(s);
+
+   s = getenv("ELM_FPS");
+   if (s) _elm_config->fps = atof(s);
+   if (_elm_config->fps < 1.0) _elm_config->fps = 1.0;
+
+   s = getenv("ELM_MODULES");
+   if (s) eina_stringshare_replace(&_elm_config->modules, s);
+   if (_elm_config->modules) _elm_module_parse(_elm_config->modules);
+}
+
+void
+_elm_config_init(void)
+{
+   _desc_init();
+   _profile_get();
+   _config_load();
+   _misc_env_get();
+
+   ecore_animator_frametime_set(1.0 / _elm_config->fps);
+   edje_frametime_set(1.0 / _elm_config->fps);
+   edje_scale_set(_elm_config->scale);
+}
+
+void
+_elm_config_sub_init(void)
+{
+   if ((_elm_config->engine == ELM_SOFTWARE_X11) ||
+       (_elm_config->engine == ELM_SOFTWARE_16_X11) ||
+       (_elm_config->engine == ELM_XRENDER_X11) ||
+       (_elm_config->engine == ELM_OPENGL_X11))
+     {
+#ifdef HAVE_ELEMENTARY_X
+       unsigned int val = 1000;
+
+       if (!ecore_x_init(NULL))
+         {
+            ERR("Cannot connect to X11 display. check $DISPLAY variable");
+            exit(1);
+         }
+       if (!ecore_x_screen_is_composited(0))
+         _elm_config->compositing = 0;
+        
+       _atom_e_scale       = ecore_x_atom_get("ENLIGHTENMENT_SCALE");
+       _atom_e_finger_size = ecore_x_atom_get("ENLIGHTENMENT_FINGER_SIZE");
+       _atom_e_theme       = ecore_x_atom_get("ENLIGHTENMENT_THEME");
+        
+       ecore_x_event_mask_set(ecore_x_window_root_first_get(),
+                              ECORE_X_EVENT_MASK_WINDOW_PROPERTY);
+       _prop_change_handler = ecore_event_handler_add
+         (ECORE_X_EVENT_WINDOW_PROPERTY, _prop_change, NULL);
+       if (!getenv("ELM_SCALE"))
+         {
+            if (ecore_x_window_prop_card32_get(ecore_x_window_root_first_get(),
+                                               _atom_e_scale,
+                                               &val, 1) > 0)
+              {
+                 if (val > 0)
+                   {
+                      _elm_config->scale = (double)val / 1000.0;
+                      // FIXME: hack until e export finger size too
+                      if (getenv("ELM_FINGER_SIZE"))
+                        _elm_config->finger_size = 40.0 * _elm_config->scale;
+                       edje_scale_set(_elm_config->scale);
+                   }
+              }
+         }
+       if (!getenv("ELM_FINGER_SIZE"))
+         {
+            if (ecore_x_window_prop_card32_get(ecore_x_window_root_first_get(),
+                                               _atom_e_finger_size,
+                                               &val, 1) > 0)
+              {
+                 if (val > 0)
+                   {
+                      _elm_config->finger_size = val;
+                   }
+              }
+         }
+       if (!getenv("ELM_THEME"))
+         {
+             char *s;
+             
+             s = ecore_x_window_prop_string_get(ecore_x_window_root_first_get(),
+                                                _atom_e_theme);
+             if (s)
+              {
+                 eina_stringshare_replace(&_elm_config->theme, s);
+                  _elm_theme_parse(s);
+                  free(s);
+              }
+         }
+#endif
+      }
+}
+
+void
+_elm_config_shutdown(void)
+{
+   if ((_elm_config->engine == ELM_SOFTWARE_X11) ||
+       (_elm_config->engine == ELM_SOFTWARE_16_X11) ||
+       (_elm_config->engine == ELM_XRENDER_X11) ||
+       (_elm_config->engine == ELM_OPENGL_X11) ||
+       (_elm_config->engine == ELM_SOFTWARE_SDL) ||
+       (_elm_config->engine == ELM_SOFTWARE_16_SDL) ||
+       (_elm_config->engine == ELM_OPENGL_SDL) ||
+       (_elm_config->engine == ELM_SOFTWARE_WIN32) ||
+       (_elm_config->engine == ELM_SOFTWARE_16_WINCE))
+     {
+#ifdef HAVE_ELEMENTARY_X
+       ecore_event_handler_del(_prop_change_handler);
+       _prop_change_handler = NULL;
+#endif
+     }
+   if (_elm_config)
+     {
+        const char *fontdir;
+        
+        EINA_LIST_FREE(_elm_config->font_dirs, fontdir)
+          {
+             eina_stringshare_del(fontdir);
+          }
+        if (_elm_config->theme) eina_stringshare_del(_elm_config->theme);
+        if (_elm_config->modules) eina_stringshare_del(_elm_config->modules);
+        free(_elm_config);
+        _elm_config = NULL;
+     }
+   if (_elm_profile)
+     {
+        free(_elm_profile);
+        _elm_profile = NULL;
+     }
+   _desc_shutdown();
+}
index c81a4a4..7220dbe 100644 (file)
@@ -263,10 +263,8 @@ static int _elm_signal_exit(void *data, int ev_type, void *ev);
 #ifdef HAVE_ELEMENTARY_X
 static int _elm_window_property_change(void *data, int ev_type, void *ev);
 #endif
-static void _elm_rescale(void);
 
 char *_elm_appname = NULL;
-Elm_Config *_elm_config = NULL;
 const char *_elm_data_dir = NULL;
 const char *_elm_lib_dir = NULL;
 int _elm_log_dom = -1;
@@ -276,12 +274,6 @@ EAPI int ELM_EVENT_POLICY_CHANGED = 0;
 static int _elm_init_count = 0;
 static int _elm_policies[ELM_POLICY_LAST];
 static Ecore_Event_Handler *_elm_exit_handler = NULL;
-static Ecore_Event_Handler *_elm_event_property_change = NULL;
-#ifdef HAVE_ELEMENTARY_X
-static Ecore_X_Atom _elm_atom_enlightenment_scale = 0;
-static Ecore_X_Atom _elm_atom_enlightenment_finger_size = 0;
-static Ecore_X_Atom _elm_atom_enlightenment_theme = 0;
-#endif
 
 static int
 _elm_signal_exit(void *data __UNUSED__, int ev_type __UNUSED__, void *ev __UNUSED__)
@@ -290,64 +282,7 @@ _elm_signal_exit(void *data __UNUSED__, int ev_type __UNUSED__, void *ev __UNUSE
    return 1;
 }
 
-#ifdef HAVE_ELEMENTARY_X
-static int
-_elm_window_property_change(void *data __UNUSED__, int ev_type __UNUSED__, 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)
-         {
-            unsigned 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();
-              }
-         }
-       else if (event->atom == _elm_atom_enlightenment_finger_size)
-         {
-            unsigned int val = 1000;
-
-            if (ecore_x_window_prop_card32_get(event->win,
-                                               event->atom,
-                                               &val, 1) > 0)
-              {
-                 int pfinger_size;
-
-                 pfinger_size = _elm_config->finger_size;
-                 _elm_config->finger_size = val;
-                 if (pfinger_size != _elm_config->finger_size) _elm_rescale();
-              }
-         }
-       else if (event->atom == _elm_atom_enlightenment_theme)
-         {
-             char *val = NULL;
-             
-             val = ecore_x_window_prop_string_get(event->win,
-                                                  event->atom);
-            eina_stringshare_replace(&_elm_config->theme, val);
-            if (val)
-              {
-                 _elm_theme_parse(val);
-                 free(val);
-                 _elm_rescale();
-              }
-         }
-     }
-   return 1;
-}
-#endif
-
-static void
+void
 _elm_rescale(void)
 {
    edje_scale_set(_elm_config->scale);
@@ -462,119 +397,6 @@ _elm_unneed_efreet(void)
 #endif   
 }
 
-static void
-_config_init(void)
-{
-   Eet_Data_Descriptor_Class eddc;
-   Eet_Data_Descriptor *edd = NULL;
-   Eet_File *ef = NULL;
-   int len = 0;
-   char buf[PATH_MAX], *p, *s;
-   const char *home = NULL;
-   char *profile = strdup("default");
-   
-   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Elm_Config);
-   
-   eddc.func.str_direct_alloc = NULL;
-   eddc.func.str_direct_free = NULL;
-   
-   edd = eet_data_descriptor_file_new(&eddc);
-   if (edd)
-     {
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "engine", engine, EET_T_INT);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "thumbscroll_enable", thumbscroll_enable, EET_T_INT);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "thumbscroll_threshhold", thumbscroll_threshhold, EET_T_INT);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "thumbscroll_momentum_threshhold", thumbscroll_momentum_threshhold, EET_T_DOUBLE);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "thumbscroll_friction", thumbscroll_friction, EET_T_DOUBLE);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "thumbscroll_bounce_friction", thumbscroll_bounce_friction, EET_T_DOUBLE);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "page_scroll_friction", page_scroll_friction, EET_T_DOUBLE);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "bring_in_scroll_friction", bring_in_scroll_friction, EET_T_DOUBLE);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "zoom_friction", zoom_friction, EET_T_DOUBLE);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "thumbscroll_bounce_enable", thumbscroll_bounce_enable, EET_T_INT);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "scale", scale, EET_T_DOUBLE);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "bgpixmap", bgpixmap, EET_T_INT);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "compositing", compositing, EET_T_INT);
-        // EET_DATA_DESCRIPTOR_ADD_LIST(edd, Elm_Config, "font_dirs", font_dirs, sub_edd);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "font_hinting", font_hinting, EET_T_INT);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "image_cache", image_cache, EET_T_INT);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "font_cache", font_cache, EET_T_INT);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "finger_size", finger_size, EET_T_INT);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "fps", fps, EET_T_DOUBLE);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "theme", theme, EET_T_STRING);
-        EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Elm_Config, "modules", modules, EET_T_STRING);
-     }
-   else
-     {
-        printf("EEEK! eet_data_descriptor_file_new() failed\n");
-     }
-   
-   home = getenv("HOME");
-   if (!home) home = "/";
-   
-   snprintf(buf, sizeof(buf), "%s/.elementary/config/profile.cfg", home);
-   ef = eet_open(buf, EET_FILE_MODE_READ);
-   if (ef)
-     {
-        p = eet_read(ef, "config", &len);
-        if (p)
-          {
-             free(profile);
-             profile = malloc(len + 1);
-             memcpy(profile, p, len);
-             profile[len] = 0;
-             free(p);
-          }
-        eet_close(ef);
-        if (!p) ef = NULL;
-     }
-   if (!ef)
-     {
-        snprintf(buf, sizeof(buf), "%s/config/profile.cfg", _elm_data_dir);
-        ef = eet_open(buf, EET_FILE_MODE_READ);
-        if (ef)
-          {
-             p = eet_read(ef, "config", &len);
-             if (p)
-               {
-                  free(profile);
-                  profile = malloc(len + 1);
-                  memcpy(profile, p, len);
-                  profile[len] = 0;
-                  free(p);
-               }
-             eet_close(ef);
-          }
-     }
-   
-   s = getenv("ELM_PROFILE");
-   if (s)
-     {
-        free(profile);
-        profile = strdup(s);
-     }
-   
-   snprintf(buf, sizeof(buf), "%s/.elementary/config/%s/base.cfg", home, profile);
-   ef = eet_open(buf, EET_FILE_MODE_READ);
-   if (ef)
-     {
-        _elm_config = eet_data_read(ef, edd, "config");
-        eet_close(ef);
-     }
-   if (!_elm_config)
-     {
-        snprintf(buf, sizeof(buf), "%s/config/%s/base.cfg", _elm_data_dir, profile);
-        ef = eet_open(buf, EET_FILE_MODE_READ);
-        if (ef)
-          {
-             _elm_config = eet_data_read(ef, edd, "config");
-             eet_close(ef);
-          }
-     }
-   
-   if (edd) eet_data_descriptor_free(edd);
-   if (profile) free(profile);
-}
-
 EAPI void
 elm_quicklaunch_init(int argc, char **argv)
 {
@@ -676,255 +498,14 @@ elm_quicklaunch_init(int argc, char **argv)
    if (!_elm_lib_dir)
      _elm_lib_dir = eina_stringshare_add("/");
 
-   _config_init();
-   
-   if (!_elm_config)
-     {
-        _elm_config = ELM_NEW(Elm_Config);
-        _elm_config->engine = ELM_SOFTWARE_X11;
-        _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->thumbscroll_bounce_friction = 0.5;
-        _elm_config->page_scroll_friction = 0.5;
-        _elm_config->bring_in_scroll_friction = 0.5;
-        _elm_config->zoom_friction = 0.5;
-        _elm_config->thumbscroll_bounce_enable = 1;
-        _elm_config->scale = 1.0;
-        _elm_config->bgpixmap = 0;
-        _elm_config->font_hinting = 2;
-        _elm_config->font_dirs = NULL;
-        _elm_config->image_cache = 4096;
-        _elm_config->font_cache = 512;
-        _elm_config->finger_size = 40;
-        _elm_config->compositing = 1;
-        _elm_config->fps = 60.0;
-        _elm_config->theme = eina_stringshare_add("default");
-        _elm_config->modules = NULL;
-     }
-
-   s = getenv("ELM_ENGINE");
-   if (s)
-     {
-       if ((!strcasecmp(s, "x11")) ||
-           (!strcasecmp(s, "x")) ||
-           (!strcasecmp(s, "software-x11")) ||
-           (!strcasecmp(s, "software_x11")))
-         _elm_config->engine = ELM_SOFTWARE_X11;
-       else if ((!strcasecmp(s, "x11-16")) ||
-                (!strcasecmp(s, "x16")) ||
-                (!strcasecmp(s, "software-16-x11")) ||
-                (!strcasecmp(s, "software_16_x11")))
-         _elm_config->engine = ELM_SOFTWARE_16_X11;
-       else if ((!strcasecmp(s, "xrender")) ||
-                (!strcasecmp(s, "xr")) ||
-                (!strcasecmp(s, "xrender-x11")) ||
-                (!strcasecmp(s, "xrender_x11")))
-         _elm_config->engine = ELM_XRENDER_X11;
-       else if ((!strcasecmp(s, "fb")) ||
-                (!strcasecmp(s, "software-fb")) ||
-                (!strcasecmp(s, "software_fb")))
-         _elm_config->engine = ELM_SOFTWARE_FB;
-        else if ((!strcasecmp(s, "directfb")) ||
-                 (!strcasecmp(s, "dfb")))
-          _elm_config->engine = ELM_SOFTWARE_DIRECTFB;
-        else if ((!strcasecmp(s, "sdl")) ||
-                 (!strcasecmp(s, "software-sdl")) ||
-                 (!strcasecmp(s, "software_sdl")))
-         _elm_config->engine = ELM_SOFTWARE_SDL;
-       else if ((!strcasecmp(s, "sdl-16")) ||
-                (!strcasecmp(s, "software-16-sdl")) ||
-                (!strcasecmp(s, "software_16_sdl")))
-         _elm_config->engine = ELM_SOFTWARE_16_SDL;
-       else if ((!strcasecmp(s, "opengl")) ||
-                (!strcasecmp(s, "gl")) ||
-                (!strcasecmp(s, "opengl-x11")) ||
-                (!strcasecmp(s, "opengl_x11")))
-         _elm_config->engine = ELM_OPENGL_X11;
-        else if ((!strcasecmp(s, "opengl-sdl")) ||
-                 (!strcasecmp(s, "opengl_sdl")) ||
-                 (!strcasecmp(s, "gl-sdl")) ||
-                 (!strcasecmp(s, "gl_sdl")))
-         _elm_config->engine = ELM_OPENGL_SDL;
-       else if ((!strcasecmp(s, "gdi")) ||
-                (!strcasecmp(s, "software-gdi")) ||
-                (!strcasecmp(s, "software_gdi")))
-         _elm_config->engine = ELM_SOFTWARE_WIN32;
-       else if ((!strcasecmp(s, "wince-gdi")) ||
-                (!strcasecmp(s, "software-16-wince-gdi")) ||
-                (!strcasecmp(s, "software_16_wince_gdi")))
-         _elm_config->engine = ELM_SOFTWARE_16_WINCE;
-     }
-
-   s = getenv("ELM_THUMBSCROLL_ENABLE");
-   if (s) _elm_config->thumbscroll_enable = atoi(s);
-   s = getenv("ELM_THUMBSCROLL_THRESHOLD");
-   if (s) _elm_config->thumbscroll_threshhold = atoi(s);
-   // FIXME: floatformat locale issues here 1.0 vs 1,0 - should just be 1.0
-   s = getenv("ELM_THUMBSCROLL_MOMENTUM_THRESHOLD");
-   if (s) _elm_config->thumbscroll_momentum_threshhold = atof(s);
-   s = getenv("ELM_THUMBSCROLL_FRICTION");
-   if (s) _elm_config->thumbscroll_friction = atof(s);
-   s = getenv("ELM_PAGE_SCROLL_FRICTION");
-   if (s) _elm_config->page_scroll_friction = atof(s);
-   s = getenv("ELM_BRING_IN_SCROLL_FRICTION");
-   if (s) _elm_config->bring_in_scroll_friction = atof(s);
-   s = getenv("ELM_ZOOM_FRICTION");
-   if (s) _elm_config->zoom_friction = atof(s);
-
-   s = getenv("ELM_THEME");
-   if (s)
-     eina_stringshare_replace(&_elm_config->theme, s);
-   
-   _elm_theme_parse(_elm_config->theme);
-
-   _elm_config->font_hinting = 2;
-   s = getenv("ELM_FONT_HINTING");
-   if (s)
-     {
-       if (!strcasecmp(s, "none"))          _elm_config->font_hinting = 0;
-       else if (!strcasecmp(s, "auto"))     _elm_config->font_hinting = 1;
-       else if (!strcasecmp(s, "bytecode")) _elm_config->font_hinting = 2;
-     }
-
-   s = getenv("ELM_FONT_PATH");
-   if (s)
-     {
-       const char *p, *pp;
-       char *buf2;
-
-        EINA_LIST_FREE(_elm_config->font_dirs, p)
-          {
-             eina_stringshare_del(p);
-          }
-        
-       buf2 = alloca(strlen(s) + 1);
-       p = s;
-       pp = p;
-       for (;;)
-         {
-            if ((*p == ':') || (*p == 0))
-              {
-                 int len;
-
-                 len = p - pp;
-                 strncpy(buf2, pp, len);
-                 buf2[len] = 0;
-                 _elm_config->font_dirs = 
-                    eina_list_append(_elm_config->font_dirs, 
-                                     eina_stringshare_add(buf2));
-                 if (*p == 0) break;
-                 p++;
-                 pp = p;
-              }
-            else
-              {
-                 if (*p == 0) break;
-                 p++;
-              }
-         }
-     }
-
-   s = getenv("ELM_IMAGE_CACHE");
-   if (s) _elm_config->image_cache = atoi(s);
-
-   s = getenv("ELM_FONT_CACHE");
-   if (s) _elm_config->font_cache = atoi(s);
-
-   s = getenv("ELM_SCALE");
-   if (s) _elm_config->scale = atof(s);
-   
-   _elm_config->finger_size =
-     (double)_elm_config->finger_size * _elm_config->scale;
-   s = getenv("ELM_FINGER_SIZE");
-   if (s) _elm_config->finger_size = atoi(s);
-
-   s = getenv("ELM_FPS");
-   if (s) _elm_config->fps = atof(s);
-   if (_elm_config->fps < 1.0) _elm_config->fps = 1.0;
-
-   ecore_animator_frametime_set(1.0 / _elm_config->fps);
-   edje_frametime_set(1.0 / _elm_config->fps);
-   edje_scale_set(_elm_config->scale);
-
-   s = getenv("ELM_MODULES");
-   if (s)
-     eina_stringshare_replace(&_elm_config->modules, s);
-   if (_elm_config->modules) _elm_module_parse(_elm_config->modules);
+   _elm_config_init();
 }
 
 EAPI void
 elm_quicklaunch_sub_init(int argc, char **argv)
 {
    ecore_app_args_set(argc, (const char **)argv);
-   if ((_elm_config->engine == ELM_SOFTWARE_X11) ||
-       (_elm_config->engine == ELM_SOFTWARE_16_X11) ||
-       (_elm_config->engine == ELM_XRENDER_X11) ||
-       (_elm_config->engine == ELM_OPENGL_X11))
-     {
-#ifdef HAVE_ELEMENTARY_X
-       unsigned int val = 1000;
-
-       if (!ecore_x_init(NULL))
-         {
-            ERR("Cannot connect to X11 display. check $DISPLAY variable");
-            exit(1);
-         }
-       if (!ecore_x_screen_is_composited(0))
-         _elm_config->compositing = 0;
-        
-       _elm_atom_enlightenment_scale       = ecore_x_atom_get("ENLIGHTENMENT_SCALE");
-       _elm_atom_enlightenment_finger_size = ecore_x_atom_get("ENLIGHTENMENT_FINGER_SIZE");
-       _elm_atom_enlightenment_theme       = ecore_x_atom_get("ENLIGHTENMENT_THEME");
-        
-       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);
-       if (!getenv("ELM_SCALE"))
-         {
-            if (ecore_x_window_prop_card32_get(ecore_x_window_root_first_get(),
-                                               _elm_atom_enlightenment_scale,
-                                               &val, 1) > 0)
-              {
-                 if (val > 0)
-                   {
-                      _elm_config->scale = (double)val / 1000.0;
-                      // FIXME: hack until e export finger size too
-                      if (getenv("ELM_FINGER_SIZE"))
-                        _elm_config->finger_size = 40.0 * _elm_config->scale;
-                       edje_scale_set(_elm_config->scale);
-                   }
-              }
-         }
-       if (!getenv("ELM_FINGER_SIZE"))
-         {
-            if (ecore_x_window_prop_card32_get(ecore_x_window_root_first_get(),
-                                               _elm_atom_enlightenment_finger_size,
-                                               &val, 1) > 0)
-              {
-                 if (val > 0)
-                   {
-                      _elm_config->finger_size = val;
-                   }
-              }
-         }
-       if (!getenv("ELM_THEME"))
-         {
-             char *s;
-             
-             s = ecore_x_window_prop_string_get(ecore_x_window_root_first_get(),
-                                                _elm_atom_enlightenment_theme);
-             if (s)
-              {
-                 eina_stringshare_replace(&_elm_config->theme, s);
-                  _elm_theme_parse(s);
-                  free(s);
-              }
-         }
-#endif
-      }
+   _elm_config_sub_init();
 }
 
 EAPI void
@@ -942,8 +523,6 @@ elm_quicklaunch_sub_shutdown(void)
        (_elm_config->engine == ELM_SOFTWARE_16_WINCE))
      {
 #ifdef HAVE_ELEMENTARY_X
-       ecore_event_handler_del(_elm_event_property_change);
-       _elm_event_property_change = NULL;
        ecore_x_disconnect();
 #endif
        evas_cserve_disconnect();
@@ -953,26 +532,16 @@ elm_quicklaunch_sub_shutdown(void)
 EAPI void
 elm_quicklaunch_shutdown(void)
 {
-   const char *fontdir;
-
    eina_stringshare_del(_elm_data_dir);
    _elm_data_dir = NULL;
    eina_stringshare_del(_elm_lib_dir);
    _elm_lib_dir = NULL;
 
-   EINA_LIST_FREE(_elm_config->font_dirs, fontdir)
-     {
-       eina_stringshare_del(fontdir);
-     }
-   
-   if (_elm_config->theme) eina_stringshare_del(_elm_config->theme);
-   if (_elm_config->modules) eina_stringshare_del(_elm_config->modules);
-   
-   free(_elm_config);
-   _elm_config = NULL;
    free(_elm_appname);
    _elm_appname = NULL;
    
+   _elm_config_shutdown();
+   
    ecore_event_handler_del(_elm_exit_handler);
    _elm_exit_handler = NULL;
 
index 024f75d..ddffc4a 100644 (file)
@@ -165,6 +165,12 @@ Eina_Bool         _elm_widget_type_check(const Evas_Object *obj, const char *typ
 
 void             _elm_unneed_ethumb(void);
 
+void              _elm_rescale(void);
+
+void              _elm_config_init(void);
+void              _elm_config_sub_init(void);
+void              _elm_config_shutdown(void);
+
 #define ELM_SET_WIDTYPE(widtype, type) if (!widtype) widtype = eina_stringshare_add(type)
 //#define ELM_CHECK_WIDTYPE(obj, widtype) if (elm_widget_type_get(obj) != widtype) return
 #define ELM_CHECK_WIDTYPE(obj, widtype) if (!_elm_widget_type_check((obj), (widtype))) return