Elementary: Add support for the PSL1GHT engine
[framework/uifw/elementary.git] / src / lib / elm_config.c
index f0b006e..3df2272 100644 (file)
@@ -9,6 +9,8 @@
 #include <Elementary.h>
 #include "elm_priv.h"
 
+EAPI int ELM_EVENT_CONFIG_ALL_CHANGED = 0;
+
 Elm_Config *_elm_config = NULL;
 char *_elm_profile = NULL;
 static Eet_Data_Descriptor *_config_edd = NULL;
@@ -29,6 +31,10 @@ const char *_elm_engines[] = {
    "sdl",
    "software_16_sdl",
    "opengl_sdl",
+   "buffer",
+   "ews",
+   "opengl_cocoa",
+   "psl1ght",
    NULL
 };
 
@@ -72,64 +78,38 @@ static size_t _elm_user_dir_snprintf(char       *dst,
 
 #ifdef HAVE_ELEMENTARY_X
 static Ecore_Event_Handler *_prop_change_handler = NULL;
+static Ecore_Timer *_prop_all_update_timer = NULL;
+static Ecore_Timer *_prop_change_delay_timer = NULL;
 static Ecore_X_Window _root_1st = 0;
-#define ATOM_COUNT 22
+#define ATOM_COUNT 2
 static Ecore_X_Atom _atom[ATOM_COUNT];
 static Ecore_X_Atom _atom_config = 0;
 static const char *_atom_names[ATOM_COUNT] =
 {
-   "ENLIGHTENMENT_SCALE",
-   "ENLIGHTENMENT_FINGER_SIZE",
-   "ENLIGHTENMENT_THEME",
-   "ENLIGHTENMENT_PROFILE",
-   "ENLIGHTENMENT_FONT_OVERLAY",
-   "ENLIGHTENMENT_CACHE_FLUSH_INTERVAL",
-   "ENLIGHTENMENT_CACHE_FLUSH_ENABLE",
-   "ENLIGHTENMENT_FONT_CACHE",
-   "ENLIGHTENMENT_IMAGE_CACHE",
-   "ENLIGHTENMENT_EDJE_FILE_CACHE",
-   "ENLIGHTENMENT_EDJE_COLLECTION_CACHE",
-   "ENLIGHTENMENT_THUMBSCROLL_BOUNCE_ENABLE",
-   "ENLIGHTENMENT_THUMBSCROLL_BOUNCE_FRICTION",
-   "ENLIGHTENMENT_THUMBSCROLL_ENABLE",
-   "ENLIGHTENMENT_THUMBSCROLL_THRESHOLD",
-   "ENLIGHTENMENT_THUMBSCROLL_MOMENTUM_THRESHOLD",
-   "ENLIGHTENMENT_THUMBSCROLL_FRICTION",
-   "ENLIGHTENMENT_THUMBSCROLL_BORDER_FRICTION",
-   "ENLIGHTENMENT_THUMBSCROLL_PAGE_SCROLL_FRICTION",
-   "ENLIGHTENMENT_THUMBSCROLL_BRING_IN_SCROLL_FRICTION",
-   "ENLIGHTENMENT_THUMBSCROLL_ZOOM_FRICTION",
-   "ENLIGHTENMENT_CONFIG"
+   "ELM_PROFILE",
+   "ELM_CONFIG"
 };
-#define ATOM_E_SCALE                                0
-#define ATOM_E_FINGER_SIZE                          1
-#define ATOM_E_THEME                                2
-#define ATOM_E_PROFILE                              3
-#define ATOM_E_FONT_OVERLAY                         4
-#define ATOM_E_CACHE_FLUSH_INTERVAL                 5
-#define ATOM_E_CACHE_FLUSH_ENABLE                   6
-#define ATOM_E_FONT_CACHE                           7
-#define ATOM_E_IMAGE_CACHE                          8
-#define ATOM_E_EDJE_FILE_CACHE                      9
-#define ATOM_E_EDJE_COLLECTION_CACHE                10
-#define ATOM_E_THUMBSCROLL_BOUNCE_ENABLE            11
-#define ATOM_E_THUMBSCROLL_BOUNCE_FRICTION          12
-#define ATOM_E_THUMBSCROLL_ENABLE                   13
-#define ATOM_E_THUMBSCROLL_THRESHOLD                14
-#define ATOM_E_THUMBSCROLL_MOMENTUM_THRESHOLD       15
-#define ATOM_E_THUMBSCROLL_FRICTION                 16
-#define ATOM_E_THUMBSCROLL_BORDER_FRICTION          17
-#define ATOM_E_THUMBSCROLL_PAGE_SCROLL_FRICTION     18
-#define ATOM_E_THUMBSCROLL_BRING_IN_SCROLL_FRICTION 19
-#define ATOM_E_THUMBSCROLL_ZOOM_FRICTION            20
-#define ATOM_E_CONFIG                               21
+#define ATOM_E_PROFILE                              0
+#define ATOM_E_CONFIG                               1
 
+static Eina_Bool _prop_all_update_cb(void *data __UNUSED__);
 static Eina_Bool _prop_config_get(void);
+static void      _prop_config_set(void);
 static Eina_Bool _prop_change(void *data  __UNUSED__,
                               int ev_type __UNUSED__,
                               void       *ev);
 
 static Eina_Bool
+_prop_all_update_cb(void *data __UNUSED__)
+{
+   _prop_config_set();
+   ecore_x_window_prop_string_set(_root_1st, _atom[ATOM_E_PROFILE],
+                                  _elm_profile);
+   _prop_all_update_timer = NULL;
+   return EINA_FALSE;
+}
+
+static Eina_Bool
 _prop_config_get(void)
 {
    int size = 0;
@@ -138,7 +118,7 @@ _prop_config_get(void)
    unsigned char *data = NULL;
    Elm_Config *config_data;
 
-   snprintf(buf, sizeof(buf), "ENLIGHTENMENT_CONFIG_%s", _elm_profile);
+   snprintf(buf, sizeof(buf), "ELM_CONFIG_%s", _elm_profile);
    atom = ecore_x_atom_get(buf);
    _atom_config = atom;
    if (!ecore_x_window_prop_property_get(_root_1st,
@@ -179,337 +159,68 @@ _prop_config_get(void)
    _elm_config_font_overlay_apply();
    _elm_rescale();
    _elm_recache();
+   ecore_event_add(ELM_EVENT_CONFIG_ALL_CHANGED, NULL, NULL, NULL);
    return EINA_TRUE;
 }
 
-static Eina_Bool
-_prop_change(void *data  __UNUSED__,
-             int ev_type __UNUSED__,
-             void       *ev)
+static void
+_prop_config_set(void)
 {
-   Ecore_X_Event_Window_Property *event = ev;
+   unsigned char *config_data = NULL;
+   int size = 0;
 
-   if (event->win == _root_1st)
+   config_data = eet_data_descriptor_encode(_config_edd, _elm_config, &size);
+   if (config_data)
      {
-        if (event->atom == _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();
-                       _elm_recache();
-                    }
-               }
-          }
-        else if (event->atom == _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();
-                       _elm_recache();
-                    }
-               }
-          }
-        else if (event->atom == _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(NULL, val);
-                  free(val);
-                  _elm_rescale();
-                  _elm_recache();
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_PROFILE])
-          {
-             char *val = NULL;
-
-             val = ecore_x_window_prop_string_get(event->win,
-                                                  event->atom);
-             if (val)
-               {
-                  int changed = 0;
-
-                  if (_elm_profile)
-                    {
-                       if (strcmp(_elm_profile, val)) changed = 1;
-                       free(_elm_profile);
-                    }
-                  _elm_profile = val;
-                  if (changed)
-                    {
-                       if (!_prop_config_get())
-                         {
-                            _config_free();
-                            _config_load();
-                            _config_apply();
-                            _elm_config_font_overlay_apply();
-                            _elm_rescale();
-                         }
-                    }
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_FONT_OVERLAY])
-          {
-             unsigned int val = 1000;
-
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  _config_free();
-                  _config_load();
-                  _config_apply();
-                  _elm_config_font_overlay_apply();
-                  _elm_rescale();
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_CACHE_FLUSH_INTERVAL])
-          {
-             unsigned int val = 1000;
-
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  int cache_flush_interval;
-
-                  cache_flush_interval = _elm_config->cache_flush_poll_interval;
-                  _elm_config->cache_flush_poll_interval = val;
-                  if (cache_flush_interval !=
-                      _elm_config->cache_flush_poll_interval)
-                    _elm_recache();
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_CACHE_FLUSH_ENABLE])
-          {
-             unsigned int val = 1000;
-
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  _elm_config->cache_flush_enable = !!val;
-                  _elm_recache();
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_FONT_CACHE])
-          {
-             unsigned int val = 1000;
+        Ecore_X_Atom atom;
+        char buf[512];
 
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  int font_cache;
-
-                  font_cache = _elm_config->font_cache;
-                  _elm_config->font_cache = val;
-                  if (font_cache != _elm_config->font_cache)
-                    _elm_recache();
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_IMAGE_CACHE])
-          {
-             unsigned int val = 1000;
-
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  int image_cache;
+        snprintf(buf, sizeof(buf), "ELM_CONFIG_%s", _elm_profile);
+        atom = ecore_x_atom_get(buf);
+        _atom_config = atom;
 
-                  image_cache = _elm_config->image_cache;
-                  _elm_config->image_cache = val;
-                  if (image_cache != _elm_config->image_cache)
-                    _elm_recache();
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_EDJE_FILE_CACHE])
-          {
-             unsigned int val = 1000;
-
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  int edje_file_cache;
-
-                  edje_file_cache = _elm_config->edje_cache;
-                  _elm_config->edje_cache = val;
-                  if (edje_file_cache != _elm_config->edje_cache)
-                    _elm_recache();
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_EDJE_COLLECTION_CACHE])
-          {
-             unsigned int val = 1000;
-
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  int edje_collection_cache;
-
-                  edje_collection_cache = _elm_config->edje_collection_cache;
-                  _elm_config->edje_collection_cache = val;
-                  if (edje_collection_cache !=
-                      _elm_config->edje_collection_cache)
-                    _elm_recache();
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_THUMBSCROLL_BOUNCE_ENABLE])
-          {
-             unsigned int val = 1000;
-
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  _elm_config->thumbscroll_bounce_enable = !!val;
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_THUMBSCROLL_BOUNCE_FRICTION])
-          {
-             unsigned int val = 1000;
-
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  if (val > 0)
-                    _elm_config->thumbscroll_bounce_friction =
-                      (double)val / 1000.0;
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_THUMBSCROLL_ENABLE])
-          {
-             unsigned int val = 1000;
-
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  _elm_config->thumbscroll_enable = !!val;
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_THUMBSCROLL_THRESHOLD])
-          {
-             unsigned int val = 1000;
-
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  if (val > 0) _elm_config->thumbscroll_threshold = val;
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_THUMBSCROLL_MOMENTUM_THRESHOLD])
-          {
-             unsigned int val = 1000;
-
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  if (val > 0)
-                    _elm_config->thumbscroll_momentum_threshold =
-                      (double)val / 1000.0;
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_THUMBSCROLL_FRICTION])
-          {
-             unsigned int val = 1000;
+        ecore_x_window_prop_property_set(_root_1st, _atom_config,
+                                         _atom[ATOM_E_CONFIG], 8,
+                                         config_data, size);
+        free(config_data);
+     }
+}
 
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  if (val > 0)
-                    _elm_config->thumbscroll_friction = (double)val / 1000.0;
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_THUMBSCROLL_BORDER_FRICTION])
-          {
-             unsigned int val = 1000;
+static Eina_Bool
+_prop_change_delay_cb(void *data __UNUSED__)
+{
+   char *s;
 
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  if (val > 0)
-                    _elm_config->thumbscroll_border_friction =
-                      (double)val / 1000.0;
-               }
-          }
-        else if (event->atom == _atom[ATOM_E_THUMBSCROLL_PAGE_SCROLL_FRICTION])
-          {
-             unsigned int val = 1000;
+   s = ecore_x_window_prop_string_get(_root_1st, _atom[ATOM_E_PROFILE]);
+   if (s)
+     {
+        if (_elm_profile) free(_elm_profile);
+        _elm_profile = s;
+     }
+   _prop_config_get();
+   _prop_change_delay_timer = NULL;
+   return EINA_FALSE;
+}
 
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  if (val > 0)
-                    _elm_config->page_scroll_friction =
-                      (double)val / 1000.0;
-               }
-          }
-        else if (event->atom ==
-                 _atom[ATOM_E_THUMBSCROLL_BRING_IN_SCROLL_FRICTION])
-          {
-             unsigned int val = 1000;
+static Eina_Bool
+_prop_change(void *data  __UNUSED__,
+             int ev_type __UNUSED__,
+             void       *ev)
+{
+   Ecore_X_Event_Window_Property *event = ev;
 
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  if (val > 0)
-                    _elm_config->bring_in_scroll_friction =
-                      (double)val / 1000.0;
-               }
-          }
-        else if (event->atom ==
-                 _atom[ATOM_E_THUMBSCROLL_ZOOM_FRICTION])
+   if (event->win == _root_1st)
+     {
+        if (event->atom == _atom[ATOM_E_PROFILE])
           {
-             unsigned int val = 1000;
-
-             if (ecore_x_window_prop_card32_get(event->win,
-                                                event->atom,
-                                                &val, 1) > 0)
-               {
-                  if (val > 0)
-                    _elm_config->zoom_friction = (double)val / 1000.0;
-               }
+             if (_prop_change_delay_timer) ecore_timer_del(_prop_change_delay_timer);
+             _prop_change_delay_timer = ecore_timer_add(0.1, _prop_change_delay_cb, NULL);
           }
         else if (((_atom_config > 0) && (event->atom == _atom_config)) ||
                  (event->atom == _atom[ATOM_E_CONFIG]))
           {
-             _prop_config_get();
+             if (_prop_change_delay_timer) ecore_timer_del(_prop_change_delay_timer);
+             _prop_change_delay_timer = ecore_timer_add(0.1, _prop_change_delay_cb, NULL);
           }
      }
    return ECORE_CALLBACK_PASS_ON;
