2 # include "elementary_config.h"
9 #include <Elementary.h>
12 Elm_Config *_elm_config = NULL;
13 char *_elm_profile = NULL;
14 static Eet_Data_Descriptor *_config_edd = NULL;
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);
24 #ifdef HAVE_ELEMENTARY_X
25 static Ecore_Event_Handler *_prop_change_handler = NULL;
26 static Ecore_X_Window _root_1st = 0;
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] =
33 "ENLIGHTENMENT_SCALE",
34 "ENLIGHTENMENT_FINGER_SIZE",
35 "ENLIGHTENMENT_THEME",
36 "ENLIGHTENMENT_PROFILE",
37 "ENLIGHTENMENT_CONFIG"
39 #define ATOM_E_SCALE 0
40 #define ATOM_E_FINGER_SIZE 1
41 #define ATOM_E_THEME 2
42 #define ATOM_E_PROFILE 3
43 #define ATOM_E_CONFIG 4
45 static Eina_Bool _prop_config_get(void);
46 static int _prop_change(void *data __UNUSED__, int ev_type __UNUSED__, void *ev);
49 _prop_config_get(void)
54 unsigned char *data = NULL, *config_data;
56 snprintf(buf, sizeof(buf), "ENLIGHTENMENT_CONFIG_%s", _elm_profile);
57 atom = ecore_x_atom_get(buf);
59 if (!ecore_x_window_prop_property_get(_root_1st,
60 atom, _atom[ATOM_E_CONFIG],
63 if (!ecore_x_window_prop_property_get(_root_1st,
69 _atom_config = _atom[ATOM_E_CONFIG];
78 config_data = eet_data_descriptor_decode(_config_edd, data, size);
80 if (!config_data) return EINA_FALSE;
82 _elm_config = config_data;
89 _prop_change(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
91 Ecore_X_Event_Window_Property *event = ev;
93 if (event->win == _root_1st)
95 if (event->atom == _atom[ATOM_E_SCALE])
97 unsigned int val = 1000;
99 if (ecore_x_window_prop_card32_get(event->win,
105 pscale = _elm_config->scale;
106 if (val > 0) _elm_config->scale = (double)val / 1000.0;
107 if (pscale != _elm_config->scale) _elm_rescale();
110 else if (event->atom == _atom[ATOM_E_FINGER_SIZE])
112 unsigned int val = 1000;
114 if (ecore_x_window_prop_card32_get(event->win,
120 pfinger_size = _elm_config->finger_size;
121 _elm_config->finger_size = val;
122 if (pfinger_size != _elm_config->finger_size) _elm_rescale();
125 else if (event->atom == _atom[ATOM_E_THEME])
129 val = ecore_x_window_prop_string_get(event->win,
131 eina_stringshare_replace(&_elm_config->theme, val);
134 _elm_theme_parse(NULL, val);
139 else if (event->atom == _atom[ATOM_E_PROFILE])
143 val = ecore_x_window_prop_string_get(event->win,
145 eina_stringshare_replace(&_elm_config->theme, val);
152 if (strcmp(_elm_profile, val)) changed = 1;
158 if (!_prop_config_get())
168 else if (((_atom_config > 0) && (event->atom == _atom_config)) ||
169 (event->atom == _atom[ATOM_E_CONFIG]))
181 Eet_Data_Descriptor_Class eddc;
183 EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Elm_Config);
184 eddc.func.str_direct_alloc = NULL;
185 eddc.func.str_direct_free = NULL;
187 _config_edd = eet_data_descriptor_file_new(&eddc);
190 printf("EEEK! eet_data_descriptor_file_new() failed\n");
193 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "engine", engine, EET_T_INT);
194 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_enable", thumbscroll_enable, EET_T_INT);
195 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_threshhold", thumbscroll_threshhold, EET_T_INT);
196 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_momentum_threshhold", thumbscroll_momentum_threshhold, EET_T_DOUBLE);
197 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_friction", thumbscroll_friction, EET_T_DOUBLE);
198 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_bounce_friction", thumbscroll_bounce_friction, EET_T_DOUBLE);
199 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "page_scroll_friction", page_scroll_friction, EET_T_DOUBLE);
200 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "bring_in_scroll_friction", bring_in_scroll_friction, EET_T_DOUBLE);
201 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "zoom_friction", zoom_friction, EET_T_DOUBLE);
202 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "thumbscroll_bounce_enable", thumbscroll_bounce_enable, EET_T_INT);
203 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "scale", scale, EET_T_DOUBLE);
204 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "bgpixmap", bgpixmap, EET_T_INT);
205 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "compositing", compositing, EET_T_INT);
206 // EET_DATA_DESCRIPTOR_ADD_LIST(_config_edd, Elm_Config, "font_dirs", font_dirs, sub_edd);
207 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "font_hinting", font_hinting, EET_T_INT);
208 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "image_cache", image_cache, EET_T_INT);
209 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "font_cache", font_cache, EET_T_INT);
210 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "finger_size", finger_size, EET_T_INT);
211 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "fps", fps, EET_T_DOUBLE);
212 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "theme", theme, EET_T_STRING);
213 EET_DATA_DESCRIPTOR_ADD_BASIC(_config_edd, Elm_Config, "modules", modules, EET_T_STRING);
219 if (!_config_edd) return;
220 eet_data_descriptor_free(_config_edd);
228 const char *home = NULL;
229 char buf[PATH_MAX], *p, *s;
232 _elm_profile = strdup("default");
234 // if env var - use profile without question
235 s = getenv("ELM_PROFILE");
239 _elm_profile = strdup(s);
243 home = getenv("HOME");
244 if (!home) home = "/";
247 snprintf(buf, sizeof(buf), "%s/.elementary/config/profile.cfg", home);
248 ef = eet_open(buf, EET_FILE_MODE_READ);
251 p = eet_read(ef, "config", &len);
255 _elm_profile = malloc(len + 1);
256 memcpy(_elm_profile, p, len);
257 _elm_profile[len] = 0;
266 snprintf(buf, sizeof(buf), "%s/config/profile.cfg", _elm_data_dir);
267 ef = eet_open(buf, EET_FILE_MODE_READ);
270 p = eet_read(ef, "config", &len);
274 _elm_profile = malloc(len + 1);
275 memcpy(_elm_profile, p, len);
276 _elm_profile[len] = 0;
288 if (!_elm_config) return;
289 EINA_LIST_FREE(_elm_config->font_dirs, fontdir)
291 eina_stringshare_del(fontdir);
293 if (_elm_config->theme) eina_stringshare_del(_elm_config->theme);
294 if (_elm_config->modules) eina_stringshare_del(_elm_config->modules);
302 _elm_theme_parse(NULL, _elm_config->theme);
303 if (_elm_config->modules) _elm_module_parse(_elm_config->modules);
304 ecore_animator_frametime_set(1.0 / _elm_config->fps);
305 edje_frametime_set(1.0 / _elm_config->fps);
306 edje_scale_set(_elm_config->scale);
314 const char *home = NULL;
316 home = getenv("HOME");
317 if (!home) home = "/";
320 snprintf(buf, sizeof(buf), "%s/.elementary/config/%s/base.cfg", home, _elm_profile);
321 ef = eet_open(buf, EET_FILE_MODE_READ);
324 _elm_config = eet_data_read(ef, _config_edd, "config");
327 if (_elm_config) return;
330 snprintf(buf, sizeof(buf), "%s/config/%s/base.cfg", _elm_data_dir, _elm_profile);
331 ef = eet_open(buf, EET_FILE_MODE_READ);
334 _elm_config = eet_data_read(ef, _config_edd, "config");
337 if (_elm_config) return;
339 // config load fail - defaults
340 _elm_config = ELM_NEW(Elm_Config);
341 _elm_config->engine = ELM_SOFTWARE_X11;
342 _elm_config->thumbscroll_enable = 1;
343 _elm_config->thumbscroll_threshhold = 24;
344 _elm_config->thumbscroll_momentum_threshhold = 100.0;
345 _elm_config->thumbscroll_friction = 1.0;
346 _elm_config->thumbscroll_bounce_friction = 0.5;
347 _elm_config->page_scroll_friction = 0.5;
348 _elm_config->bring_in_scroll_friction = 0.5;
349 _elm_config->zoom_friction = 0.5;
350 _elm_config->thumbscroll_bounce_enable = 1;
351 _elm_config->scale = 1.0;
352 _elm_config->bgpixmap = 0;
353 _elm_config->font_hinting = 2;
354 _elm_config->font_dirs = NULL;
355 _elm_config->image_cache = 4096;
356 _elm_config->font_cache = 512;
357 _elm_config->finger_size = 40;
358 _elm_config->compositing = 1;
359 _elm_config->fps = 60.0;
360 _elm_config->theme = eina_stringshare_add("default");
361 _elm_config->modules = NULL;
369 s = getenv("ELM_ENGINE");
372 if ((!strcasecmp(s, "x11")) ||
373 (!strcasecmp(s, "x")) ||
374 (!strcasecmp(s, "software-x11")) ||
375 (!strcasecmp(s, "software_x11")))
376 _elm_config->engine = ELM_SOFTWARE_X11;
377 else if ((!strcasecmp(s, "x11-16")) ||
378 (!strcasecmp(s, "x16")) ||
379 (!strcasecmp(s, "software-16-x11")) ||
380 (!strcasecmp(s, "software_16_x11")))
381 _elm_config->engine = ELM_SOFTWARE_16_X11;
382 else if ((!strcasecmp(s, "xrender")) ||
383 (!strcasecmp(s, "xr")) ||
384 (!strcasecmp(s, "xrender-x11")) ||
385 (!strcasecmp(s, "xrender_x11")))
386 _elm_config->engine = ELM_XRENDER_X11;
387 else if ((!strcasecmp(s, "fb")) ||
388 (!strcasecmp(s, "software-fb")) ||
389 (!strcasecmp(s, "software_fb")))
390 _elm_config->engine = ELM_SOFTWARE_FB;
391 else if ((!strcasecmp(s, "directfb")) ||
392 (!strcasecmp(s, "dfb")))
393 _elm_config->engine = ELM_SOFTWARE_DIRECTFB;
394 else if ((!strcasecmp(s, "sdl")) ||
395 (!strcasecmp(s, "software-sdl")) ||
396 (!strcasecmp(s, "software_sdl")))
397 _elm_config->engine = ELM_SOFTWARE_SDL;
398 else if ((!strcasecmp(s, "sdl-16")) ||
399 (!strcasecmp(s, "software-16-sdl")) ||
400 (!strcasecmp(s, "software_16_sdl")))
401 _elm_config->engine = ELM_SOFTWARE_16_SDL;
402 else if ((!strcasecmp(s, "opengl")) ||
403 (!strcasecmp(s, "gl")) ||
404 (!strcasecmp(s, "opengl-x11")) ||
405 (!strcasecmp(s, "opengl_x11")))
406 _elm_config->engine = ELM_OPENGL_X11;
407 else if ((!strcasecmp(s, "opengl-sdl")) ||
408 (!strcasecmp(s, "opengl_sdl")) ||
409 (!strcasecmp(s, "gl-sdl")) ||
410 (!strcasecmp(s, "gl_sdl")))
411 _elm_config->engine = ELM_OPENGL_SDL;
412 else if ((!strcasecmp(s, "gdi")) ||
413 (!strcasecmp(s, "software-gdi")) ||
414 (!strcasecmp(s, "software_gdi")))
415 _elm_config->engine = ELM_SOFTWARE_WIN32;
416 else if ((!strcasecmp(s, "wince-gdi")) ||
417 (!strcasecmp(s, "software-16-wince-gdi")) ||
418 (!strcasecmp(s, "software_16_wince_gdi")))
419 _elm_config->engine = ELM_SOFTWARE_16_WINCE;
422 s = getenv("ELM_THUMBSCROLL_ENABLE");
423 if (s) _elm_config->thumbscroll_enable = atoi(s);
424 s = getenv("ELM_THUMBSCROLL_THRESHOLD");
425 if (s) _elm_config->thumbscroll_threshhold = atoi(s);
426 // FIXME: floatformat locale issues here 1.0 vs 1,0 - should just be 1.0
427 s = getenv("ELM_THUMBSCROLL_MOMENTUM_THRESHOLD");
428 if (s) _elm_config->thumbscroll_momentum_threshhold = atof(s);
429 s = getenv("ELM_THUMBSCROLL_FRICTION");
430 if (s) _elm_config->thumbscroll_friction = atof(s);
431 s = getenv("ELM_PAGE_SCROLL_FRICTION");
432 if (s) _elm_config->page_scroll_friction = atof(s);
433 s = getenv("ELM_BRING_IN_SCROLL_FRICTION");
434 if (s) _elm_config->bring_in_scroll_friction = atof(s);
435 s = getenv("ELM_ZOOM_FRICTION");
436 if (s) _elm_config->zoom_friction = atof(s);
438 s = getenv("ELM_THEME");
439 if (s) eina_stringshare_replace(&_elm_config->theme, s);
441 s = getenv("ELM_FONT_HINTING");
444 if (!strcasecmp(s, "none")) _elm_config->font_hinting = 0;
445 else if (!strcasecmp(s, "auto")) _elm_config->font_hinting = 1;
446 else if (!strcasecmp(s, "bytecode")) _elm_config->font_hinting = 2;
449 s = getenv("ELM_FONT_PATH");
455 EINA_LIST_FREE(_elm_config->font_dirs, p)
457 eina_stringshare_del(p);
460 buf2 = alloca(strlen(s) + 1);
465 if ((*p == ':') || (*p == 0))
470 strncpy(buf2, pp, len);
472 _elm_config->font_dirs =
473 eina_list_append(_elm_config->font_dirs,
474 eina_stringshare_add(buf2));
487 s = getenv("ELM_IMAGE_CACHE");
488 if (s) _elm_config->image_cache = atoi(s);
490 s = getenv("ELM_FONT_CACHE");
491 if (s) _elm_config->font_cache = atoi(s);
493 s = getenv("ELM_SCALE");
494 if (s) _elm_config->scale = atof(s);
496 _elm_config->finger_size = (double)_elm_config->finger_size * _elm_config->scale;
497 s = getenv("ELM_FINGER_SIZE");
498 if (s) _elm_config->finger_size = atoi(s);
500 s = getenv("ELM_FPS");
501 if (s) _elm_config->fps = atof(s);
502 if (_elm_config->fps < 1.0) _elm_config->fps = 1.0;
504 s = getenv("ELM_MODULES");
505 if (s) eina_stringshare_replace(&_elm_config->modules, s);
509 _elm_config_init(void)
519 _elm_config_sub_init(void)
521 if ((_elm_config->engine == ELM_SOFTWARE_X11) ||
522 (_elm_config->engine == ELM_SOFTWARE_16_X11) ||
523 (_elm_config->engine == ELM_XRENDER_X11) ||
524 (_elm_config->engine == ELM_OPENGL_X11))
526 #ifdef HAVE_ELEMENTARY_X
527 unsigned int val = 1000;
529 if (!ecore_x_init(NULL))
531 ERR("Cannot connect to X11 display. check $DISPLAY variable");
534 _root_1st = ecore_x_window_root_first_get();
536 if (!ecore_x_screen_is_composited(0))
537 _elm_config->compositing = 0;
539 ecore_x_atoms_get(_atom_names, ATOM_COUNT, _atom);
540 ecore_x_event_mask_set(_root_1st,
541 ECORE_X_EVENT_MASK_WINDOW_PROPERTY);
542 _prop_change_handler = ecore_event_handler_add
543 (ECORE_X_EVENT_WINDOW_PROPERTY, _prop_change, NULL);
544 if (!getenv("ELM_SCALE"))
546 if (ecore_x_window_prop_card32_get(_root_1st,
552 _elm_config->scale = (double)val / 1000.0;
553 // FIXME: hack until e export finger size too
554 if (getenv("ELM_FINGER_SIZE"))
555 _elm_config->finger_size = 40.0 * _elm_config->scale;
556 edje_scale_set(_elm_config->scale);
560 if (!getenv("ELM_FINGER_SIZE"))
562 if (ecore_x_window_prop_card32_get(_root_1st,
563 _atom[ATOM_E_FINGER_SIZE],
568 _elm_config->finger_size = val;
572 if (!getenv("ELM_THEME"))
576 s = ecore_x_window_prop_string_get(_root_1st,
577 _atom[ATOM_E_THEME]);
580 eina_stringshare_replace(&_elm_config->theme, s);
581 _elm_theme_parse(NULL, s);
585 if (!getenv("ELM_PROFILE"))
589 s = ecore_x_window_prop_string_get(_root_1st,
590 _atom[ATOM_E_PROFILE]);
597 if (strcmp(_elm_profile, s)) changed = 1;
601 if (changed) _prop_config_get();
609 _elm_config_shutdown(void)
611 if ((_elm_config->engine == ELM_SOFTWARE_X11) ||
612 (_elm_config->engine == ELM_SOFTWARE_16_X11) ||
613 (_elm_config->engine == ELM_XRENDER_X11) ||
614 (_elm_config->engine == ELM_OPENGL_X11) ||
615 (_elm_config->engine == ELM_SOFTWARE_SDL) ||
616 (_elm_config->engine == ELM_SOFTWARE_16_SDL) ||
617 (_elm_config->engine == ELM_OPENGL_SDL) ||
618 (_elm_config->engine == ELM_SOFTWARE_WIN32) ||
619 (_elm_config->engine == ELM_SOFTWARE_16_WINCE))
621 #ifdef HAVE_ELEMENTARY_X
622 ecore_event_handler_del(_prop_change_handler);
623 _prop_change_handler = NULL;