[entry] add autoperiod API
[framework/uifw/elementary.git] / src / lib / elm_config.c
1 #ifdef HAVE_CONFIG_H
2 # include "elementary_config.h"
3 #endif
4
5 #ifdef HAVE_EVIL
6 # include <Evil.h>
7 #endif
8
9 #include <Elementary.h>
10 #include "elm_priv.h"
11
12 Elm_Config *_elm_config = NULL;
13 char *_elm_profile = NULL;
14 static Eet_Data_Descriptor *_config_edd = NULL;
15
16 static void _desc_init(void);
17 static void _desc_shutdown(void);
18 static void _profile_get(void);
19 static void _config_free(void);
20 static void _config_apply(void);
21 static void _config_load(void);
22 static void _env_get(void);
23
24 #ifdef HAVE_ELEMENTARY_X
25 static Ecore_Event_Handler *_prop_change_handler = NULL;
26 static Ecore_X_Window _root_1st = 0;
27 #define ATOM_COUNT 6
28 static Ecore_X_Atom _atom[ATOM_COUNT];
29 static Ecore_X_Atom _atom_config = 0;
30 static Ecore_X_Atom _atom_config_specific = 0;
31 static const char *_atom_names[ATOM_COUNT] =
32 {
33      "ENLIGHTENMENT_SCALE",
34      "ENLIGHTENMENT_FINGER_SIZE",
35      "ENLIGHTENMENT_THEME",
36      "ENLIGHTENMENT_PROFILE",
37      "ENLIGHTENMENT_CONFIG",
38      "ENLIGHTENMENT_INPUT_PANEL",
39      "ENLIGHTENMENT_AUTOCAPITAL",
40      "ENLIGHTENMENT_AUTOPERIOD",
41 };
42 #define ATOM_E_SCALE 0
43 #define ATOM_E_FINGER_SIZE 1
44 #define ATOM_E_THEME 2
45 #define ATOM_E_PROFILE 3
46 #define ATOM_E_CONFIG 4
47 #define ATOM_E_INPUT_PANEL 5
48 #define ATOM_E_AUTOCAPITAL 6
49 #define ATOM_E_AUTOPERIOD 7
50
51 static Eina_Bool _prop_config_get(void);
52 static Eina_Bool _prop_change(void *data __UNUSED__, int ev_type __UNUSED__, void *ev);
53
54 static Eina_Bool
55 _prop_config_get(void)
56 {
57    int size = 0;
58    Ecore_X_Atom atom;
59    char buf[512];
60    unsigned char *data = NULL;
61    Elm_Config *config_data;
62
63    snprintf(buf, sizeof(buf), "ENLIGHTENMENT_CONFIG_%s", _elm_profile);
64    atom = ecore_x_atom_get(buf);
65    _atom_config = atom;
66    if (!ecore_x_window_prop_property_get(_root_1st,
67                                          atom, _atom[ATOM_E_CONFIG], 
68                                          8, &data, &size))
69      {
70         if (!ecore_x_window_prop_property_get(_root_1st, 
71                                               _atom[ATOM_E_CONFIG], 
72                                               _atom[ATOM_E_CONFIG], 
73                                               8, &data, &size))
74           return EINA_FALSE;
75         else
76           _atom_config = _atom[ATOM_E_CONFIG];
77      }
78    else
79      _atom_config = atom;
80    if (size < 1)
81      {
82         free(data);
83         return EINA_FALSE;
84      }
85    config_data = eet_data_descriptor_decode(_config_edd, data, size);
86    free(data);
87    if (!config_data) return EINA_FALSE;
88    _config_free();
89    _elm_config = config_data;
90    _config_apply();
91    _elm_rescale();
92    return EINA_TRUE;
93 }
94
95 static Eina_Bool
96 _prop_change(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
97 {
98    Ecore_X_Event_Window_Property *event = ev;
99
100    if (event->win == _root_1st)
101      {
102         if (event->atom == _atom[ATOM_E_SCALE])
103           {
104              unsigned int val = 1000;
105
106              if (ecore_x_window_prop_card32_get(event->win,
107                                                 event->atom,
108                                                 &val, 1) > 0)
109                {
110                   double pscale;
111
112                   pscale = _elm_config->scale;
113                   if (val > 0) _elm_config->scale = (double)val / 1000.0;
114                   if (pscale != _elm_config->scale) _elm_rescale();
115                }
116           }
117         else if (event->atom == _atom[ATOM_E_FINGER_SIZE])
118           {
119              unsigned int val = 1000;
120
121              if (ecore_x_window_prop_card32_get(event->win,
122                                                 event->atom,
123                                                 &val, 1) > 0)
124                {
125                   int pfinger_size;
126
127                   pfinger_size = _elm_config->finger_size;
128                   _elm_config->finger_size = val;
129                   if (pfinger_size != _elm_config->finger_size) _elm_rescale();
130                }
131           }
132         else if (event->atom == _atom[ATOM_E_THEME])
133           {
134              char *val = NULL;
135              
136              val = ecore_x_window_prop_string_get(event->win,
137                                                   event->atom);
138              eina_stringshare_replace(&_elm_config->theme, val);
139              if (val)
140                {
141                   _elm_theme_parse(NULL, val);
142                   free(val);
143                   _elm_rescale();
144                }
145           }
146         else if (event->atom == _atom[ATOM_E_PROFILE])
147           {
148              char *val = NULL;
149              
150              val = ecore_x_window_prop_string_get(event->win,
151                                                   event->atom);
152              eina_stringshare_replace(&_elm_config->theme, val);
153              if (val)
154                {
155                   int changed = 0;
156                   
157                   if (_elm_profile)
158                     {
159                        if (strcmp(_elm_profile, val)) changed = 1;
160                        free(_elm_profile);
161                     }
162                   _elm_profile = val;
163                   if (changed)
164                     {
165                        if (!_prop_config_get())
166                          {
167                             _config_free();
168                             _config_load();
169                             _config_apply();
170                             _elm_rescale();
171                          }
172                     }
173                }
174           }
175         else if (event->atom == _atom[ATOM_E_INPUT_PANEL])
176           {
177              unsigned int val = 0;
178
179              if (ecore_x_window_prop_card32_get(event->win,
180                                                 event->atom,
181                                                 &val, 1) > 0)
182                {
183                 edje_input_panel_enabled_set(val);
184                }
185           }
186         else if (event->atom == _atom[ATOM_E_AUTOCAPITAL])
187           {
188              unsigned int val = 0;
189
190              if (ecore_x_window_prop_card32_get(event->win,
191                                                 event->atom,
192                                                 &val, 1) > 0)
193                {
194                   edje_autocapitalization_set(val);
195                }
196           }
197         else if (event->atom == _atom[ATOM_E_AUTOPERIOD])
198           {
199              unsigned int val = 0;
200
201              if (ecore_x_window_prop_card32_get(event->win,
202                                                 event->atom,
203                                                 &val, 1) > 0)
204                {
205                   edje_autoperiod_set(val);
206                }
207           }
208         else if (((_atom_config > 0) && (event->atom == _atom_config)) ||
209                  (event->atom == _atom[ATOM_E_CONFIG]))
210           {
211              _prop_config_get();
212           }
213      }
214
215    return ECORE_CALLBACK_PASS_ON;
216 }
217 #endif
218
219 static void
220 _desc_init(void)
221 {
222    Eet_Data_Descriptor_Class eddc;
223    
224    EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Elm_Config);
225    eddc.func.str_direct_alloc = NULL;
226    eddc.func.str_direct_free = NULL;
227    
228    _config_edd = eet_data_descriptor_file_new(&eddc);
229    if (!_config_edd)
230      {
231         printf("EEEK! eet_data_descriptor_file_new() failed\n");
232         return;
233      }
234    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "engine", engine, EET_T_INT);
235    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_enable", thumbscroll_enable, EET_T_INT);
236    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_threshhold", thumbscroll_threshhold, EET_T_INT);
237    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_momentum_threshhold", thumbscroll_momentum_threshhold, EET_T_DOUBLE);
238    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_friction", thumbscroll_friction, EET_T_DOUBLE);
239    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_bounce_friction", thumbscroll_bounce_friction, EET_T_DOUBLE);
240    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "page_scroll_friction", page_scroll_friction, EET_T_DOUBLE);
241    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "bring_in_scroll_friction", bring_in_scroll_friction, EET_T_DOUBLE);
242    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "zoom_friction", zoom_friction, EET_T_DOUBLE);
243    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_bounce_enable", thumbscroll_bounce_enable, EET_T_INT);
244    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "scale", scale, EET_T_DOUBLE);
245    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "bgpixmap", bgpixmap, EET_T_INT);
246    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "compositing", compositing, EET_T_INT);
247    // EET_DATA_DESCRIPTOR_ADD_LIST(_config_edd, Elm_Config, "font_dirs", font_dirs, sub_edd);
248    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "font_hinting", font_hinting, EET_T_INT);
249    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "image_cache", image_cache, EET_T_INT);
250    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "font_cache", font_cache, EET_T_INT);
251    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "finger_size", finger_size, EET_T_INT);
252    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "fps", fps, EET_T_DOUBLE);
253    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "theme", theme, EET_T_STRING);
254    EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "modules", modules, EET_T_STRING);
255 }
256
257 static void
258 _desc_shutdown(void)
259 {
260    if (!_config_edd) return;
261    eet_data_descriptor_free(_config_edd);
262    _config_edd = NULL;
263 }
264
265 static void
266 _profile_get(void)
267 {
268    Eet_File *ef = NULL;
269    const char *home = NULL;
270    char buf[PATH_MAX], *p, *s;
271    int len = 0;
272
273    _elm_profile = strdup("default");
274    
275    // if env var - use profile without question
276    s = getenv("ELM_PROFILE");
277    if (s)
278      {
279         free(_elm_profile);
280         _elm_profile = strdup(s);
281         return;
282      }
283    
284    home = getenv("HOME");
285    if (!home) home = "/";
286    
287    // usser profile
288    snprintf(buf, sizeof(buf), "%s/.elementary/config/profile.cfg", home);
289    ef = eet_open(buf, EET_FILE_MODE_READ);
290    if (ef)
291      {
292         p = eet_read(ef, "config", &len);
293         if (p)
294           {
295              free(_elm_profile);
296              _elm_profile = malloc(len + 1);
297              memcpy(_elm_profile, p, len);
298              _elm_profile[len] = 0;
299              free(p);
300           }
301         eet_close(ef);
302         if (!p) ef = NULL;
303      }
304    if (ef) return;
305    
306    // system profile
307    snprintf(buf, sizeof(buf), "%s/config/profile.cfg", _elm_data_dir);
308    ef = eet_open(buf, EET_FILE_MODE_READ);
309    if (ef)
310      {
311         p = eet_read(ef, "config", &len);
312         if (p)
313           {
314              free(_elm_profile);
315              _elm_profile = malloc(len + 1);
316              memcpy(_elm_profile, p, len);
317              _elm_profile[len] = 0;
318              free(p);
319           }
320         eet_close(ef);
321      }
322 }
323
324 static void
325 _config_free(void)
326 {
327    const char *fontdir;
328    
329    if (!_elm_config) return;
330    EINA_LIST_FREE(_elm_config->font_dirs, fontdir)
331      {
332         eina_stringshare_del(fontdir);
333      }
334    if (_elm_config->theme) eina_stringshare_del(_elm_config->theme);
335    if (_elm_config->modules) eina_stringshare_del(_elm_config->modules);
336    free(_elm_config);
337    _elm_config = NULL;
338 }
339
340 static void
341 _config_apply(void)
342 {
343    _elm_theme_parse(NULL, _elm_config->theme);
344    if (_elm_config->modules) _elm_module_parse(_elm_config->modules);
345    ecore_animator_frametime_set(1.0 / _elm_config->fps);
346    edje_frametime_set(1.0 / _elm_config->fps);
347    edje_scale_set(_elm_config->scale);
348    edje_input_panel_enabled_set(_elm_config->input_panel_enable);
349 }
350
351 static void
352 _config_load(void)
353 {
354    Eet_File *ef = NULL;
355    char buf[PATH_MAX];
356    const char *home = NULL;
357    
358    home = getenv("HOME");
359    if (!home) home = "/";
360    
361    // user config
362    snprintf(buf, sizeof(buf), "%s/.elementary/config/%s/base.cfg", home, _elm_profile);
363    ef = eet_open(buf, EET_FILE_MODE_READ);
364    if (ef)
365      {
366         _elm_config = eet_data_read(ef, _config_edd, "config");
367         eet_close(ef);
368      }
369    if (_elm_config) return;
370    
371    // system config
372    snprintf(buf, sizeof(buf), "%s/config/%s/base.cfg", _elm_data_dir, _elm_profile);
373    ef = eet_open(buf, EET_FILE_MODE_READ);
374    if (ef)
375      {
376         _elm_config = eet_data_read(ef, _config_edd, "config");
377         eet_close(ef);
378      }
379    if (_elm_config) return;
380
381    // config load fail - defaults
382    _elm_config = ELM_NEW(Elm_Config);
383    _elm_config->engine = ELM_SOFTWARE_X11;
384    _elm_config->thumbscroll_enable = 1;
385    _elm_config->thumbscroll_threshhold = 24;
386    _elm_config->thumbscroll_momentum_threshhold = 100.0;
387    _elm_config->thumbscroll_friction = 1.0;
388    _elm_config->thumbscroll_bounce_friction = 0.5;
389    _elm_config->page_scroll_friction = 0.5;
390    _elm_config->bring_in_scroll_friction = 0.5;
391    _elm_config->zoom_friction = 0.5;
392    _elm_config->thumbscroll_bounce_enable = 1;
393    _elm_config->scale = 1.0;
394    _elm_config->bgpixmap = 0;
395    _elm_config->font_hinting = 2;
396    _elm_config->font_dirs = NULL;
397    _elm_config->image_cache = 4096;
398    _elm_config->font_cache = 512;
399    _elm_config->finger_size = 40;
400    _elm_config->compositing = 1;
401    _elm_config->fps = 60.0;
402    _elm_config->theme = eina_stringshare_add("default");
403    _elm_config->modules = NULL;
404    _elm_config->input_panel_enable = 0;
405 }
406
407 static void
408 _env_get(void)
409 {
410    char *s;
411    
412    s = getenv("ELM_ENGINE");
413    if (s)
414      {
415         if ((!strcasecmp(s, "x11")) ||
416             (!strcasecmp(s, "x")) ||
417             (!strcasecmp(s, "software-x11")) ||
418             (!strcasecmp(s, "software_x11")))
419           _elm_config->engine = ELM_SOFTWARE_X11;
420         else if ((!strcasecmp(s, "x11-16")) ||
421                  (!strcasecmp(s, "x16")) ||
422                  (!strcasecmp(s, "software-16-x11")) ||
423                  (!strcasecmp(s, "software_16_x11")))
424           _elm_config->engine = ELM_SOFTWARE_16_X11;
425         else if ((!strcasecmp(s, "xrender")) ||
426                  (!strcasecmp(s, "xr")) ||
427                  (!strcasecmp(s, "xrender-x11")) ||
428                  (!strcasecmp(s, "xrender_x11")))
429           _elm_config->engine = ELM_XRENDER_X11;
430         else if ((!strcasecmp(s, "fb")) ||
431                  (!strcasecmp(s, "software-fb")) ||
432                  (!strcasecmp(s, "software_fb")))
433           _elm_config->engine = ELM_SOFTWARE_FB;
434         else if ((!strcasecmp(s, "directfb")) ||
435                  (!strcasecmp(s, "dfb")))
436           _elm_config->engine = ELM_SOFTWARE_DIRECTFB;
437         else if ((!strcasecmp(s, "sdl")) ||
438                  (!strcasecmp(s, "software-sdl")) ||
439                  (!strcasecmp(s, "software_sdl")))
440           _elm_config->engine = ELM_SOFTWARE_SDL;
441         else if ((!strcasecmp(s, "sdl-16")) ||
442                  (!strcasecmp(s, "software-16-sdl")) ||
443                  (!strcasecmp(s, "software_16_sdl")))
444           _elm_config->engine = ELM_SOFTWARE_16_SDL;
445         else if ((!strcasecmp(s, "opengl")) ||
446                  (!strcasecmp(s, "gl")) ||
447                  (!strcasecmp(s, "opengl-x11")) ||
448                  (!strcasecmp(s, "opengl_x11")))
449           _elm_config->engine = ELM_OPENGL_X11;
450         else if ((!strcasecmp(s, "opengl-sdl")) ||
451                  (!strcasecmp(s, "opengl_sdl")) ||
452                  (!strcasecmp(s, "gl-sdl")) ||
453                  (!strcasecmp(s, "gl_sdl")))
454           _elm_config->engine = ELM_OPENGL_SDL;
455         else if ((!strcasecmp(s, "gdi")) ||
456                  (!strcasecmp(s, "software-gdi")) ||
457                  (!strcasecmp(s, "software_gdi")))
458           _elm_config->engine = ELM_SOFTWARE_WIN32;
459         else if ((!strcasecmp(s, "wince-gdi")) ||
460                  (!strcasecmp(s, "software-16-wince-gdi")) ||
461                  (!strcasecmp(s, "software_16_wince_gdi")))
462           _elm_config->engine = ELM_SOFTWARE_16_WINCE;
463      }
464
465    s = getenv("ELM_THUMBSCROLL_ENABLE");
466    if (s) _elm_config->thumbscroll_enable = atoi(s);
467    s = getenv("ELM_THUMBSCROLL_THRESHOLD");
468    if (s) _elm_config->thumbscroll_threshhold = atoi(s);
469    // FIXME: floatformat locale issues here 1.0 vs 1,0 - should just be 1.0
470    s = getenv("ELM_THUMBSCROLL_MOMENTUM_THRESHOLD");
471    if (s) _elm_config->thumbscroll_momentum_threshhold = atof(s);
472    s = getenv("ELM_THUMBSCROLL_FRICTION");
473    if (s) _elm_config->thumbscroll_friction = atof(s);
474    s = getenv("ELM_PAGE_SCROLL_FRICTION");
475    if (s) _elm_config->page_scroll_friction = atof(s);
476    s = getenv("ELM_BRING_IN_SCROLL_FRICTION");
477    if (s) _elm_config->bring_in_scroll_friction = atof(s);
478    s = getenv("ELM_ZOOM_FRICTION");
479    if (s) _elm_config->zoom_friction = atof(s);
480
481    s = getenv("ELM_THEME");
482    if (s) eina_stringshare_replace(&_elm_config->theme, s);
483
484    s = getenv("ELM_FONT_HINTING");
485    if (s)
486      {
487         if      (!strcasecmp(s, "none"))     _elm_config->font_hinting = 0;
488         else if (!strcasecmp(s, "auto"))     _elm_config->font_hinting = 1;
489         else if (!strcasecmp(s, "bytecode")) _elm_config->font_hinting = 2;
490      }
491
492    s = getenv("ELM_FONT_PATH");
493    if (s)
494      {
495         const char *p, *pp;
496         char *buf2;
497
498         EINA_LIST_FREE(_elm_config->font_dirs, p)
499           {
500              eina_stringshare_del(p);
501           }
502         
503         buf2 = alloca(strlen(s) + 1);
504         p = s;
505         pp = p;
506         for (;;)
507           {
508              if ((*p == ':') || (*p == 0))
509                {
510                   int len;
511
512                   len = p - pp;
513                   strncpy(buf2, pp, len);
514                   buf2[len] = 0;
515                   _elm_config->font_dirs = 
516                     eina_list_append(_elm_config->font_dirs, 
517                                      eina_stringshare_add(buf2));
518                   if (*p == 0) break;
519                   p++;
520                   pp = p;
521                }
522              else
523                {
524                   if (*p == 0) break;
525                   p++;
526                }
527           }
528      }
529
530    s = getenv("ELM_IMAGE_CACHE");
531    if (s) _elm_config->image_cache = atoi(s);
532
533    s = getenv("ELM_FONT_CACHE");
534    if (s) _elm_config->font_cache = atoi(s);
535
536    s = getenv("ELM_SCALE");
537    if (s) _elm_config->scale = atof(s);
538    
539    _elm_config->finger_size = (double)_elm_config->finger_size * _elm_config->scale;
540    s = getenv("ELM_FINGER_SIZE");
541    if (s) _elm_config->finger_size = atoi(s);
542
543    s = getenv("ELM_FPS");
544    if (s) _elm_config->fps = atof(s);
545    if (_elm_config->fps < 1.0) _elm_config->fps = 1.0;
546
547    s = getenv("ELM_MODULES");
548    if (s) eina_stringshare_replace(&_elm_config->modules, s);
549
550    s = getenv("ELM_INPUT_PANEL");
551    if (s) _elm_config->input_panel_enable = atoi(s);
552
553    s = getenv("ELM_AUTOCAPITAL");
554    if (s) _elm_config->autocapital = atoi(s);
555
556    s = getenv("ELM_AUTOPERIOD");
557    if (s) _elm_config->autoperiod = atoi(s);
558 }
559
560 void
561 _elm_config_init(void)
562 {
563    _desc_init();
564    _profile_get();
565    _config_load();
566    _env_get();
567    _config_apply();
568 }
569
570 void
571 _elm_config_sub_init(void)
572 {
573    if ((_elm_config->engine == ELM_SOFTWARE_X11) ||
574        (_elm_config->engine == ELM_SOFTWARE_16_X11) ||
575        (_elm_config->engine == ELM_XRENDER_X11) ||
576        (_elm_config->engine == ELM_OPENGL_X11))
577      {
578 #ifdef HAVE_ELEMENTARY_X
579         unsigned int val = 1000;
580
581         if (!ecore_x_init(NULL))
582           {
583              ERR("Cannot connect to X11 display. check $DISPLAY variable");
584              exit(1);
585           }
586         _root_1st = ecore_x_window_root_first_get();
587         
588         if (!ecore_x_screen_is_composited(0))
589           _elm_config->compositing = 0;
590
591         ecore_x_atoms_get(_atom_names, ATOM_COUNT, _atom);
592         ecore_x_event_mask_set(_root_1st,
593                                ECORE_X_EVENT_MASK_WINDOW_PROPERTY);
594         _prop_change_handler = ecore_event_handler_add
595           (ECORE_X_EVENT_WINDOW_PROPERTY, _prop_change, NULL);
596         if (!getenv("ELM_SCALE"))
597           {
598              if (ecore_x_window_prop_card32_get(_root_1st,
599                                                 _atom[ATOM_E_SCALE],
600                                                 &val, 1) > 0)
601                {
602                   if (val > 0)
603                     {
604                        _elm_config->scale = (double)val / 1000.0;
605                        // FIXME: hack until e export finger size too
606                        if (getenv("ELM_FINGER_SIZE"))
607                          _elm_config->finger_size = 40.0 * _elm_config->scale;
608                        edje_scale_set(_elm_config->scale);
609                     }
610                }
611           }
612         if (!getenv("ELM_FINGER_SIZE"))
613           {
614              if (ecore_x_window_prop_card32_get(_root_1st,
615                                                 _atom[ATOM_E_FINGER_SIZE],
616                                                 &val, 1) > 0)
617                {
618                   if (val > 0)
619                     {
620                        _elm_config->finger_size = val;
621                     }
622                }
623           }
624         if (!getenv("ELM_THEME"))
625           {
626              char *s;
627              
628              s = ecore_x_window_prop_string_get(_root_1st,
629                                                 _atom[ATOM_E_THEME]);
630              if (s)
631                {
632                   eina_stringshare_replace(&_elm_config->theme, s);
633                   _elm_theme_parse(NULL, s);
634                   free(s);
635                }
636           }
637         if (!getenv("ELM_PROFILE"))
638           {
639              char *s;
640              
641              s = ecore_x_window_prop_string_get(_root_1st,
642                                                 _atom[ATOM_E_PROFILE]);
643              if (s)
644                {
645                   int changed = 0;
646                   
647                   if (_elm_profile)
648                     {
649                        if (strcmp(_elm_profile, s)) changed = 1;
650                        free(_elm_profile);
651                     }
652                   _elm_profile = s;
653                   if (changed) _prop_config_get();
654                }
655           }
656         if (!getenv("ELM_INPUT_PANEL"))
657           {
658              if (ecore_x_window_prop_card32_get(_root_1st,
659                                                 _atom[ATOM_E_INPUT_PANEL],
660                                                 &val, 1) > 0)
661                {
662                   if (val > 0)
663                     {
664                        _elm_config->input_panel_enable = val;
665                     }
666                }
667           }
668         if (!getenv("ELM_AUTOCAPITAL"))
669           {
670              if (ecore_x_window_prop_card32_get(_root_1st,
671                                                 _atom[ATOM_E_AUTOCAPITAL],
672                                                 &val, 1) > 0)
673                {
674                   if (val > 0)
675                     {
676                        _elm_config->autocapital = val;
677                     }
678                }
679           }
680         if (!getenv("ELM_AUTOPERIOD"))
681           {
682              if (ecore_x_window_prop_card32_get(_root_1st,
683                                                 _atom[ATOM_E_AUTOPERIOD],
684                                                 &val, 1) > 0)
685                {
686                   if (val > 0)
687                     {
688                        _elm_config->autoperiod = val;
689                     }
690                }
691           }
692 #endif
693       }
694 }
695
696 void
697 _elm_config_shutdown(void)
698 {
699    if ((_elm_config->engine == ELM_SOFTWARE_X11) ||
700        (_elm_config->engine == ELM_SOFTWARE_16_X11) ||
701        (_elm_config->engine == ELM_XRENDER_X11) ||
702        (_elm_config->engine == ELM_OPENGL_X11) ||
703        (_elm_config->engine == ELM_SOFTWARE_SDL) ||
704        (_elm_config->engine == ELM_SOFTWARE_16_SDL) ||
705        (_elm_config->engine == ELM_OPENGL_SDL) ||
706        (_elm_config->engine == ELM_SOFTWARE_WIN32) ||
707        (_elm_config->engine == ELM_SOFTWARE_16_WINCE))
708      {
709 #ifdef HAVE_ELEMENTARY_X
710         ecore_event_handler_del(_prop_change_handler);
711         _prop_change_handler = NULL;
712 #endif
713      }
714    _config_free();
715    if (_elm_profile)
716      {
717         free(_elm_profile);
718         _elm_profile = NULL;
719      }
720    _desc_shutdown();
721 }
722
723 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/