@@ -562,16 +273,22 @@ _desc_init(void)
 #define D _config_edd
    ELM_CONFIG_VAL(D, T, config_version, T_INT);
    ELM_CONFIG_VAL(D, T, engine, T_STRING);
+   ELM_CONFIG_VAL(D, T, vsync, T_UCHAR);
    ELM_CONFIG_VAL(D, T, thumbscroll_enable, T_UCHAR);
    ELM_CONFIG_VAL(D, T, thumbscroll_threshold, T_INT);
    ELM_CONFIG_VAL(D, T, thumbscroll_momentum_threshold, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, thumbscroll_friction, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, thumbscroll_bounce_friction, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, thumbscroll_border_friction, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, thumbscroll_sensitivity_friction, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, page_scroll_friction, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, bring_in_scroll_friction, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, zoom_friction, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, thumbscroll_bounce_enable, T_UCHAR);
+   ELM_CONFIG_VAL(D, T, scroll_smooth_amount, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, scroll_smooth_history_weight, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, scroll_smooth_future_time, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, scroll_smooth_time_window, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, scale, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, bgpixmap, T_INT);
    ELM_CONFIG_VAL(D, T, compositing, T_INT);
@@ -597,6 +314,21 @@ _desc_init(void)
    ELM_CONFIG_VAL(D, T, inwin_dialogs_enable, T_UCHAR);
    ELM_CONFIG_VAL(D, T, icon_size, T_INT);
    ELM_CONFIG_VAL(D, T, longpress_timeout, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, effect_enable, T_UCHAR);
+   ELM_CONFIG_VAL(D, T, desktop_entry, T_UCHAR);
+   ELM_CONFIG_VAL(D, T, password_show_last, T_UCHAR);
+   ELM_CONFIG_VAL(D, T, password_show_last_timeout, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, glayer_zoom_finger_factor, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, glayer_zoom_wheel_factor, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, glayer_zoom_distance_tolerance, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, glayer_rotate_angular_tolerance, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, glayer_line_min_length, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, glayer_line_distance_tolerance, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, glayer_line_angular_tolerance, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, glayer_flick_time_limit_ms, T_INT);
+   ELM_CONFIG_VAL(D, T, glayer_long_tap_start_timeout, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, access_mode, T_INT);
+   ELM_CONFIG_VAL(D, T, glayer_continues_enable, T_UCHAR);
 #undef T
 #undef D
 #undef T_INT
@@ -669,7 +401,11 @@ _elm_user_dir_snprintf(char       *dst,
    size_t user_dir_len, off;
    va_list ap;
 
+#ifdef _WIN32
+   home = evil_homedir_get();
+#else
    home = getenv("HOME");
+#endif
    if (!home)
      home = "/";
 
@@ -893,9 +629,8 @@ sys:
              continue;
           }
      }
-   return flist;
-
    eina_iterator_free(file_it);
+   return flist;
 
 list_free:
    EINA_LIST_FREE(flist, dir)
@@ -995,6 +730,8 @@ _config_sub_apply(void)
 {
    edje_frametime_set(1.0 / _elm_config->fps);
    edje_scale_set(_elm_config->scale);
+   edje_password_show_last_set(_elm_config->password_show_last);
+   edje_password_show_last_timeout_set(_elm_config->password_show_last_timeout);
    if (_elm_config->modules) _elm_module_parse(_elm_config->modules);
 }
 
@@ -1019,8 +756,8 @@ _elm_recache(void)
    EINA_LIST_FOREACH(_elm_win_list, l, win)
      {
         Evas *e = evas_object_evas_get(win);
-        evas_image_cache_set(e, _elm_config->image_cache);
-        evas_font_cache_set(e, _elm_config->font_cache);
+        evas_image_cache_set(e, _elm_config->image_cache * 1024);
+        evas_font_cache_set(e, _elm_config->font_cache * 1024);
      }
    edje_file_cache_set(_elm_config->edje_cache);
    edje_collection_cache_set(_elm_config->edje_collection_cache);
@@ -1105,6 +842,7 @@ _config_load(void)
    _elm_config = ELM_NEW(Elm_Config);
    _elm_config->config_version = ELM_CONFIG_VERSION;
    _elm_config->engine = eina_stringshare_add("software_x11");
+   _elm_config->vsync = 0;
    _elm_config->thumbscroll_enable = EINA_TRUE;
    _elm_config->thumbscroll_threshold = 24;
    _elm_config->thumbscroll_momentum_threshold = 100.0;
@@ -1115,6 +853,11 @@ _config_load(void)
    _elm_config->bring_in_scroll_friction = 0.5;
    _elm_config->zoom_friction = 0.5;
    _elm_config->thumbscroll_border_friction = 0.5;
+   _elm_config->thumbscroll_sensitivity_friction = 0.25; // magic number! just trial and error shows this makes it behave "nicer" and not run off at high speed all the time
+   _elm_config->scroll_smooth_amount = 1.0;
+   _elm_config->scroll_smooth_history_weight = 0.3;
+   _elm_config->scroll_smooth_future_time = 0.0;
+   _elm_config->scroll_smooth_time_window = 0.2;
    _elm_config->scale = 1.0;
    _elm_config->bgpixmap = 0;
    _elm_config->compositing = 1;
@@ -1139,6 +882,21 @@ _config_load(void)
    _elm_config->inwin_dialogs_enable = EINA_FALSE;
    _elm_config->icon_size = 32;
    _elm_config->longpress_timeout = 1.0;
+   _elm_config->effect_enable = EINA_TRUE;
+   _elm_config->desktop_entry = EINA_FALSE;
+   _elm_config->is_mirrored = EINA_FALSE; /* Read sys value in env_get() */
+   _elm_config->password_show_last = EINA_FALSE;
+   _elm_config->password_show_last_timeout = 2.0;
+   _elm_config->glayer_zoom_finger_factor = 1.0;
+   _elm_config->glayer_zoom_wheel_factor = 0.05;
+   _elm_config->glayer_zoom_distance_tolerance = 1.0; /* 1 times elm_finger_size_get() */
+   _elm_config->glayer_rotate_angular_tolerance = 0.034906585;     /* Represents 2 DEG */
+   _elm_config->glayer_line_min_length = 1.0;         /* 1 times elm_finger_size_get() */
+   _elm_config->glayer_line_distance_tolerance = 3.0; /* 3 times elm_finger_size_get() */
+   _elm_config->glayer_line_angular_tolerance = 0.34906585;       /* Represents 20 DEG */
+   _elm_config->glayer_flick_time_limit_ms = 60;              /* 60 ms to finish flick */
+   _elm_config->glayer_long_tap_start_timeout = 1.2;   /* 1.2 second to start long-tap */
+   _elm_config->glayer_continues_enable = EINA_TRUE;      /* Continue gestures default */
 }
 
 static const char *
@@ -1380,7 +1138,7 @@ _env_get(void)
                  (!strcasecmp(s, "opengl_x11")))
           eina_stringshare_replace(&_elm_config->engine, ELM_OPENGL_X11);
         else if ((!strcasecmp(s, "x11-8")) ||
-                 (!strcasecmp(s, "x18")) ||
+                 (!strcasecmp(s, "x8")) ||
                  (!strcasecmp(s, "software-8-x11")) ||
                  (!strcasecmp(s, "software_8_x11")))
           eina_stringshare_replace(&_elm_config->engine, ELM_SOFTWARE_8_X11);
@@ -1389,11 +1147,13 @@ _env_get(void)
                  (!strcasecmp(s, "software-16-x11")) ||
                  (!strcasecmp(s, "software_16_x11")))
           eina_stringshare_replace(&_elm_config->engine, ELM_SOFTWARE_16_X11);
+/*
         else if ((!strcasecmp(s, "xrender")) ||
                  (!strcasecmp(s, "xr")) ||
                  (!strcasecmp(s, "xrender-x11")) ||
                  (!strcasecmp(s, "xrender_x11")))
           eina_stringshare_replace(&_elm_config->engine, ELM_XRENDER_X11);
+ */
         else if ((!strcasecmp(s, "fb")) ||
                  (!strcasecmp(s, "software-fb")) ||
                  (!strcasecmp(s, "software_fb")))
@@ -1401,6 +1161,8 @@ _env_get(void)
         else if ((!strcasecmp(s, "directfb")) ||
                  (!strcasecmp(s, "dfb")))
           eina_stringshare_replace(&_elm_config->engine, ELM_SOFTWARE_DIRECTFB);
+        else if ((!strcasecmp(s, "psl1ght")))
+          eina_stringshare_replace(&_elm_config->engine, ELM_SOFTWARE_PSL1GHT);
         else if ((!strcasecmp(s, "sdl")) ||
                  (!strcasecmp(s, "software-sdl")) ||
                  (!strcasecmp(s, "software_sdl")))
@@ -1414,6 +1176,11 @@ _env_get(void)
                  (!strcasecmp(s, "gl-sdl")) ||
                  (!strcasecmp(s, "gl_sdl")))
           eina_stringshare_replace(&_elm_config->engine, ELM_OPENGL_SDL);
+        else if ((!strcasecmp(s, "opengl-cocoa")) ||
+                 (!strcasecmp(s, "opengl_cocoa")) ||
+                 (!strcasecmp(s, "gl-cocoa")) ||
+                 (!strcasecmp(s, "gl_cocoa")))
+          eina_stringshare_replace(&_elm_config->engine, ELM_OPENGL_COCOA);
         else if ((!strcasecmp(s, "gdi")) ||
                  (!strcasecmp(s, "software-gdi")) ||
                  (!strcasecmp(s, "software_gdi")))
@@ -1422,8 +1189,17 @@ _env_get(void)
                  (!strcasecmp(s, "software-16-wince-gdi")) ||
                  (!strcasecmp(s, "software_16_wince_gdi")))
           eina_stringshare_replace(&_elm_config->engine, ELM_SOFTWARE_16_WINCE);
+        else if (!strcasecmp(s, "buffer"))
+          eina_stringshare_replace(&_elm_config->engine, ELM_BUFFER);
+        else if ((!strncmp(s, "shot:", 5)))
+          eina_stringshare_replace(&_elm_config->engine, s);
+        else if ((!strcasecmp(s, "ews")))
+          eina_stringshare_replace(&_elm_config->engine, ELM_EWS);
      }
 
+   s = getenv("ELM_VSYNC");
+   if (s) _elm_config->vsync = !!atoi(s);
+
    s = getenv("ELM_THUMBSCROLL_ENABLE");
    if (s) _elm_config->thumbscroll_enable = !!atoi(s);
    s = getenv("ELM_THUMBSCROLL_THRESHOLD");
@@ -1455,6 +1231,26 @@ _env_get(void)
 
         _elm_config->thumbscroll_border_friction = friction;
      }
+   s = getenv("ELM_THUMBSCROLL_SENSITIVITY_FRICTION");
+   if (s)
+     {
+        friction = atof(s);
+        if (friction < 0.1)
+          friction = 0.1;
+
+        if (friction > 1.0)
+          friction = 1.0;
+
+        _elm_config->thumbscroll_sensitivity_friction = friction;
+     }
+   s = getenv("ELM_SCROLL_SMOOTH_AMOUNT");
+   if (s) _elm_config->scroll_smooth_amount = atof(s);
+   s = getenv("ELM_SCROLL_SMOOTH_HISTORY_WEIGHT");
+   if (s) _elm_config->scroll_smooth_history_weight = atof(s);
+   s = getenv("ELM_SCROLL_SMOOTH_FUTURE_TIME");
+   if (s) _elm_config->scroll_smooth_future_time = atof(s);
+   s = getenv("ELM_SCROLL_SMOOTH_TIME_WINDOW");
+   if (s) _elm_config->scroll_smooth_time_window = atof(s);
    s = getenv("ELM_THEME");
    if (s) eina_stringshare_replace(&_elm_config->theme, s);
 
@@ -1520,6 +1316,17 @@ _env_get(void)
    s = getenv("ELM_FINGER_SIZE");
    if (s) _elm_config->finger_size = atoi(s);
 
+   s = getenv("ELM_PASSWORD_SHOW_LAST");
+   if (s) _elm_config->password_show_last = !!atoi(s);
+
+   s = getenv("ELM_PASSWORD_SHOW_LAST_TIMEOUT");
+   if (s)
+     {
+        double pw_show_last_timeout = atof(s);
+        if (pw_show_last_timeout >= 0.0)
+          _elm_config->password_show_last_timeout = pw_show_last_timeout;
+     }
+
    s = getenv("ELM_FPS");
    if (s) _elm_config->fps = atof(s);
    if (_elm_config->fps < 1.0) _elm_config->fps = 1.0;
@@ -1527,6 +1334,11 @@ _env_get(void)
    s = getenv("ELM_MODULES");
    if (s) eina_stringshare_replace(&_elm_config->modules, s);
 
+   /* Get RTL orientation from system */
+   setlocale(LC_ALL, "");
+   bindtextdomain(PACKAGE, LOCALE_DIR);
+   _elm_config->is_mirrored = !strcmp(E_("default:LTR"), "default:RTL");
+
    s = getenv("ELM_TOOLTIP_DELAY");
    if (s)
      {
@@ -1560,14 +1372,58 @@ _env_get(void)
    if (s) _elm_config->longpress_timeout = atof(s);
    if (_elm_config->longpress_timeout < 0.0)
      _elm_config->longpress_timeout = 0.0;
+
+   s = getenv("ELM_EFFECT_ENABLE");
+   if (s) _elm_config->effect_enable = !!atoi(s);
+
+   s = getenv("ELM_DESKTOP_ENTRY");
+   if (s) _elm_config->desktop_entry = !!atoi(s);
+   s = getenv("ELM_ACCESS_MODE");
+   if (s) _elm_config->access_mode = ELM_ACCESS_MODE_ON;
+}
+
+EAPI Eina_Bool
+elm_mirrored_get(void)
+{
+   return _elm_config->is_mirrored;
+}
+
+EAPI void
+elm_mirrored_set(Eina_Bool mirrored)
+{
+   _elm_config->is_mirrored = mirrored;
+   _elm_rescale();
+}
+
+static void
+_translation_init()
+{
+#ifdef ENABLE_NLS
+   const char *cur_dom = textdomain(NULL);
+   const char *trans_comment = gettext("");
+   const char *msg_locale = setlocale(LC_MESSAGES, NULL);
+
+   /* Same concept as what glib does:
+    * We shouldn't translate if there are no translations for the
+    * application in the current locale + domain. (Unless locale is
+    * en_/C where translating only parts of the interface make some
+    * sense).
+    */
+   _elm_config->translate = !(strcmp (cur_dom, "messages") &&
+         !*trans_comment && strncmp (msg_locale, "en_", 3) &&
+         strcmp (msg_locale, "C"));
+#endif
 }
 
 void
 _elm_config_init(void)
 {
+   if (!ELM_EVENT_CONFIG_ALL_CHANGED)
+      ELM_EVENT_CONFIG_ALL_CHANGED = ecore_event_type_new();
    _desc_init();
    _profile_fetch_from_conf();
    _config_load();
+   _translation_init();
    _env_get();
    _config_apply();
    _elm_config_font_overlay_apply();
@@ -1575,18 +1431,34 @@ _elm_config_init(void)
 }
 
 void
-_elm_config_sub_init(void)
+_elm_config_sub_shutdown(void)
 {
 #define ENGINE_COMPARE(name) (!strcmp(_elm_config->engine, name))
    if (ENGINE_COMPARE(ELM_SOFTWARE_X11) ||
        ENGINE_COMPARE(ELM_SOFTWARE_16_X11) ||
        ENGINE_COMPARE(ELM_XRENDER_X11) ||
-       ENGINE_COMPARE(ELM_OPENGL_X11))
+       ENGINE_COMPARE(ELM_OPENGL_X11) ||
+       ENGINE_COMPARE(ELM_OPENGL_COCOA))
 #undef ENGINE_COMPARE
      {
 #ifdef HAVE_ELEMENTARY_X
-        unsigned int val = 1000;
+        ecore_x_disconnect();
+#endif
+     }
+}
 
+void
+_elm_config_sub_init(void)
+{
+#define ENGINE_COMPARE(name) (!strcmp(_elm_config->engine, name))
+   if (ENGINE_COMPARE(ELM_SOFTWARE_X11) ||
+       ENGINE_COMPARE(ELM_SOFTWARE_16_X11) ||
+       ENGINE_COMPARE(ELM_XRENDER_X11) ||
+       ENGINE_COMPARE(ELM_OPENGL_X11) ||
+       ENGINE_COMPARE(ELM_OPENGL_COCOA))
+#undef ENGINE_COMPARE
+     {
+#ifdef HAVE_ELEMENTARY_X
         if (!ecore_x_init(NULL))
           {
              ERR("Cannot connect to X11 display. check $DISPLAY variable");
@@ -1602,49 +1474,6 @@ _elm_config_sub_init(void)
                                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(_root_1st,
-                                                _atom[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(_root_1st,
-                                                _atom[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(_root_1st,
-                                                _atom[ATOM_E_THEME]);
-             if (s)
-               {
-                  eina_stringshare_replace(&_elm_config->theme, s);
-                  _elm_theme_parse(NULL, s);
-                  free(s);
-               }
-          }
         if (!getenv("ELM_PROFILE"))
           {
              char *s;
@@ -1690,6 +1519,18 @@ _elm_config_engine_set(const char *engine)
 }
 
 void
+_elm_config_all_update(void)
+{
+#ifdef HAVE_ELEMENTARY_X
+   if (_prop_all_update_timer) ecore_timer_del(_prop_all_update_timer);
+   _prop_all_update_timer = ecore_timer_add(0.1, _prop_all_update_cb, NULL);
+   _prop_config_set();
+   ecore_x_window_prop_string_set(_root_1st, _atom[ATOM_E_PROFILE],
+                                  _elm_profile);
+#endif
+}
+
+void
 _elm_config_profile_set(const char *profile)
 {
    Eina_Bool changed = EINA_FALSE;
@@ -1717,6 +1558,17 @@ _elm_config_profile_set(const char *profile)
 void
 _elm_config_shutdown(void)
 {
+#ifdef HAVE_ELEMENTARY_X
+   if (_prop_all_update_timer)
+     {
+        ecore_timer_del(_prop_all_update_timer);
+        _prop_all_update_cb(NULL);
+     }
+   _prop_all_update_timer = NULL;
+   if (_prop_change_delay_timer) ecore_timer_del(_prop_change_delay_timer);
+   _prop_change_delay_timer = NULL;
+#endif
+
 #define ENGINE_COMPARE(name) (!strcmp(_elm_config->engine, name))
    if (ENGINE_COMPARE(ELM_SOFTWARE_X11) ||
        ENGINE_COMPARE(ELM_SOFTWARE_16_X11) ||