ffc2d466a972fe9330be91a1666bb2dde784e903
[platform/core/uifw/e17.git] / src / bin / e_config.c
1 #include "e.h"
2
3 #if ((E17_PROFILE >= LOWRES_PDA) && (E17_PROFILE <= HIRES_PDA))
4 #define DEF_MENUCLICK 1.25
5 #else
6 #define DEF_MENUCLICK 0.25
7 #endif
8
9 #define RANDR_SERIALIZED_SETUP_11 ((int)((1 << 16) | 1))
10 #define RANDR_SERIALIZED_SETUP_12 ((int)((1 << 16) | 2))
11 #define RANDR_SERIALIZED_SETUP_13 ((int)((1 << 16) | 3))
12
13 EAPI E_Config *e_config = NULL;
14
15 static int _e_config_revisions = 9;
16
17 /* local subsystem functions */
18 static void _e_config_save_cb(void *data);
19 static void _e_config_free(E_Config *cfg);
20 static Eina_Bool _e_config_cb_timer(void *data);
21 static int _e_config_eet_close_handle(Eet_File *ef, char *file);
22 static void _e_config_acpi_bindings_add(void);
23
24 /* local subsystem globals */
25 static int _e_config_save_block = 0;
26 static E_Powersave_Deferred_Action *_e_config_save_defer = NULL;
27 static char *_e_config_profile = NULL;
28
29 static E_Config_DD *_e_config_edd = NULL;
30 static E_Config_DD *_e_config_module_edd = NULL;
31 static E_Config_DD *_e_config_font_fallback_edd = NULL;
32 static E_Config_DD *_e_config_font_default_edd = NULL;
33 static E_Config_DD *_e_config_theme_edd = NULL;
34 static E_Config_DD *_e_config_bindings_mouse_edd = NULL;
35 static E_Config_DD *_e_config_bindings_key_edd = NULL;
36 static E_Config_DD *_e_config_bindings_edge_edd = NULL;
37 static E_Config_DD *_e_config_bindings_signal_edd = NULL;
38 static E_Config_DD *_e_config_bindings_wheel_edd = NULL;
39 static E_Config_DD *_e_config_bindings_acpi_edd = NULL;
40 static E_Config_DD *_e_config_path_append_edd = NULL;
41 static E_Config_DD *_e_config_desktop_bg_edd = NULL;
42 static E_Config_DD *_e_config_desktop_name_edd = NULL;
43 static E_Config_DD *_e_config_desktop_window_profile_edd = NULL;
44 static E_Config_DD *_e_config_remember_edd = NULL;
45 static E_Config_DD *_e_config_color_class_edd = NULL;
46 static E_Config_DD *_e_config_gadcon_edd = NULL;
47 static E_Config_DD *_e_config_gadcon_client_edd = NULL;
48 static E_Config_DD *_e_config_shelf_edd = NULL;
49 static E_Config_DD *_e_config_shelf_desk_edd = NULL;
50 static E_Config_DD *_e_config_mime_icon_edd = NULL;
51 static E_Config_DD *_e_config_syscon_action_edd = NULL;
52 static E_Config_DD *_e_config_env_var_edd = NULL;
53 static E_Config_DD *_e_config_randr_size_edd = NULL;
54 static E_Config_DD *_e_config_randr_size_mm_edd = NULL;
55 static E_Config_DD *_e_config_randr_edid_hash_edd = NULL;
56 static E_Config_DD *_e_config_randr_serialized_setup_edd = NULL;
57 static E_Config_DD *_e_config_randr_serialized_setup_11_edd = NULL;
58 static E_Config_DD *_e_config_randr_serialized_setup_12_edd = NULL;
59 static E_Config_DD *_e_config_randr_serialized_output_policy_edd = NULL;
60 static E_Config_DD *_e_config_randr_serialized_output_edd = NULL;
61 static E_Config_DD *_e_config_randr_mode_info_edd = NULL;
62 static E_Config_DD *_e_config_randr_serialized_crtc_edd = NULL;
63
64
65 EAPI int E_EVENT_CONFIG_ICON_THEME = 0;
66 EAPI int E_EVENT_CONFIG_MODE_CHANGED = 0;
67 EAPI int E_EVENT_CONFIG_LOADED = 0;
68
69 static E_Dialog *_e_config_error_dialog = NULL;
70
71 static void
72 _e_config_error_dialog_cb_delete(void *dia)
73 {
74    if (dia == _e_config_error_dialog)
75      _e_config_error_dialog = NULL;
76 }
77
78 static char *
79 _e_config_profile_name_get(Eet_File *ef)
80 {
81    /* profile config exists */
82    char *data, *s = NULL;
83    int data_len = 0;
84
85    data = eet_read(ef, "config", &data_len);
86    if ((data) && (data_len > 0))
87      {
88         int ok = 1;
89
90         for (s = data; s < (data + data_len); s++)
91           {
92              // if profile is not all ascii (valid printable ascii - no
93              // control codes etc.) or it contains a '/' (invalid as its a
94              // directory delimiter) - then it's invalid
95              if ((*s < ' ') || (*s > '~') || (*s == '/'))
96                {
97                   ok = 0;
98                   break;
99                }
100           }
101         s = NULL;
102         if (ok)
103           {
104              s = malloc(data_len + 1);
105              if (s)
106                {
107                   memcpy(s, data, data_len);
108                   s[data_len] = 0;
109                }
110           }
111         free(data);
112      }
113    return s;
114 }
115
116 /* externally accessible functions */
117 EINTERN int
118 e_config_init(void)
119 {
120    E_EVENT_CONFIG_ICON_THEME = ecore_event_type_new();
121    E_EVENT_CONFIG_MODE_CHANGED = ecore_event_type_new();
122    E_EVENT_CONFIG_LOADED = ecore_event_type_new();
123
124    _e_config_profile = getenv("E_CONF_PROFILE");
125
126    if (_e_config_profile)
127      {
128         /* if environment var set - use this profile name */
129         _e_config_profile = strdup(_e_config_profile);
130      }
131    else
132      {
133         Eet_File *ef;
134         char buf[PATH_MAX];
135
136         /* try user profile config */
137         e_user_dir_concat_static(buf, "config/profile.cfg");
138         ef = eet_open(buf, EET_FILE_MODE_READ);
139         if (ef)
140           {
141              _e_config_profile = _e_config_profile_name_get(ef);
142              eet_close(ef);
143              ef = NULL;
144           }
145         if (!_e_config_profile)
146           {
147              int i;
148
149              for (i = 1; i <= _e_config_revisions; i++)
150                {
151                   e_user_dir_snprintf(buf, sizeof(buf), "config/profile.%i.cfg", i);
152                   ef = eet_open(buf, EET_FILE_MODE_READ);
153                   if (ef)
154                     {
155                        _e_config_profile = _e_config_profile_name_get(ef);
156                        eet_close(ef);
157                        ef = NULL;
158                        if (_e_config_profile) break;
159                     }
160                }
161              if (!_e_config_profile)
162                {
163                   /* use system if no user profile config */
164                   e_prefix_data_concat_static(buf, "data/config/profile.cfg");
165                   ef = eet_open(buf, EET_FILE_MODE_READ);
166                }
167           }
168         if (ef)
169           {
170              _e_config_profile = _e_config_profile_name_get(ef);
171              eet_close(ef);
172              ef = NULL;
173           }
174         if (!_e_config_profile)
175           {
176              /* no profile config - try other means */
177              char *link = NULL;
178
179              /* check symlink - if default is a symlink to another dir */
180              e_prefix_data_concat_static(buf, "data/config/default");
181              link = ecore_file_readlink(buf);
182              /* if so use just the filename as the profile - must be a local link */
183              if (link)
184                {
185                   _e_config_profile = strdup(ecore_file_file_get(link));
186                   free(link);
187                }
188              else
189                _e_config_profile = strdup("default");
190           }
191         if (!getenv("E_CONF_PROFILE"))
192           e_util_env_set("E_CONF_PROFILE", _e_config_profile);
193      }
194
195    _e_config_gadcon_client_edd = E_CONFIG_DD_NEW("E_Config_Gadcon_Client", E_Config_Gadcon_Client);
196 #undef T
197 #undef D
198 #define T E_Config_Gadcon_Client
199 #define D _e_config_gadcon_client_edd
200    E_CONFIG_VAL(D, T, name, STR);
201    E_CONFIG_VAL(D, T, id, STR);
202    E_CONFIG_VAL(D, T, geom.pos, INT);
203    E_CONFIG_VAL(D, T, geom.size, INT);
204    E_CONFIG_VAL(D, T, geom.res, INT);
205    E_CONFIG_VAL(D, T, geom.pos_x, DOUBLE);
206    E_CONFIG_VAL(D, T, geom.pos_y, DOUBLE);
207    E_CONFIG_VAL(D, T, geom.size_w, DOUBLE);
208    E_CONFIG_VAL(D, T, geom.size_h, DOUBLE);
209    E_CONFIG_VAL(D, T, state_info.seq, INT);
210    E_CONFIG_VAL(D, T, state_info.flags, INT);
211    E_CONFIG_VAL(D, T, style, STR);
212    E_CONFIG_VAL(D, T, orient, INT);
213    E_CONFIG_VAL(D, T, autoscroll, UCHAR);
214    E_CONFIG_VAL(D, T, resizable, UCHAR);
215
216    _e_config_gadcon_edd = E_CONFIG_DD_NEW("E_Config_Gadcon", E_Config_Gadcon);
217 #undef T
218 #undef D
219 #define T E_Config_Gadcon
220 #define D _e_config_gadcon_edd
221    E_CONFIG_VAL(D, T, name, STR);
222    E_CONFIG_VAL(D, T, id, INT);
223    E_CONFIG_VAL(D, T, zone, INT);
224    E_CONFIG_LIST(D, T, clients, _e_config_gadcon_client_edd);
225
226    _e_config_shelf_desk_edd = E_CONFIG_DD_NEW("E_Config_Shelf_Desk", E_Config_Shelf_Desk);
227 #undef T
228 #undef D
229 #define T E_Config_Shelf_Desk
230 #define D _e_config_shelf_desk_edd
231    E_CONFIG_VAL(D, T, x, INT);
232    E_CONFIG_VAL(D, T, y, INT);
233
234    _e_config_shelf_edd = E_CONFIG_DD_NEW("E_Config_Shelf", E_Config_Shelf);
235 #undef T
236 #undef D
237 #define T E_Config_Shelf
238 #define D _e_config_shelf_edd
239    E_CONFIG_VAL(D, T, name, STR);
240    E_CONFIG_VAL(D, T, id, INT);
241    E_CONFIG_VAL(D, T, container, INT);
242    E_CONFIG_VAL(D, T, zone, INT);
243    E_CONFIG_VAL(D, T, layer, INT);
244    E_CONFIG_VAL(D, T, popup, UCHAR);
245    E_CONFIG_VAL(D, T, orient, INT);
246    E_CONFIG_VAL(D, T, fit_along, UCHAR);
247    E_CONFIG_VAL(D, T, fit_size, UCHAR);
248    E_CONFIG_VAL(D, T, style, STR);
249    E_CONFIG_VAL(D, T, size, INT);
250    E_CONFIG_VAL(D, T, overlap, INT);
251    E_CONFIG_VAL(D, T, autohide, INT);
252    E_CONFIG_VAL(D, T, autohide_show_action, INT);
253    E_CONFIG_VAL(D, T, hide_timeout, FLOAT);
254    E_CONFIG_VAL(D, T, hide_duration, FLOAT);
255    E_CONFIG_VAL(D, T, desk_show_mode, INT);
256    E_CONFIG_LIST(D, T, desk_list, _e_config_shelf_desk_edd);
257
258    _e_config_desktop_bg_edd = E_CONFIG_DD_NEW("E_Config_Desktop_Background", E_Config_Desktop_Background);
259 #undef T
260 #undef D
261 #define T E_Config_Desktop_Background
262 #define D _e_config_desktop_bg_edd
263    E_CONFIG_VAL(D, T, container, INT);
264    E_CONFIG_VAL(D, T, zone, INT);
265    E_CONFIG_VAL(D, T, desk_x, INT);
266    E_CONFIG_VAL(D, T, desk_y, INT);
267    E_CONFIG_VAL(D, T, file, STR);
268
269    _e_config_desktop_name_edd = E_CONFIG_DD_NEW("E_Config_Desktop_Name", E_Config_Desktop_Name);
270 #undef T
271 #undef D
272 #define T E_Config_Desktop_Name
273 #define D _e_config_desktop_name_edd
274    E_CONFIG_VAL(D, T, container, INT);
275    E_CONFIG_VAL(D, T, zone, INT);
276    E_CONFIG_VAL(D, T, desk_x, INT);
277    E_CONFIG_VAL(D, T, desk_y, INT);
278    E_CONFIG_VAL(D, T, name, STR);
279
280    _e_config_desktop_window_profile_edd = E_CONFIG_DD_NEW("E_Config_Desktop_Window_Profile", E_Config_Desktop_Window_Profile);
281 #undef T
282 #undef D
283 #define T E_Config_Desktop_Window_Profile
284 #define D _e_config_desktop_window_profile_edd
285    E_CONFIG_VAL(D, T, container, INT);
286    E_CONFIG_VAL(D, T, zone, INT);
287    E_CONFIG_VAL(D, T, desk_x, INT);
288    E_CONFIG_VAL(D, T, desk_y, INT);
289    E_CONFIG_VAL(D, T, profile, STR);
290
291    _e_config_path_append_edd = E_CONFIG_DD_NEW("E_Path_Dir", E_Path_Dir);
292 #undef T
293 #undef D
294 #define T E_Path_Dir
295 #define D _e_config_path_append_edd
296    E_CONFIG_VAL(D, T, dir, STR);
297
298    _e_config_theme_edd = E_CONFIG_DD_NEW("E_Config_Theme", E_Config_Theme);
299 #undef T
300 #undef D
301 #define T E_Config_Theme
302 #define D _e_config_theme_edd
303    E_CONFIG_VAL(D, T, category, STR);
304    E_CONFIG_VAL(D, T, file, STR);
305
306    _e_config_module_edd = E_CONFIG_DD_NEW("E_Config_Module", E_Config_Module);
307 #undef T
308 #undef D
309 #define T E_Config_Module
310 #define D _e_config_module_edd
311    E_CONFIG_VAL(D, T, name, STR);
312    E_CONFIG_VAL(D, T, enabled, UCHAR);
313    E_CONFIG_VAL(D, T, delayed, UCHAR);
314    E_CONFIG_VAL(D, T, priority, INT);
315
316    _e_config_font_default_edd = E_CONFIG_DD_NEW("E_Font_Default",
317                                                 E_Font_Default);
318 #undef T
319 #undef D
320 #define T E_Font_Default
321 #define D _e_config_font_default_edd
322    E_CONFIG_VAL(D, T, text_class, STR);
323    E_CONFIG_VAL(D, T, font, STR);
324    E_CONFIG_VAL(D, T, size, INT);
325
326    _e_config_font_fallback_edd = E_CONFIG_DD_NEW("E_Font_Fallback",
327                                                   E_Font_Fallback);
328 #undef T
329 #undef D
330 #define T E_Font_Fallback
331 #define D _e_config_font_fallback_edd
332    E_CONFIG_VAL(D, T, name, STR);
333
334    _e_config_bindings_mouse_edd = E_CONFIG_DD_NEW("E_Config_Binding_Mouse",
335                                                   E_Config_Binding_Mouse);
336 #undef T
337 #undef D
338 #define T E_Config_Binding_Mouse
339 #define D _e_config_bindings_mouse_edd
340    E_CONFIG_VAL(D, T, context, INT);
341    E_CONFIG_VAL(D, T, modifiers, INT);
342    E_CONFIG_VAL(D, T, action, STR);
343    E_CONFIG_VAL(D, T, params, STR);
344    E_CONFIG_VAL(D, T, button, UCHAR);
345    E_CONFIG_VAL(D, T, any_mod, UCHAR);
346
347    _e_config_bindings_key_edd = E_CONFIG_DD_NEW("E_Config_Binding_Key",
348                                                 E_Config_Binding_Key);
349 #undef T
350 #undef D
351 #define T E_Config_Binding_Key
352 #define D _e_config_bindings_key_edd
353    E_CONFIG_VAL(D, T, context, INT);
354    E_CONFIG_VAL(D, T, modifiers, INT);
355    E_CONFIG_VAL(D, T, key, STR);
356    E_CONFIG_VAL(D, T, action, STR);
357    E_CONFIG_VAL(D, T, params, STR);
358    E_CONFIG_VAL(D, T, any_mod, UCHAR);
359
360    _e_config_bindings_edge_edd = E_CONFIG_DD_NEW("E_Config_Binding_Edge",
361                                                   E_Config_Binding_Edge);
362 #undef T
363 #undef D
364 #define T E_Config_Binding_Edge
365 #define D _e_config_bindings_edge_edd
366    E_CONFIG_VAL(D, T, context, INT);
367    E_CONFIG_VAL(D, T, modifiers, INT);
368    E_CONFIG_VAL(D, T, action, STR);
369    E_CONFIG_VAL(D, T, params, STR);
370    E_CONFIG_VAL(D, T, edge, UCHAR);
371    E_CONFIG_VAL(D, T, any_mod, UCHAR);
372    E_CONFIG_VAL(D, T, delay, FLOAT);
373
374    _e_config_bindings_signal_edd = E_CONFIG_DD_NEW("E_Config_Binding_Signal",
375                                                    E_Config_Binding_Signal);
376 #undef T
377 #undef D
378 #define T E_Config_Binding_Signal
379 #define D _e_config_bindings_signal_edd
380    E_CONFIG_VAL(D, T, context, INT);
381    E_CONFIG_VAL(D, T, signal, STR);
382    E_CONFIG_VAL(D, T, source, STR);
383    E_CONFIG_VAL(D, T, modifiers, INT);
384    E_CONFIG_VAL(D, T, any_mod, UCHAR);
385    E_CONFIG_VAL(D, T, action, STR);
386    E_CONFIG_VAL(D, T, params, STR);
387
388    _e_config_bindings_wheel_edd = E_CONFIG_DD_NEW("E_Config_Binding_Wheel",
389                                                   E_Config_Binding_Wheel);
390 #undef T
391 #undef D
392 #define T E_Config_Binding_Wheel
393 #define D _e_config_bindings_wheel_edd
394    E_CONFIG_VAL(D, T, context, INT);
395    E_CONFIG_VAL(D, T, direction, INT);
396    E_CONFIG_VAL(D, T, z, INT);
397    E_CONFIG_VAL(D, T, modifiers, INT);
398    E_CONFIG_VAL(D, T, any_mod, UCHAR);
399    E_CONFIG_VAL(D, T, action, STR);
400    E_CONFIG_VAL(D, T, params, STR);
401
402    _e_config_bindings_acpi_edd = E_CONFIG_DD_NEW("E_Config_Binding_Acpi",
403                                                  E_Config_Binding_Acpi);
404 #undef T
405 #undef D
406 #define T E_Config_Binding_Acpi
407 #define D _e_config_bindings_acpi_edd
408    E_CONFIG_VAL(D, T, context, INT);
409    E_CONFIG_VAL(D, T, type, INT);
410    E_CONFIG_VAL(D, T, status, INT);
411    E_CONFIG_VAL(D, T, action, STR);
412    E_CONFIG_VAL(D, T, params, STR);
413
414    _e_config_remember_edd = E_CONFIG_DD_NEW("E_Remember", E_Remember);
415 #undef T
416 #undef D
417 #define T E_Remember
418 #define D _e_config_remember_edd
419    E_CONFIG_VAL(D, T, match, INT);
420    E_CONFIG_VAL(D, T, apply_first_only, UCHAR);
421    E_CONFIG_VAL(D, T, keep_settings, UCHAR);
422    E_CONFIG_VAL(D, T, name, STR);
423    E_CONFIG_VAL(D, T, class, STR);
424    E_CONFIG_VAL(D, T, title, STR);
425    E_CONFIG_VAL(D, T, role, STR);
426    E_CONFIG_VAL(D, T, type, INT);
427    E_CONFIG_VAL(D, T, transient, UCHAR);
428    E_CONFIG_VAL(D, T, apply, INT);
429    E_CONFIG_VAL(D, T, max_score, INT);
430    E_CONFIG_VAL(D, T, prop.pos_x, INT);
431    E_CONFIG_VAL(D, T, prop.pos_y, INT);
432    E_CONFIG_VAL(D, T, prop.res_x, INT);
433    E_CONFIG_VAL(D, T, prop.res_y, INT);
434    E_CONFIG_VAL(D, T, prop.pos_w, INT);
435    E_CONFIG_VAL(D, T, prop.pos_h, INT);
436    E_CONFIG_VAL(D, T, prop.w, INT);
437    E_CONFIG_VAL(D, T, prop.h, INT);
438    E_CONFIG_VAL(D, T, prop.layer, INT);
439    E_CONFIG_VAL(D, T, prop.lock_user_location, UCHAR);
440    E_CONFIG_VAL(D, T, prop.lock_client_location, UCHAR);
441    E_CONFIG_VAL(D, T, prop.lock_user_size, UCHAR);
442    E_CONFIG_VAL(D, T, prop.lock_client_size, UCHAR);
443    E_CONFIG_VAL(D, T, prop.lock_user_stacking, UCHAR);
444    E_CONFIG_VAL(D, T, prop.lock_client_stacking, UCHAR);
445    E_CONFIG_VAL(D, T, prop.lock_user_iconify, UCHAR);
446    E_CONFIG_VAL(D, T, prop.lock_client_iconify, UCHAR);
447    E_CONFIG_VAL(D, T, prop.lock_user_desk, UCHAR);
448    E_CONFIG_VAL(D, T, prop.lock_client_desk, UCHAR);
449    E_CONFIG_VAL(D, T, prop.lock_user_sticky, UCHAR);
450    E_CONFIG_VAL(D, T, prop.lock_client_sticky, UCHAR);
451    E_CONFIG_VAL(D, T, prop.lock_user_shade, UCHAR);
452    E_CONFIG_VAL(D, T, prop.lock_client_shade, UCHAR);
453    E_CONFIG_VAL(D, T, prop.lock_user_maximize, UCHAR);
454    E_CONFIG_VAL(D, T, prop.lock_client_maximize, UCHAR);
455    E_CONFIG_VAL(D, T, prop.lock_user_fullscreen, UCHAR);
456    E_CONFIG_VAL(D, T, prop.lock_client_fullscreen, UCHAR);
457    E_CONFIG_VAL(D, T, prop.lock_border, UCHAR);
458    E_CONFIG_VAL(D, T, prop.lock_close, UCHAR);
459    E_CONFIG_VAL(D, T, prop.lock_focus_in, UCHAR);
460    E_CONFIG_VAL(D, T, prop.lock_focus_out, UCHAR);
461    E_CONFIG_VAL(D, T, prop.lock_life, UCHAR);
462    E_CONFIG_VAL(D, T, prop.border, STR);
463    E_CONFIG_VAL(D, T, prop.sticky, UCHAR);
464    E_CONFIG_VAL(D, T, prop.shaded, UCHAR);
465    E_CONFIG_VAL(D, T, prop.skip_winlist, UCHAR);
466    E_CONFIG_VAL(D, T, prop.skip_pager, UCHAR);
467    E_CONFIG_VAL(D, T, prop.skip_taskbar, UCHAR);
468    E_CONFIG_VAL(D, T, prop.fullscreen, UCHAR);
469    E_CONFIG_VAL(D, T, prop.desk_x, INT);
470    E_CONFIG_VAL(D, T, prop.desk_y, INT);
471    E_CONFIG_VAL(D, T, prop.zone, INT);
472    E_CONFIG_VAL(D, T, prop.head, INT);
473    E_CONFIG_VAL(D, T, prop.command, STR);
474    E_CONFIG_VAL(D, T, prop.icon_preference, UCHAR);
475    E_CONFIG_VAL(D, T, prop.desktop_file, STR);
476    E_CONFIG_VAL(D, T, prop.offer_resistance, UCHAR);
477
478    _e_config_color_class_edd = E_CONFIG_DD_NEW("E_Color_Class", E_Color_Class);
479 #undef T
480 #undef D
481 #define T E_Color_Class
482 #define D _e_config_color_class_edd
483    E_CONFIG_VAL(D, T, name, STR);
484    E_CONFIG_VAL(D, T, r, INT);
485    E_CONFIG_VAL(D, T, g, INT);
486    E_CONFIG_VAL(D, T, b, INT);
487    E_CONFIG_VAL(D, T, a, INT);
488    E_CONFIG_VAL(D, T, r2, INT);
489    E_CONFIG_VAL(D, T, g2, INT);
490    E_CONFIG_VAL(D, T, b2, INT);
491    E_CONFIG_VAL(D, T, a2, INT);
492    E_CONFIG_VAL(D, T, r3, INT);
493    E_CONFIG_VAL(D, T, g3, INT);
494    E_CONFIG_VAL(D, T, b3, INT);
495    E_CONFIG_VAL(D, T, a3, INT);
496
497    _e_config_mime_icon_edd = E_CONFIG_DD_NEW("E_Config_Mime_Icon",
498                                              E_Config_Mime_Icon);
499 #undef T
500 #undef D
501 #define T E_Config_Mime_Icon
502 #define D _e_config_mime_icon_edd
503    E_CONFIG_VAL(D, T, mime, STR);
504    E_CONFIG_VAL(D, T, icon, STR);
505
506    _e_config_syscon_action_edd = E_CONFIG_DD_NEW("E_Config_Syscon_Action",
507                                                  E_Config_Syscon_Action);
508 #undef T
509 #undef D
510 #define T E_Config_Syscon_Action
511 #define D _e_config_syscon_action_edd
512    E_CONFIG_VAL(D, T, action, STR);
513    E_CONFIG_VAL(D, T, params, STR);
514    E_CONFIG_VAL(D, T, button, STR);
515    E_CONFIG_VAL(D, T, icon, STR);
516    E_CONFIG_VAL(D, T, is_main, INT);
517
518    _e_config_env_var_edd = E_CONFIG_DD_NEW("E_Config_Env_Var",
519                                            E_Config_Env_Var);
520 #undef T
521 #undef D
522 #define T E_Config_Env_Var
523 #define D _e_config_env_var_edd
524    E_CONFIG_VAL(D, T, var, STR);
525    E_CONFIG_VAL(D, T, val, STR);
526    E_CONFIG_VAL(D, T, unset, UCHAR);
527
528    _e_config_randr_size_edd = E_CONFIG_DD_NEW("Ecore_X_Randr_Screen_Size", Ecore_X_Randr_Screen_Size);
529 #undef T
530 #undef D
531 #define T Ecore_X_Randr_Screen_Size
532 #define D _e_config_randr_size_edd
533    E_CONFIG_VAL(D, T, width, INT);
534    E_CONFIG_VAL(D, T, height, INT);
535    E_CONFIG_VAL(D, T, width, INT);
536    E_CONFIG_VAL(D, T, height, INT);
537
538    _e_config_randr_size_mm_edd = E_CONFIG_DD_NEW("Ecore_X_Randr_Screen_Size_MM", Ecore_X_Randr_Screen_Size_MM);
539 #undef T
540 #undef D
541 #define T Ecore_X_Randr_Screen_Size_MM
542 #define D _e_config_randr_size_mm_edd
543    E_CONFIG_VAL(D, T, width, INT);
544    E_CONFIG_VAL(D, T, height, INT);
545    E_CONFIG_VAL(D, T, width_mm, INT);
546    E_CONFIG_VAL(D, T, height_mm, INT);
547
548    _e_config_randr_edid_hash_edd = E_CONFIG_DD_NEW("E_Randr_Edid_Hash", E_Randr_Edid_Hash);
549 #undef T
550 #undef D
551 #define T E_Randr_Edid_Hash
552 #define D _e_config_randr_edid_hash_edd
553    E_CONFIG_VAL(D, T, hash, INT);
554
555    _e_config_randr_serialized_setup_11_edd = E_CONFIG_DD_NEW("E_Randr_Serialized_Setup_11", E_Randr_Serialized_Setup_11);
556 #undef T
557 #undef D
558 #define T E_Randr_Serialized_Setup_11
559 #define D _e_config_randr_serialized_setup_11_edd
560    E_CONFIG_SUB(D, T, size, _e_config_randr_size_edd);
561    E_CONFIG_VAL(D, T, orientation, INT);
562    E_CONFIG_VAL(D, T, refresh_rate, SHORT);
563
564     _e_config_randr_serialized_output_policy_edd = E_CONFIG_DD_NEW("E_Randr_Serialized_Output_Policy", E_Randr_Serialized_Output_Policy);
565 #undef T
566 #undef D
567 #define T E_Randr_Serialized_Output_Policy
568 #define D _e_config_randr_serialized_output_policy_edd
569    E_CONFIG_VAL(D, T, name, STR);
570    E_CONFIG_VAL(D, T, policy, INT);
571
572     _e_config_randr_serialized_output_edd = E_CONFIG_DD_NEW("E_Randr_Serialized_Output", E_Randr_Serialized_Output);
573 #undef T
574 #undef D
575 #define T E_Randr_Serialized_Output
576 #define D _e_config_randr_serialized_output_edd
577    E_CONFIG_VAL(D, T, name, STR);
578    E_CONFIG_VAL(D, T, backlight_level, DOUBLE);
579
580     _e_config_randr_mode_info_edd = E_CONFIG_DD_NEW("Ecore_X_Randr_Mode_Info", Ecore_X_Randr_Mode_Info);
581 #undef T
582 #undef D
583 #define T Ecore_X_Randr_Mode_Info
584 #define D _e_config_randr_mode_info_edd
585    E_CONFIG_VAL(D, T, xid, INT);
586    E_CONFIG_VAL(D, T, width, INT);
587    E_CONFIG_VAL(D, T, height, INT);
588    E_CONFIG_VAL(D, T, dotClock, LL);
589    E_CONFIG_VAL(D, T, hSyncStart, INT);
590    E_CONFIG_VAL(D, T, hSyncEnd, INT);
591    E_CONFIG_VAL(D, T, hTotal, INT);
592    E_CONFIG_VAL(D, T, hSkew, INT);
593    E_CONFIG_VAL(D, T, vSyncStart, INT);
594    E_CONFIG_VAL(D, T, vSyncEnd, INT);
595    E_CONFIG_VAL(D, T, vTotal, INT);
596    E_CONFIG_VAL(D, T, name, STR);
597    E_CONFIG_VAL(D, T, nameLength, INT);
598    E_CONFIG_VAL(D, T, modeFlags, LL);
599
600   _e_config_randr_serialized_crtc_edd = E_CONFIG_DD_NEW("E_Randr_Serialized_Crtc", E_Randr_Serialized_Crtc);
601 #undef T
602 #undef D
603 #define T E_Randr_Serialized_Crtc
604 #define D _e_config_randr_serialized_crtc_edd
605    E_CONFIG_LIST(D, T, outputs, _e_config_randr_serialized_output_edd);
606    E_CONFIG_SUB(D, T, mode_info, _e_config_randr_mode_info_edd);
607    E_CONFIG_VAL(D, T, pos.x, INT);
608    E_CONFIG_VAL(D, T, pos.y, INT);
609    E_CONFIG_VAL(D, T, orientation, INT);
610
611    _e_config_randr_serialized_setup_12_edd = E_CONFIG_DD_NEW("E_Randr_Serialized_Setup_12", E_Randr_Serialized_Setup_12);
612 #undef T
613 #undef D
614 #define T E_Randr_Serialized_Setup_12
615 #define D _e_config_randr_serialized_setup_12_edd
616    E_CONFIG_VAL(D, T, timestamp, DOUBLE);
617    E_CONFIG_LIST(D, T, crtcs, _e_config_randr_serialized_crtc_edd);
618    E_CONFIG_LIST(D, T, edid_hashes, _e_config_randr_edid_hash_edd);
619
620    _e_config_randr_serialized_setup_edd = E_CONFIG_DD_NEW("E_Randr_Serialized_Setup", E_Randr_Serialized_Setup);
621 #undef T
622 #undef D
623 #define T E_Randr_Serialized_Setup
624 #define D _e_config_randr_serialized_setup_edd
625    E_CONFIG_SUB(D, T, serialized_setup_11, _e_config_randr_serialized_setup_11_edd);
626    E_CONFIG_LIST(D, T, serialized_setups_12, _e_config_randr_serialized_setup_12_edd);
627    E_CONFIG_LIST(D, T, outputs_policies, _e_config_randr_serialized_output_policy_edd);
628
629    _e_config_edd = E_CONFIG_DD_NEW("E_Config", E_Config);
630 #undef T
631 #undef D
632 #define T E_Config
633 #define D _e_config_edd
634    /**/ /* == already configurable via ipc */
635    E_CONFIG_VAL(D, T, config_version, INT); /**/
636    E_CONFIG_VAL(D, T, show_splash, INT); /**/
637    E_CONFIG_VAL(D, T, init_default_theme, STR); /**/
638    E_CONFIG_VAL(D, T, desktop_default_background, STR); /**/
639    E_CONFIG_VAL(D, T, desktop_default_name, STR); /**/
640    E_CONFIG_VAL(D, T, desktop_default_window_profile, STR); /**/
641    E_CONFIG_LIST(D, T, desktop_backgrounds, _e_config_desktop_bg_edd); /**/
642    E_CONFIG_LIST(D, T, desktop_names, _e_config_desktop_name_edd); /**/
643    E_CONFIG_LIST(D, T, desktop_window_profiles, _e_config_desktop_window_profile_edd); /**/
644    E_CONFIG_VAL(D, T, menus_scroll_speed, DOUBLE); /**/
645    E_CONFIG_VAL(D, T, menus_fast_mouse_move_threshhold, DOUBLE); /**/
646    E_CONFIG_VAL(D, T, menus_click_drag_timeout, DOUBLE); /**/
647    E_CONFIG_VAL(D, T, border_shade_animate, INT); /**/
648    E_CONFIG_VAL(D, T, border_shade_transition, INT); /**/
649    E_CONFIG_VAL(D, T, border_shade_speed, DOUBLE); /**/
650    E_CONFIG_VAL(D, T, framerate, DOUBLE); /**/
651    E_CONFIG_VAL(D, T, priority, INT); /**/
652    E_CONFIG_VAL(D, T, image_cache, INT); /**/
653    E_CONFIG_VAL(D, T, font_cache, INT); /**/
654    E_CONFIG_VAL(D, T, edje_cache, INT); /**/
655    E_CONFIG_VAL(D, T, edje_collection_cache, INT); /**/
656    E_CONFIG_VAL(D, T, zone_desks_x_count, INT); /**/
657    E_CONFIG_VAL(D, T, zone_desks_y_count, INT); /**/
658    E_CONFIG_VAL(D, T, show_desktop_icons, INT); /**/
659    E_CONFIG_VAL(D, T, edge_flip_dragging, INT); /**/
660    E_CONFIG_VAL(D, T, use_composite, INT); /**/
661    E_CONFIG_VAL(D, T, language, STR); /**/
662    E_CONFIG_LIST(D, T, modules, _e_config_module_edd); /**/
663    E_CONFIG_LIST(D, T, font_fallbacks, _e_config_font_fallback_edd); /**/
664    E_CONFIG_LIST(D, T, font_defaults, _e_config_font_default_edd); /**/
665    E_CONFIG_LIST(D, T, themes, _e_config_theme_edd); /**/
666    E_CONFIG_LIST(D, T, mouse_bindings, _e_config_bindings_mouse_edd); /**/
667    E_CONFIG_LIST(D, T, key_bindings, _e_config_bindings_key_edd); /**/
668    E_CONFIG_LIST(D, T, edge_bindings, _e_config_bindings_edge_edd); /**/
669    E_CONFIG_LIST(D, T, signal_bindings, _e_config_bindings_signal_edd); /**/
670    E_CONFIG_LIST(D, T, wheel_bindings, _e_config_bindings_wheel_edd); /**/
671    E_CONFIG_LIST(D, T, acpi_bindings, _e_config_bindings_acpi_edd); /**/
672    E_CONFIG_LIST(D, T, path_append_data, _e_config_path_append_edd); /**/
673    E_CONFIG_LIST(D, T, path_append_images, _e_config_path_append_edd); /**/
674    E_CONFIG_LIST(D, T, path_append_fonts, _e_config_path_append_edd); /**/
675    E_CONFIG_LIST(D, T, path_append_themes, _e_config_path_append_edd); /**/
676    E_CONFIG_LIST(D, T, path_append_init, _e_config_path_append_edd); /**/
677    E_CONFIG_LIST(D, T, path_append_icons, _e_config_path_append_edd); /**/
678    E_CONFIG_LIST(D, T, path_append_modules, _e_config_path_append_edd); /**/
679    E_CONFIG_LIST(D, T, path_append_backgrounds, _e_config_path_append_edd); /**/
680    E_CONFIG_VAL(D, T, window_placement_policy, INT); /**/
681    E_CONFIG_VAL(D, T, focus_policy, INT); /**/
682    E_CONFIG_VAL(D, T, focus_setting, INT); /**/
683    E_CONFIG_VAL(D, T, pass_click_on, INT); /**/
684    E_CONFIG_VAL(D, T, always_click_to_raise, INT); /**/
685    E_CONFIG_VAL(D, T, always_click_to_focus, INT); /**/
686    E_CONFIG_VAL(D, T, use_auto_raise, INT); /**/
687    E_CONFIG_VAL(D, T, auto_raise_delay, DOUBLE); /**/
688    E_CONFIG_VAL(D, T, use_resist, INT); /**/
689    E_CONFIG_VAL(D, T, drag_resist, INT); /**/
690    E_CONFIG_VAL(D, T, desk_resist, INT); /**/
691    E_CONFIG_VAL(D, T, window_resist, INT); /**/
692    E_CONFIG_VAL(D, T, gadget_resist, INT); /**/
693    E_CONFIG_VAL(D, T, geometry_auto_resize_limit, INT); /**/
694    E_CONFIG_VAL(D, T, geometry_auto_move, INT); /**/
695    E_CONFIG_VAL(D, T, winlist_warp_while_selecting, INT); /**/
696    E_CONFIG_VAL(D, T, winlist_warp_at_end, INT); /**/
697    E_CONFIG_VAL(D, T, winlist_warp_speed, DOUBLE); /**/
698    E_CONFIG_VAL(D, T, winlist_scroll_animate, INT); /**/
699    E_CONFIG_VAL(D, T, winlist_scroll_speed, DOUBLE); /**/
700    E_CONFIG_VAL(D, T, winlist_list_show_iconified, INT); /**/
701    E_CONFIG_VAL(D, T, winlist_list_show_other_desk_iconified, INT); /**/
702    E_CONFIG_VAL(D, T, winlist_list_show_other_screen_iconified, INT); /**/
703    E_CONFIG_VAL(D, T, winlist_list_show_other_desk_windows, INT); /**/
704    E_CONFIG_VAL(D, T, winlist_list_show_other_screen_windows, INT); /**/
705    E_CONFIG_VAL(D, T, winlist_list_uncover_while_selecting, INT); /**/
706    E_CONFIG_VAL(D, T, winlist_list_jump_desk_while_selecting, INT); /**/
707    E_CONFIG_VAL(D, T, winlist_list_focus_while_selecting, INT); /**/
708    E_CONFIG_VAL(D, T, winlist_list_raise_while_selecting, INT); /**/
709    E_CONFIG_VAL(D, T, winlist_pos_align_x, DOUBLE); /**/
710    E_CONFIG_VAL(D, T, winlist_pos_align_y, DOUBLE); /**/
711    E_CONFIG_VAL(D, T, winlist_pos_size_w, DOUBLE); /**/
712    E_CONFIG_VAL(D, T, winlist_pos_size_h, DOUBLE); /**/
713    E_CONFIG_VAL(D, T, winlist_pos_min_w, INT); /**/
714    E_CONFIG_VAL(D, T, winlist_pos_min_h, INT); /**/
715    E_CONFIG_VAL(D, T, winlist_pos_max_w, INT); /**/
716    E_CONFIG_VAL(D, T, winlist_pos_max_h, INT); /**/
717    E_CONFIG_VAL(D, T, maximize_policy, INT); /**/
718    E_CONFIG_VAL(D, T, allow_manip, INT); /**/
719    E_CONFIG_VAL(D, T, border_fix_on_shelf_toggle, INT); /**/
720    E_CONFIG_VAL(D, T, allow_above_fullscreen, INT); /**/
721    E_CONFIG_VAL(D, T, kill_if_close_not_possible, INT); /**/
722    E_CONFIG_VAL(D, T, kill_process, INT); /**/
723    E_CONFIG_VAL(D, T, kill_timer_wait, DOUBLE); /**/
724    E_CONFIG_VAL(D, T, ping_clients, INT); /**/
725    E_CONFIG_VAL(D, T, transition_start, STR); /**/
726    E_CONFIG_VAL(D, T, transition_desk, STR); /**/
727    E_CONFIG_VAL(D, T, transition_change, STR); /**/
728    E_CONFIG_LIST(D, T, remembers, _e_config_remember_edd);
729    E_CONFIG_VAL(D, T, remember_internal_windows, INT);
730    E_CONFIG_VAL(D, T, move_info_follows, INT); /**/
731    E_CONFIG_VAL(D, T, resize_info_follows, INT); /**/
732    E_CONFIG_VAL(D, T, move_info_visible, INT); /**/
733    E_CONFIG_VAL(D, T, resize_info_visible, INT); /**/
734    E_CONFIG_VAL(D, T, focus_last_focused_per_desktop, INT); /**/
735    E_CONFIG_VAL(D, T, focus_revert_on_hide_or_close, INT); /**/
736    E_CONFIG_VAL(D, T, pointer_slide, INT); /**/
737    E_CONFIG_VAL(D, T, use_e_cursor, INT); /**/
738    E_CONFIG_VAL(D, T, cursor_size, INT); /**/
739    E_CONFIG_VAL(D, T, menu_autoscroll_margin, INT); /**/
740    E_CONFIG_VAL(D, T, menu_autoscroll_cursor_margin, INT); /**/
741    E_CONFIG_VAL(D, T, transient.move, INT); /* FIXME: implement */
742    E_CONFIG_VAL(D, T, transient.resize, INT); /* FIXME: implement */
743    E_CONFIG_VAL(D, T, transient.raise, INT); /**/
744    E_CONFIG_VAL(D, T, transient.lower, INT); /**/
745    E_CONFIG_VAL(D, T, transient.layer, INT); /**/
746    E_CONFIG_VAL(D, T, transient.desktop, INT); /**/
747    E_CONFIG_VAL(D, T, transient.iconify, INT); /**/
748    E_CONFIG_VAL(D, T, modal_windows, INT); /**/
749    E_CONFIG_VAL(D, T, menu_eap_name_show, INT); /**/
750    E_CONFIG_VAL(D, T, menu_eap_generic_show, INT); /**/
751    E_CONFIG_VAL(D, T, menu_eap_comment_show, INT); /**/
752    E_CONFIG_VAL(D, T, fullscreen_policy, INT); /**/
753    E_CONFIG_VAL(D, T, input_method, STR); /**/
754    E_CONFIG_LIST(D, T, path_append_messages, _e_config_path_append_edd); /**/
755    E_CONFIG_VAL(D, T, exebuf_term_cmd, STR);
756    E_CONFIG_LIST(D, T, color_classes, _e_config_color_class_edd);
757    E_CONFIG_VAL(D, T, use_app_icon, INT);
758    E_CONFIG_VAL(D, T, cnfmdlg_disabled, INT); /**/
759    E_CONFIG_VAL(D, T, cfgdlg_auto_apply, INT); /**/
760    E_CONFIG_VAL(D, T, cfgdlg_default_mode, INT); /**/
761    E_CONFIG_LIST(D, T, gadcons, _e_config_gadcon_edd);
762    E_CONFIG_LIST(D, T, shelves, _e_config_shelf_edd);
763    E_CONFIG_VAL(D, T, font_hinting, INT); /**/
764    E_CONFIG_VAL(D, T, desklock_personal_passwd, STR);
765    E_CONFIG_VAL(D, T, desklock_background, STR);
766    E_CONFIG_VAL(D, T, desklock_auth_method, INT);
767    E_CONFIG_VAL(D, T, desklock_login_box_zone, INT);
768    E_CONFIG_VAL(D, T, desklock_start_locked, INT);
769    E_CONFIG_VAL(D, T, desklock_on_suspend, INT);
770    E_CONFIG_VAL(D, T, desklock_autolock_screensaver, INT);
771    E_CONFIG_VAL(D, T, desklock_post_screensaver_time, DOUBLE);
772    E_CONFIG_VAL(D, T, desklock_autolock_idle, INT);
773    E_CONFIG_VAL(D, T, desklock_autolock_idle_timeout, DOUBLE);
774    E_CONFIG_VAL(D, T, desklock_use_custom_desklock, INT);
775    E_CONFIG_VAL(D, T, desklock_custom_desklock_cmd, STR);
776    E_CONFIG_VAL(D, T, desklock_ask_presentation, UCHAR);
777    E_CONFIG_VAL(D, T, desklock_ask_presentation_timeout, DOUBLE);
778
779    //randr specifics
780    E_CONFIG_SUB(D, T, randr_serialized_setup, _e_config_randr_serialized_setup_edd);
781
782    E_CONFIG_VAL(D, T, screensaver_enable, INT);
783    E_CONFIG_VAL(D, T, screensaver_timeout, INT);
784    E_CONFIG_VAL(D, T, screensaver_interval, INT);
785    E_CONFIG_VAL(D, T, screensaver_blanking, INT);
786    E_CONFIG_VAL(D, T, screensaver_expose, INT);
787    E_CONFIG_VAL(D, T, screensaver_ask_presentation, UCHAR);
788    E_CONFIG_VAL(D, T, screensaver_ask_presentation_timeout, DOUBLE);
789
790    E_CONFIG_VAL(D, T, screensaver_suspend, UCHAR);
791    E_CONFIG_VAL(D, T, screensaver_suspend_on_ac, UCHAR);
792    E_CONFIG_VAL(D, T, screensaver_suspend_delay, DOUBLE);
793    
794    E_CONFIG_VAL(D, T, dpms_enable, INT);
795    E_CONFIG_VAL(D, T, dpms_standby_enable, INT);
796    E_CONFIG_VAL(D, T, dpms_suspend_enable, INT);
797    E_CONFIG_VAL(D, T, dpms_off_enable, INT);
798    E_CONFIG_VAL(D, T, dpms_standby_timeout, INT);
799    E_CONFIG_VAL(D, T, dpms_suspend_timeout, INT);
800    E_CONFIG_VAL(D, T, dpms_off_timeout, INT);
801
802    E_CONFIG_VAL(D, T, clientlist_group_by, INT);
803    E_CONFIG_VAL(D, T, clientlist_include_all_zones, INT);
804    E_CONFIG_VAL(D, T, clientlist_separate_with, INT);
805    E_CONFIG_VAL(D, T, clientlist_sort_by, INT);
806    E_CONFIG_VAL(D, T, clientlist_separate_iconified_apps, INT);
807    E_CONFIG_VAL(D, T, clientlist_warp_to_iconified_desktop, INT);
808    E_CONFIG_VAL(D, T, clientlist_limit_caption_len, INT);
809    E_CONFIG_VAL(D, T, clientlist_max_caption_len, INT);
810
811    E_CONFIG_VAL(D, T, mouse_hand, INT);
812    E_CONFIG_VAL(D, T, mouse_accel_numerator, INT);
813    E_CONFIG_VAL(D, T, mouse_accel_denominator, INT);
814    E_CONFIG_VAL(D, T, mouse_accel_threshold, INT);
815
816    E_CONFIG_VAL(D, T, border_raise_on_mouse_action, INT);
817    E_CONFIG_VAL(D, T, border_raise_on_focus, INT);
818    E_CONFIG_VAL(D, T, desk_flip_wrap, INT);
819    E_CONFIG_VAL(D, T, fullscreen_flip, INT);
820
821    E_CONFIG_VAL(D, T, icon_theme, STR);
822    E_CONFIG_VAL(D, T, icon_theme_overrides, UCHAR);
823
824    E_CONFIG_VAL(D, T, desk_flip_animate_mode, INT);
825    E_CONFIG_VAL(D, T, desk_flip_animate_interpolation, INT);
826    E_CONFIG_VAL(D, T, desk_flip_animate_time, DOUBLE);
827
828    E_CONFIG_VAL(D, T, wallpaper_import_last_dev, STR);
829    E_CONFIG_VAL(D, T, wallpaper_import_last_path, STR);
830
831    E_CONFIG_VAL(D, T, theme_default_border_style, STR);
832
833    E_CONFIG_LIST(D, T, mime_icons, _e_config_mime_icon_edd); /**/
834
835    E_CONFIG_VAL(D, T, desk_auto_switch, INT);
836
837    E_CONFIG_VAL(D, T, thumb_nice, INT);
838
839    E_CONFIG_VAL(D, T, menu_favorites_show, INT);
840    E_CONFIG_VAL(D, T, menu_apps_show, INT);
841    E_CONFIG_VAL(D, T, menu_gadcon_client_toplevel, INT);
842    
843    E_CONFIG_VAL(D, T, ping_clients_interval, INT);
844    E_CONFIG_VAL(D, T, cache_flush_poll_interval, INT);
845
846    E_CONFIG_VAL(D, T, thumbscroll_enable, INT);
847    E_CONFIG_VAL(D, T, thumbscroll_threshhold, INT);
848    E_CONFIG_VAL(D, T, thumbscroll_momentum_threshhold, DOUBLE);
849    E_CONFIG_VAL(D, T, thumbscroll_friction, DOUBLE);
850
851    E_CONFIG_VAL(D, T, device_desktop, INT);
852    E_CONFIG_VAL(D, T, device_auto_mount, INT);
853    E_CONFIG_VAL(D, T, device_auto_open, INT);
854
855    E_CONFIG_VAL(D, T, border_keyboard.timeout, DOUBLE);
856    E_CONFIG_VAL(D, T, border_keyboard.move.dx, UCHAR);
857    E_CONFIG_VAL(D, T, border_keyboard.move.dy, UCHAR);
858    E_CONFIG_VAL(D, T, border_keyboard.resize.dx, UCHAR);
859    E_CONFIG_VAL(D, T, border_keyboard.resize.dy, UCHAR);
860
861    E_CONFIG_VAL(D, T, scale.min, DOUBLE);
862    E_CONFIG_VAL(D, T, scale.max, DOUBLE);
863    E_CONFIG_VAL(D, T, scale.factor, DOUBLE);
864    E_CONFIG_VAL(D, T, scale.base_dpi, INT);
865    E_CONFIG_VAL(D, T, scale.use_dpi, UCHAR);
866    E_CONFIG_VAL(D, T, scale.use_custom, UCHAR);
867
868    E_CONFIG_VAL(D, T, show_cursor, UCHAR);
869    E_CONFIG_VAL(D, T, idle_cursor, UCHAR);
870
871    E_CONFIG_VAL(D, T, default_system_menu, STR);
872
873    E_CONFIG_VAL(D, T, cfgdlg_normal_wins, UCHAR);
874
875    E_CONFIG_VAL(D, T, syscon.main.icon_size, INT);
876    E_CONFIG_VAL(D, T, syscon.secondary.icon_size, INT);
877    E_CONFIG_VAL(D, T, syscon.extra.icon_size, INT);
878    E_CONFIG_VAL(D, T, syscon.timeout, DOUBLE);
879    E_CONFIG_VAL(D, T, syscon.do_input, UCHAR);
880    E_CONFIG_LIST(D, T, syscon.actions, _e_config_syscon_action_edd);
881
882    E_CONFIG_VAL(D, T, mode.presentation, UCHAR);
883    E_CONFIG_VAL(D, T, mode.offline, UCHAR);
884
885    E_CONFIG_VAL(D, T, exec.expire_timeout, DOUBLE);
886    E_CONFIG_VAL(D, T, exec.show_run_dialog, UCHAR);
887    E_CONFIG_VAL(D, T, exec.show_exit_dialog, UCHAR);
888
889    E_CONFIG_VAL(D, T, null_container_win, UCHAR);
890
891    E_CONFIG_LIST(D, T, env_vars, _e_config_env_var_edd);
892
893    E_CONFIG_VAL(D, T, backlight.normal, DOUBLE);
894    E_CONFIG_VAL(D, T, backlight.dim, DOUBLE);
895    E_CONFIG_VAL(D, T, backlight.transition, DOUBLE);
896    E_CONFIG_VAL(D, T, backlight.idle_dim, UCHAR);
897    E_CONFIG_VAL(D, T, backlight.timer, DOUBLE);
898
899    E_CONFIG_VAL(D, T, deskenv.load_xrdb, UCHAR);
900    E_CONFIG_VAL(D, T, deskenv.load_xmodmap, UCHAR);
901    E_CONFIG_VAL(D, T, deskenv.load_gnome, UCHAR);
902    E_CONFIG_VAL(D, T, deskenv.load_kde, UCHAR);
903
904    E_CONFIG_VAL(D, T, xsettings.enabled, UCHAR);
905    E_CONFIG_VAL(D, T, xsettings.match_e17_theme, UCHAR);
906    E_CONFIG_VAL(D, T, xsettings.match_e17_icon_theme, UCHAR);
907    E_CONFIG_VAL(D, T, xsettings.xft_antialias, INT);
908    E_CONFIG_VAL(D, T, xsettings.xft_hinting, INT);
909    E_CONFIG_VAL(D, T, xsettings.xft_hint_style, STR);
910    E_CONFIG_VAL(D, T, xsettings.xft_rgba, STR);
911    E_CONFIG_VAL(D, T, xsettings.net_theme_name, STR);
912    E_CONFIG_VAL(D, T, xsettings.net_icon_theme_name, STR);
913    E_CONFIG_VAL(D, T, xsettings.gtk_font_name, STR);
914
915    E_CONFIG_VAL(D, T, update.check, UCHAR);
916    E_CONFIG_VAL(D, T, update.later, UCHAR);
917    
918    e_config_load();
919
920    e_config_save_queue();
921    return 1;
922 }
923
924 EINTERN int
925 e_config_shutdown(void)
926 {
927    E_FREE(_e_config_profile);
928    E_CONFIG_DD_FREE(_e_config_edd);
929    E_CONFIG_DD_FREE(_e_config_module_edd);
930    E_CONFIG_DD_FREE(_e_config_font_default_edd);
931    E_CONFIG_DD_FREE(_e_config_font_fallback_edd);
932    E_CONFIG_DD_FREE(_e_config_theme_edd);
933    E_CONFIG_DD_FREE(_e_config_bindings_mouse_edd);
934    E_CONFIG_DD_FREE(_e_config_bindings_key_edd);
935    E_CONFIG_DD_FREE(_e_config_bindings_edge_edd);
936    E_CONFIG_DD_FREE(_e_config_bindings_signal_edd);
937    E_CONFIG_DD_FREE(_e_config_bindings_wheel_edd);
938    E_CONFIG_DD_FREE(_e_config_bindings_acpi_edd);
939    E_CONFIG_DD_FREE(_e_config_path_append_edd);
940    E_CONFIG_DD_FREE(_e_config_desktop_bg_edd);
941    E_CONFIG_DD_FREE(_e_config_desktop_name_edd);
942    E_CONFIG_DD_FREE(_e_config_desktop_window_profile_edd);
943    E_CONFIG_DD_FREE(_e_config_remember_edd);
944    E_CONFIG_DD_FREE(_e_config_gadcon_edd);
945    E_CONFIG_DD_FREE(_e_config_gadcon_client_edd);
946    E_CONFIG_DD_FREE(_e_config_shelf_edd);
947    E_CONFIG_DD_FREE(_e_config_shelf_desk_edd);
948    E_CONFIG_DD_FREE(_e_config_mime_icon_edd);
949    E_CONFIG_DD_FREE(_e_config_syscon_action_edd);
950    E_CONFIG_DD_FREE(_e_config_env_var_edd);
951    //E_CONFIG_DD_FREE(_e_config_randr_serialized_setup_edd);
952    return 1;
953 }
954
955 EAPI void
956 e_config_load(void)
957 {
958    E_Config *tcfg = NULL;
959
960    e_config = e_config_domain_load("e", _e_config_edd);
961    if (e_config)
962      {
963         int reload = 0;
964
965         /* major version change - that means wipe and restart */
966         if ((e_config->config_version >> 16) < E_CONFIG_FILE_EPOCH)
967           {
968              /* your config is too old - need new defaults */
969              _e_config_free(e_config);
970              e_config = NULL;
971              reload = 1;
972              ecore_timer_add(1.0, _e_config_cb_timer,
973                              _("Settings data needed upgrading. Your old settings have<br>"
974                                "been wiped and a new set of defaults initialized. This<br>"
975                                "will happen regularly during development, so don't report a<br>"
976                                "bug. This simply means Enlightenment needs new settings<br>"
977                                "data by default for usable functionality that your old<br>"
978                                "settings simply lack. This new set of defaults will fix<br>"
979                                "that by adding it in. You can re-configure things now to your<br>"
980                                "liking. Sorry for the hiccup in your settings.<br>"));
981           }
982         /* config is too new? odd! suspect corruption? */
983         else if (e_config->config_version > E_CONFIG_FILE_VERSION)
984           {
985              /* your config is too new - what the fuck??? */
986              _e_config_free(e_config);
987              e_config = NULL;
988              reload = 1;
989              ecore_timer_add(1.0, _e_config_cb_timer,
990                              _("Your settings are NEWER than Enlightenment. This is very<br>"
991                                "strange. This should not happen unless you downgraded<br>"
992                                "Enlightenment or copied the settings from a place where<br>"
993                                "a newer version of Enlightenment was running. This is bad and<br>"
994                                "as a precaution your settings have been now restored to<br>"
995                                "defaults. Sorry for the inconvenience.<br>"));
996           }
997         /* oldest minor version supported */
998         else if ((e_config->config_version & 0xffff) < 0x0124)
999           {
1000              /* your config is so old - we don't even bother supporting an
1001               * upgrade path - brand new config for you! */
1002              _e_config_free(e_config);
1003              e_config = NULL;
1004              reload = 1;
1005              ecore_timer_add(1.0, _e_config_cb_timer,
1006                              _("Settings data needed upgrading. Your old settings have<br>"
1007                                "been wiped and a new set of defaults initialized. This<br>"
1008                                "will happen regularly during development, so don't report a<br>"
1009                                "bug. This simply means Enlightenment needs new settings<br>"
1010                                "data by default for usable functionality that your old<br>"
1011                                "settings simply lack. This new set of defaults will fix<br>"
1012                                "that by adding it in. You can re-configure things now to your<br>"
1013                                "liking. Sorry for the hiccup in your settings.<br>"));
1014           }
1015         if (reload)
1016           {
1017              e_config_profile_del(e_config_profile_get());
1018              e_config = e_config_domain_load("e", _e_config_edd);
1019           }
1020      }
1021    if (!e_config)
1022      {
1023         printf("EEEK! no config of any sort! abort abort abort!\n");
1024         fprintf(stderr, "EEEK! no config of any sort! abort abort abort!\n");
1025         e_error_message_show("Enlightenment was started without any configuration\n"
1026                              "files available for the given profile (normally\n"
1027                              "default or the last profile used or provided on the\n"
1028                              "command-line with -profile etc.)\n\n"
1029                              "Cannot contiue without configuration to work with.\n"
1030                              "Please ensure you have system or user configuration\n"
1031                              "for the profile you are using before proceeeding.");
1032         abort();
1033      }
1034    if (e_config->config_version < E_CONFIG_FILE_VERSION)
1035      {
1036         /* we need an upgrade of some sort */
1037         tcfg = e_config_domain_system_load("e", _e_config_edd);
1038         if (!tcfg)
1039           {
1040              const char *pprofile;
1041
1042              pprofile = e_config_profile_get();
1043              if (pprofile) pprofile = eina_stringshare_add(pprofile);
1044              e_config_profile_set("standard");
1045              tcfg = e_config_domain_system_load("e", _e_config_edd);
1046              e_config_profile_set(pprofile);
1047              if (pprofile) eina_stringshare_del(pprofile);
1048           }
1049         /* can't find your profile or standard or default - try default after
1050          * a wipe */
1051         if (!tcfg)
1052           {
1053              E_Action *a;
1054
1055              e_config_profile_set("default");
1056              e_config_profile_del(e_config_profile_get());
1057              e_config_save_block_set(1);
1058              a = e_action_find("restart");
1059              if ((a) && (a->func.go)) a->func.go(NULL, NULL);
1060           }
1061      }
1062 #define IFCFG(v) if ((e_config->config_version & 0xffff) < (v)) {
1063 #define IFCFGELSE } else {
1064 #define IFCFGEND }
1065 #define COPYVAL(x) do {e_config->x = tcfg->x;} while (0)
1066 #define COPYPTR(x) do {e_config->x = tcfg->x; tcfg->x = NULL;} while (0)
1067 #define COPYSTR(x) COPYPTR(x)
1068    if (tcfg)
1069      {
1070         /* some sort of upgrade is needed */
1071         IFCFG(0x0124);
1072         COPYVAL(thumbscroll_enable);
1073         COPYVAL(thumbscroll_threshhold);
1074         COPYVAL(thumbscroll_momentum_threshhold);
1075         COPYVAL(thumbscroll_friction);
1076         IFCFGEND;
1077
1078         IFCFG(0x0125);
1079         COPYVAL(mouse_hand);
1080         IFCFGEND;
1081
1082         IFCFG(0x0126);
1083         COPYVAL(border_keyboard.timeout);
1084         COPYVAL(border_keyboard.move.dx);
1085         COPYVAL(border_keyboard.move.dy);
1086         COPYVAL(border_keyboard.resize.dx);
1087         COPYVAL(border_keyboard.resize.dy);
1088         IFCFGEND;
1089
1090         IFCFG(0x0127);
1091         COPYVAL(scale.min);
1092         COPYVAL(scale.max);
1093         COPYVAL(scale.factor);
1094         COPYVAL(scale.base_dpi);
1095         COPYVAL(scale.use_dpi);
1096         COPYVAL(scale.use_custom);
1097         IFCFGEND;
1098
1099         IFCFG(0x0128);
1100         COPYVAL(show_cursor);
1101         COPYVAL(idle_cursor);
1102         IFCFGEND;
1103
1104         IFCFG(0x0129);
1105         COPYSTR(default_system_menu);
1106         IFCFGEND;
1107
1108         IFCFG(0x012a);
1109         COPYVAL(desklock_start_locked);
1110         IFCFGEND;
1111
1112         IFCFG(0x012b);
1113         COPYVAL(cfgdlg_normal_wins);
1114         IFCFGEND;
1115
1116         IFCFG(0x012c);
1117         COPYVAL(syscon.main.icon_size);
1118         COPYVAL(syscon.secondary.icon_size);
1119         COPYVAL(syscon.extra.icon_size);
1120         COPYVAL(syscon.timeout);
1121         COPYVAL(syscon.do_input);
1122         COPYPTR(syscon.actions);
1123         IFCFGEND;
1124
1125         IFCFG(0x012d);
1126         COPYVAL(priority);
1127         IFCFGEND;
1128
1129         IFCFG(0x012e);
1130         COPYVAL(fullscreen_flip);
1131         IFCFGEND;
1132
1133         IFCFG(0x012f);
1134         COPYVAL(icon_theme_overrides);
1135         IFCFGEND;
1136
1137         IFCFG(0x0130);
1138         COPYVAL(mode.presentation);
1139         COPYVAL(mode.offline);
1140         IFCFGEND;
1141
1142         IFCFG(0x0131);
1143         COPYVAL(desklock_post_screensaver_time);
1144         IFCFGEND;
1145
1146         IFCFG(0x0132);
1147         COPYVAL(desklock_ask_presentation);
1148         COPYVAL(desklock_ask_presentation_timeout);
1149         COPYVAL(screensaver_ask_presentation);
1150         COPYVAL(screensaver_ask_presentation_timeout);
1151         IFCFGEND;
1152
1153         IFCFG(0x0134);
1154         COPYVAL(exec.expire_timeout);
1155         COPYVAL(exec.show_run_dialog);
1156         COPYVAL(exec.show_exit_dialog);
1157         IFCFGEND;
1158
1159         IFCFG(0x0136);
1160         _e_config_acpi_bindings_add();
1161         IFCFGEND;
1162
1163         IFCFG(0x0137);
1164         COPYVAL(desklock_on_suspend);
1165         IFCFGEND;
1166
1167         IFCFG(0x0138);
1168         COPYVAL(geometry_auto_resize_limit);
1169         COPYVAL(geometry_auto_move);
1170         IFCFGEND;
1171
1172         IFCFG(0x0142);
1173         COPYVAL(backlight.normal);
1174         COPYVAL(backlight.dim);
1175         COPYVAL(backlight.transition);
1176         COPYVAL(backlight.idle_dim);
1177         COPYVAL(backlight.timer);
1178         IFCFGEND;
1179
1180         IFCFG(0x0145);
1181         COPYVAL(xsettings.enabled);
1182         COPYVAL(xsettings.match_e17_theme);
1183         COPYVAL(xsettings.match_e17_icon_theme);
1184         IFCFGEND;
1185
1186         IFCFG(0x0147);
1187         COPYVAL(update.check);
1188         COPYVAL(update.later);
1189         IFCFGEND;
1190
1191         e_config->config_version = E_CONFIG_FILE_VERSION;
1192         _e_config_free(tcfg);
1193      }
1194
1195    /* limit values so they are sane */
1196    E_CONFIG_LIMIT(e_config->menus_scroll_speed, 1.0, 20000.0);
1197    E_CONFIG_LIMIT(e_config->show_splash, 0, 1);
1198    E_CONFIG_LIMIT(e_config->menus_fast_mouse_move_threshhold, 1.0, 2000.0);
1199    E_CONFIG_LIMIT(e_config->menus_click_drag_timeout, 0.0, 10.0);
1200    E_CONFIG_LIMIT(e_config->border_shade_animate, 0, 1);
1201    E_CONFIG_LIMIT(e_config->border_shade_transition, 0, 8);
1202    E_CONFIG_LIMIT(e_config->border_shade_speed, 1.0, 20000.0);
1203    E_CONFIG_LIMIT(e_config->framerate, 1.0, 200.0);
1204    E_CONFIG_LIMIT(e_config->priority, 0, 19);
1205    E_CONFIG_LIMIT(e_config->image_cache, 0, 256 * 1024);
1206    E_CONFIG_LIMIT(e_config->font_cache, 0, 32 * 1024);
1207    E_CONFIG_LIMIT(e_config->edje_cache, 0, 256);
1208    E_CONFIG_LIMIT(e_config->edje_collection_cache, 0, 512);
1209    E_CONFIG_LIMIT(e_config->cache_flush_poll_interval, 8, 32768);
1210    E_CONFIG_LIMIT(e_config->zone_desks_x_count, 1, 64);
1211    E_CONFIG_LIMIT(e_config->zone_desks_y_count, 1, 64);
1212    E_CONFIG_LIMIT(e_config->show_desktop_icons, 0, 1);
1213    E_CONFIG_LIMIT(e_config->edge_flip_dragging, 0, 1);
1214    E_CONFIG_LIMIT(e_config->window_placement_policy, E_WINDOW_PLACEMENT_SMART, E_WINDOW_PLACEMENT_MANUAL);
1215    E_CONFIG_LIMIT(e_config->focus_policy, 0, 2);
1216 #ifdef _F_FOCUS_WINDOW_IF_TOP_STACK_
1217    E_CONFIG_LIMIT(e_config->focus_setting, 0, 4);
1218 #else
1219    E_CONFIG_LIMIT(e_config->focus_setting, 0, 3);
1220 #endif
1221    E_CONFIG_LIMIT(e_config->pass_click_on, 0, 1);
1222    E_CONFIG_LIMIT(e_config->always_click_to_raise, 0, 1);
1223    E_CONFIG_LIMIT(e_config->always_click_to_focus, 0, 1);
1224    E_CONFIG_LIMIT(e_config->use_auto_raise, 0, 1);
1225    E_CONFIG_LIMIT(e_config->auto_raise_delay, 0.0, 5.0);
1226    E_CONFIG_LIMIT(e_config->use_resist, 0, 1);
1227    E_CONFIG_LIMIT(e_config->drag_resist, 0, 100);
1228    E_CONFIG_LIMIT(e_config->desk_resist, 0, 100);
1229    E_CONFIG_LIMIT(e_config->window_resist, 0, 100);
1230    E_CONFIG_LIMIT(e_config->gadget_resist, 0, 100);
1231    E_CONFIG_LIMIT(e_config->geometry_auto_move, 0, 1);
1232    E_CONFIG_LIMIT(e_config->geometry_auto_resize_limit, 0, 1);
1233    E_CONFIG_LIMIT(e_config->winlist_warp_while_selecting, 0, 1);
1234    E_CONFIG_LIMIT(e_config->winlist_warp_at_end, 0, 1);
1235    E_CONFIG_LIMIT(e_config->winlist_warp_speed, 0.0, 1.0);
1236    E_CONFIG_LIMIT(e_config->winlist_scroll_animate, 0, 1);
1237    E_CONFIG_LIMIT(e_config->winlist_scroll_speed, 0.0, 1.0);
1238    E_CONFIG_LIMIT(e_config->winlist_list_show_iconified, 0, 1);
1239    E_CONFIG_LIMIT(e_config->winlist_list_show_other_desk_iconified, 0, 1);
1240    E_CONFIG_LIMIT(e_config->winlist_list_show_other_screen_iconified, 0, 1);
1241    E_CONFIG_LIMIT(e_config->winlist_list_show_other_desk_windows, 0, 1);
1242    E_CONFIG_LIMIT(e_config->winlist_list_show_other_screen_windows, 0, 1);
1243    E_CONFIG_LIMIT(e_config->winlist_list_uncover_while_selecting, 0, 1);
1244    E_CONFIG_LIMIT(e_config->winlist_list_jump_desk_while_selecting, 0, 1);
1245    E_CONFIG_LIMIT(e_config->winlist_pos_align_x, 0.0, 1.0);
1246    E_CONFIG_LIMIT(e_config->winlist_pos_align_y, 0.0, 1.0);
1247    E_CONFIG_LIMIT(e_config->winlist_pos_size_w, 0.0, 1.0);
1248    E_CONFIG_LIMIT(e_config->winlist_pos_size_h, 0.0, 1.0);
1249    E_CONFIG_LIMIT(e_config->winlist_pos_min_w, 0, 4000);
1250    E_CONFIG_LIMIT(e_config->winlist_pos_min_h, 0, 4000);
1251    E_CONFIG_LIMIT(e_config->winlist_pos_max_w, 8, 4000);
1252    E_CONFIG_LIMIT(e_config->winlist_pos_max_h, 8, 4000);
1253    E_CONFIG_LIMIT(e_config->maximize_policy, E_MAXIMIZE_FULLSCREEN, E_MAXIMIZE_DIRECTION);
1254    E_CONFIG_LIMIT(e_config->allow_manip, 0, 1);
1255    E_CONFIG_LIMIT(e_config->border_fix_on_shelf_toggle, 0, 1);
1256    E_CONFIG_LIMIT(e_config->allow_above_fullscreen, 0, 1);
1257    E_CONFIG_LIMIT(e_config->kill_if_close_not_possible, 0, 1);
1258    E_CONFIG_LIMIT(e_config->kill_process, 0, 1);
1259    E_CONFIG_LIMIT(e_config->kill_timer_wait, 0.0, 120.0);
1260    E_CONFIG_LIMIT(e_config->ping_clients, 0, 1);
1261    E_CONFIG_LIMIT(e_config->move_info_follows, 0, 1);
1262    E_CONFIG_LIMIT(e_config->resize_info_follows, 0, 1);
1263    E_CONFIG_LIMIT(e_config->move_info_visible, 0, 1);
1264    E_CONFIG_LIMIT(e_config->resize_info_visible, 0, 1);
1265    E_CONFIG_LIMIT(e_config->focus_last_focused_per_desktop, 0, 1);
1266    E_CONFIG_LIMIT(e_config->focus_revert_on_hide_or_close, 0, 1);
1267    E_CONFIG_LIMIT(e_config->pointer_slide, 0, 1);
1268    E_CONFIG_LIMIT(e_config->show_cursor, 0, 1);
1269    E_CONFIG_LIMIT(e_config->use_e_cursor, 0, 1);
1270    E_CONFIG_LIMIT(e_config->cursor_size, 0, 1024);
1271    E_CONFIG_LIMIT(e_config->menu_autoscroll_margin, 0, 50);
1272    E_CONFIG_LIMIT(e_config->menu_autoscroll_cursor_margin, 0, 50);
1273    E_CONFIG_LIMIT(e_config->menu_eap_name_show, 0, 1);
1274    E_CONFIG_LIMIT(e_config->menu_eap_generic_show, 0, 1);
1275    E_CONFIG_LIMIT(e_config->menu_eap_comment_show, 0, 1);
1276    E_CONFIG_LIMIT(e_config->use_app_icon, 0, 1);
1277    E_CONFIG_LIMIT(e_config->cnfmdlg_disabled, 0, 1);
1278    E_CONFIG_LIMIT(e_config->cfgdlg_auto_apply, 0, 1);
1279    E_CONFIG_LIMIT(e_config->cfgdlg_default_mode, 0, 1);
1280    E_CONFIG_LIMIT(e_config->font_hinting, 0, 2);
1281    E_CONFIG_LIMIT(e_config->desklock_login_box_zone, -2, 1000);
1282    E_CONFIG_LIMIT(e_config->desklock_autolock_screensaver, 0, 1);
1283    E_CONFIG_LIMIT(e_config->desklock_post_screensaver_time, 0.0, 300.0);
1284    E_CONFIG_LIMIT(e_config->desklock_autolock_idle, 0, 1);
1285    E_CONFIG_LIMIT(e_config->desklock_autolock_idle_timeout, 1.0, 5400.0);
1286    E_CONFIG_LIMIT(e_config->desklock_use_custom_desklock, 0, 1);
1287    E_CONFIG_LIMIT(e_config->desklock_ask_presentation, 0, 1);
1288    E_CONFIG_LIMIT(e_config->desklock_ask_presentation_timeout, 1.0, 300.0);
1289    E_CONFIG_LIMIT(e_config->border_raise_on_mouse_action, 0, 1);
1290    E_CONFIG_LIMIT(e_config->border_raise_on_focus, 0, 1);
1291    E_CONFIG_LIMIT(e_config->desk_flip_wrap, 0, 1);
1292    E_CONFIG_LIMIT(e_config->fullscreen_flip, 0, 1);
1293    E_CONFIG_LIMIT(e_config->icon_theme_overrides, 0, 1);
1294    E_CONFIG_LIMIT(e_config->remember_internal_windows, 0, 3);
1295    E_CONFIG_LIMIT(e_config->desk_auto_switch, 0, 1);
1296
1297    E_CONFIG_LIMIT(e_config->dpms_enable, 0, 1);
1298    E_CONFIG_LIMIT(e_config->dpms_standby_enable, 0, 1);
1299    E_CONFIG_LIMIT(e_config->dpms_suspend_enable, 0, 1);
1300    E_CONFIG_LIMIT(e_config->dpms_off_enable, 0, 1);
1301    E_CONFIG_LIMIT(e_config->dpms_standby_timeout, 0, 5400);
1302    E_CONFIG_LIMIT(e_config->dpms_suspend_timeout, 0, 5400);
1303    E_CONFIG_LIMIT(e_config->dpms_off_timeout, 0, 5400);
1304
1305    E_CONFIG_LIMIT(e_config->screensaver_timeout, 0, 5400);
1306    E_CONFIG_LIMIT(e_config->screensaver_interval, 0, 5400);
1307    E_CONFIG_LIMIT(e_config->screensaver_blanking, 0, 2);
1308    E_CONFIG_LIMIT(e_config->screensaver_expose, 0, 2);
1309    E_CONFIG_LIMIT(e_config->screensaver_ask_presentation, 0, 1);
1310    E_CONFIG_LIMIT(e_config->screensaver_ask_presentation_timeout, 1.0, 300.0);
1311
1312    E_CONFIG_LIMIT(e_config->clientlist_group_by, 0, 2);
1313    E_CONFIG_LIMIT(e_config->clientlist_include_all_zones, 0, 1);
1314    E_CONFIG_LIMIT(e_config->clientlist_separate_with, 0, 2);
1315    E_CONFIG_LIMIT(e_config->clientlist_sort_by, 0, 3);
1316    E_CONFIG_LIMIT(e_config->clientlist_separate_iconified_apps, 0, 2);
1317    E_CONFIG_LIMIT(e_config->clientlist_warp_to_iconified_desktop, 0, 1);
1318    E_CONFIG_LIMIT(e_config->mouse_hand, 0, 1);
1319    E_CONFIG_LIMIT(e_config->clientlist_limit_caption_len, 0, 1);
1320    E_CONFIG_LIMIT(e_config->clientlist_max_caption_len, 2, E_CLIENTLIST_MAX_CAPTION_LEN);
1321
1322    E_CONFIG_LIMIT(e_config->mouse_accel_numerator, 1, 10);
1323    E_CONFIG_LIMIT(e_config->mouse_accel_denominator, 1, 10);
1324    E_CONFIG_LIMIT(e_config->mouse_accel_threshold, 1, 10);
1325
1326    E_CONFIG_LIMIT(e_config->menu_favorites_show, 0, 1);
1327    E_CONFIG_LIMIT(e_config->menu_apps_show, 0, 1);
1328    E_CONFIG_LIMIT(e_config->menu_gadcon_client_toplevel, 0, 1);
1329
1330    E_CONFIG_LIMIT(e_config->ping_clients_interval, 16, 1024);
1331
1332    E_CONFIG_LIMIT(e_config->mode.presentation, 0, 1);
1333    E_CONFIG_LIMIT(e_config->mode.offline, 0, 1);
1334
1335    E_CONFIG_LIMIT(e_config->exec.expire_timeout, 0.1, 1000);
1336    E_CONFIG_LIMIT(e_config->exec.show_run_dialog, 0, 1);
1337    E_CONFIG_LIMIT(e_config->exec.show_exit_dialog, 0, 1);
1338
1339    E_CONFIG_LIMIT(e_config->null_container_win, 0, 1);
1340    
1341    /* FIXME: disabled auto apply because it causes problems */
1342    e_config->cfgdlg_auto_apply = 0;
1343    /* FIXME: desklock personalized password id disabled for security reasons */
1344    e_config->desklock_auth_method = 0;
1345    if (e_config->desklock_personal_passwd)
1346      eina_stringshare_del(e_config->desklock_personal_passwd);
1347    e_config->desklock_personal_passwd = NULL;
1348
1349    ecore_event_add(E_EVENT_CONFIG_LOADED, NULL, NULL, NULL);
1350 }
1351
1352 EAPI int
1353 e_config_save(void)
1354 {
1355    if (_e_config_save_defer)
1356      {
1357         e_powersave_deferred_action_del(_e_config_save_defer);
1358         _e_config_save_defer = NULL;
1359      }
1360    _e_config_save_cb(NULL);
1361    return e_config_domain_save("e", _e_config_edd, e_config);
1362 }
1363
1364 EAPI void
1365 e_config_save_flush(void)
1366 {
1367    if (_e_config_save_defer)
1368      {
1369         e_powersave_deferred_action_del(_e_config_save_defer);
1370         _e_config_save_defer = NULL;
1371         _e_config_save_cb(NULL);
1372      }
1373 }
1374
1375 EAPI void
1376 e_config_save_queue(void)
1377 {
1378    if (_e_config_save_defer)
1379      e_powersave_deferred_action_del(_e_config_save_defer);
1380    _e_config_save_defer = e_powersave_deferred_action_add(_e_config_save_cb,
1381                                                           NULL);
1382 }
1383
1384 EAPI const char *
1385 e_config_profile_get(void)
1386 {
1387    return _e_config_profile;
1388 }
1389
1390 EAPI void
1391 e_config_profile_set(const char *prof)
1392 {
1393    E_FREE(_e_config_profile);
1394    _e_config_profile = strdup(prof);
1395    e_util_env_set("E_CONF_PROFILE", _e_config_profile);
1396 }
1397
1398 EAPI char *
1399 e_config_profile_dir_get(const char *prof)
1400 {
1401    char buf[PATH_MAX];
1402
1403    e_user_dir_snprintf(buf, sizeof(buf), "config/%s", prof);
1404    if (ecore_file_is_dir(buf)) return strdup(buf);
1405    e_prefix_data_snprintf(buf, sizeof(buf), "data/config/%s", prof);
1406    if (ecore_file_is_dir(buf)) return strdup(buf);
1407    return NULL;
1408 }
1409
1410 static int _cb_sort_files(char *f1, char *f2)
1411 {
1412    return strcmp(f1, f2);
1413 }
1414
1415 EAPI Eina_List *
1416 e_config_profile_list(void)
1417 {
1418    Eina_List *files;
1419    char buf[PATH_MAX], *p;
1420    Eina_List *flist = NULL;
1421    size_t len;
1422
1423    len = e_user_dir_concat_static(buf, "config");
1424    if (len + 1 >= (int)sizeof(buf))
1425      return NULL;
1426
1427    files = ecore_file_ls(buf);
1428
1429    buf[len] = '/';
1430    len++;
1431
1432    p = buf + len;
1433    len = sizeof(buf) - len;
1434    if (files)
1435      {
1436         char *file;
1437
1438         files = eina_list_sort(files, 0, (Eina_Compare_Cb)_cb_sort_files);
1439         EINA_LIST_FREE(files, file)
1440           {
1441              if (eina_strlcpy(p, file, len) >= len)
1442                {
1443                   free(file);
1444                   continue;
1445                }
1446              if (ecore_file_is_dir(buf))
1447                flist = eina_list_append(flist, file);
1448              else
1449                free(file);
1450           }
1451      }
1452    len = e_prefix_data_concat_static(buf, "data/config");
1453    if (len >= sizeof(buf))
1454      return NULL;
1455
1456    files = ecore_file_ls(buf);
1457
1458    buf[len] = '/';
1459    len++;
1460
1461    p = buf + len;
1462    len = sizeof(buf) - len;
1463    if (files)
1464      {
1465         char *file;
1466         files = eina_list_sort(files, 0, (Eina_Compare_Cb)_cb_sort_files);
1467         EINA_LIST_FREE(files, file)
1468           {
1469              if (eina_strlcpy(p, file, len) >= len)
1470                {
1471                   free(file);
1472                   continue;
1473                }
1474              if (ecore_file_is_dir(buf))
1475                {
1476                   const Eina_List *l;
1477                   const char *tmp;
1478                   EINA_LIST_FOREACH(flist, l, tmp)
1479                     if (!strcmp(file, tmp)) break;
1480
1481                   if (!l) flist = eina_list_append(flist, file);
1482                   else free(file);
1483                }
1484              else
1485                free(file);
1486           }
1487      }
1488    return flist;
1489 }
1490
1491 EAPI void
1492 e_config_profile_add(const char *prof)
1493 {
1494    char buf[4096];
1495    if (e_user_dir_snprintf(buf, sizeof(buf), "config/%s", prof) >= sizeof(buf))
1496      return;
1497    ecore_file_mkdir(buf);
1498 }
1499
1500 EAPI void
1501 e_config_profile_del(const char *prof)
1502 {
1503    char buf[4096];
1504    if (e_user_dir_snprintf(buf, sizeof(buf), "config/%s", prof) >= sizeof(buf))
1505      return;
1506    ecore_file_recursive_rm(buf);
1507 }
1508
1509 EAPI void
1510 e_config_save_block_set(int block)
1511 {
1512   _e_config_save_block = block;
1513 }
1514
1515 EAPI int
1516 e_config_save_block_get(void)
1517 {
1518    return _e_config_save_block;
1519 }
1520
1521 EAPI void *
1522 e_config_domain_load(const char *domain, E_Config_DD *edd)
1523 {
1524    Eet_File *ef;
1525    char buf[4096];
1526    void *data = NULL;
1527    int i;
1528
1529    e_user_dir_snprintf(buf, sizeof(buf), "config/%s/%s.cfg",
1530                        _e_config_profile, domain);
1531    ef = eet_open(buf, EET_FILE_MODE_READ);
1532    if (ef)
1533      {
1534         data = eet_data_read(ef, edd, "config");
1535         eet_close(ef);
1536         if (data) return data;
1537      }
1538
1539    for (i = 1; i <= _e_config_revisions; i++)
1540      {
1541         e_user_dir_snprintf(buf, sizeof(buf), "config/%s/%s.%i.cfg",
1542                             _e_config_profile, domain, i);
1543         ef = eet_open(buf, EET_FILE_MODE_READ);
1544         if (ef)
1545           {
1546              data = eet_data_read(ef, edd, "config");
1547              eet_close(ef);
1548              if (data) return data;
1549           }
1550      }
1551    return e_config_domain_system_load(domain, edd);
1552 }
1553
1554 EAPI void *
1555 e_config_domain_system_load(const char *domain, E_Config_DD *edd)
1556 {
1557    Eet_File *ef;
1558    char buf[4096];
1559    void *data = NULL;
1560
1561    e_prefix_data_snprintf(buf, sizeof(buf), "data/config/%s/%s.cfg",
1562                           _e_config_profile, domain);
1563    ef = eet_open(buf, EET_FILE_MODE_READ);
1564    if (ef)
1565      {
1566         data = eet_data_read(ef, edd, "config");
1567         eet_close(ef);
1568         return data;
1569      }
1570
1571    return data;
1572 }
1573
1574 static void
1575 _e_config_mv_error(const char *from, const char *to)
1576 {
1577 #if _F_USE_EXTN_DIALOG_
1578    char buf[8192];
1579    snprintf(buf, sizeof(buf),
1580             _("Enlightenment has had an error while moving config files<br>"
1581               "from:<br>"
1582               "%s<br>"
1583               "<br>"
1584               "to:<br>"
1585               "%s<br>"
1586               "<br>"
1587               "The rest of the write has been aborted for safety.<br>"),
1588             from, to);
1589    e_util_extn_dialog_show(_("Enlightenment Settings Write Problems"), buf);
1590 #else
1591    if (!_e_config_error_dialog)
1592      {
1593         E_Dialog *dia;
1594         
1595         dia = e_dialog_new(e_container_current_get(e_manager_current_get()), 
1596                            "E", "_sys_error_logout_slow");
1597         if (dia)
1598           {
1599              char buf[8192];
1600              
1601              e_dialog_title_set(dia, _("Enlightenment Settings Write Problems"));
1602              e_dialog_icon_set(dia, "dialog-error", 64);
1603              snprintf(buf, sizeof(buf), 
1604                       _("Enlightenment has had an error while moving config files<br>"
1605                         "from:<br>"
1606                         "%s<br>"
1607                         "<br>"
1608                         "to:<br>"
1609                         "%s<br>"
1610                         "<br>"
1611                         "The rest of the write has been aborted for safety.<br>"),
1612                       from, to);
1613              e_dialog_text_set(dia, buf);
1614              e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL);
1615              e_dialog_button_focus_num(dia, 0);
1616              e_win_centered_set(dia->win, 1);
1617              e_object_del_attach_func_set(E_OBJECT(dia),
1618                                           _e_config_error_dialog_cb_delete);
1619              e_dialog_show(dia);
1620              _e_config_error_dialog = dia;
1621           }
1622      }
1623 #endif
1624 }
1625
1626 EAPI int
1627 e_config_profile_save(void)
1628 {
1629    Eet_File *ef;
1630    char buf[4096], buf2[4096];
1631    int ok = 0;
1632
1633    /* FIXME: check for other sessions fo E running */
1634    e_user_dir_concat_static(buf, "config/profile.cfg");
1635    e_user_dir_concat_static(buf2, "config/profile.cfg.tmp");
1636
1637    ef = eet_open(buf2, EET_FILE_MODE_WRITE);
1638    if (ef)
1639      {
1640         ok = eet_write(ef, "config", _e_config_profile,
1641                        strlen(_e_config_profile), 0);
1642         if (_e_config_eet_close_handle(ef, buf2))
1643           {
1644              Eina_Bool ret = EINA_TRUE;
1645
1646              if (_e_config_revisions > 0)
1647                {
1648                   int i;
1649                   char bsrc[4096], bdst[4096];
1650
1651                   for (i = _e_config_revisions; i > 1; i--)
1652                     {
1653                        e_user_dir_snprintf(bsrc, sizeof(bsrc), "config/profile.%i.cfg", i - 1);
1654                        e_user_dir_snprintf(bdst, sizeof(bdst), "config/profile.%i.cfg", i);
1655                        if ((ecore_file_exists(bsrc)) &&
1656                            (ecore_file_size(bsrc)))
1657                          {
1658                             ret = ecore_file_mv(bsrc, bdst);
1659                             if (!ret)
1660                               {
1661                                  _e_config_mv_error(bsrc, bdst);
1662                                  break;
1663                               }
1664                          }
1665                     }
1666                   if (ret)
1667                     {
1668                        e_user_dir_snprintf(bsrc, sizeof(bsrc), "config/profile.cfg");
1669                        e_user_dir_snprintf(bdst, sizeof(bdst), "config/profile.1.cfg");
1670                        ret = ecore_file_mv(bsrc, bdst);
1671 //                       if (!ret)
1672 //                          _e_config_mv_error(bsrc, bdst);
1673                     }
1674                }
1675              ret = ecore_file_mv(buf2, buf);
1676              if (!ret) _e_config_mv_error(buf2, buf);
1677           }
1678         ecore_file_unlink(buf2);
1679      }
1680    return ok;
1681 }
1682
1683 EAPI int
1684 e_config_domain_save(const char *domain, E_Config_DD *edd, const void *data)
1685 {
1686    Eet_File *ef;
1687    char buf[4096], buf2[4096];
1688    int ok = 0, ret;
1689    size_t len, len2;
1690
1691    if (_e_config_save_block) return 0;
1692    /* FIXME: check for other sessions fo E running */
1693    len = e_user_dir_snprintf(buf, sizeof(buf), "config/%s", _e_config_profile);
1694    if (len + 1 >= sizeof(buf)) return 0;
1695
1696    ecore_file_mkdir(buf);
1697
1698    buf[len] = '/';
1699    len++;
1700
1701    len2 = eina_strlcpy(buf + len, domain, sizeof(buf) - len);
1702    if (len2 + sizeof(".cfg") >= sizeof(buf) - len) return 0;
1703
1704    len += len2;
1705
1706    memcpy(buf + len, ".cfg", sizeof(".cfg"));
1707    len += sizeof(".cfg") - 1;
1708
1709    if (len + sizeof(".tmp") >= sizeof(buf)) return 0;
1710    memcpy(buf2, buf, len);
1711    memcpy(buf2 + len, ".tmp", sizeof(".tmp"));
1712
1713    ef = eet_open(buf2, EET_FILE_MODE_WRITE);
1714    if (ef)
1715      {
1716         ok = eet_data_write(ef, edd, "config", data, 1);
1717         if (_e_config_eet_close_handle(ef, buf2))
1718           {
1719              if (_e_config_revisions > 0)
1720                {
1721                   int i;
1722                   char bsrc[4096], bdst[4096];
1723
1724                   for (i = _e_config_revisions; i > 1; i--)
1725                     {
1726                        e_user_dir_snprintf(bsrc, sizeof(bsrc), "config/%s/%s.%i.cfg", _e_config_profile, domain, i - 1);
1727                        e_user_dir_snprintf(bdst, sizeof(bdst), "config/%s/%s.%i.cfg", _e_config_profile, domain, i);
1728                        if ((ecore_file_exists(bsrc)) &&
1729                            (ecore_file_size(bsrc)))
1730                          {
1731                             ecore_file_mv(bsrc, bdst);
1732                          }
1733                     }
1734                   e_user_dir_snprintf(bsrc, sizeof(bsrc), "config/%s/%s.cfg", _e_config_profile, domain);
1735                   e_user_dir_snprintf(bdst, sizeof(bdst), "config/%s/%s.1.cfg", _e_config_profile, domain);
1736                   ecore_file_mv(bsrc, bdst);
1737                }
1738              ret = ecore_file_mv(buf2, buf);
1739              if (!ret)
1740                {
1741                   printf("*** Error saving config. ***\n");
1742                }
1743           }
1744         ecore_file_unlink(buf2);
1745      }
1746    return ok;
1747 }
1748
1749 EAPI E_Config_Binding_Mouse *
1750 e_config_binding_mouse_match(E_Config_Binding_Mouse *eb_in)
1751 {
1752    Eina_List *l;
1753    E_Config_Binding_Mouse *eb;
1754
1755    EINA_LIST_FOREACH(e_config->mouse_bindings, l, eb)
1756      {
1757         if ((eb->context == eb_in->context) &&
1758             (eb->button == eb_in->button) &&
1759             (eb->modifiers == eb_in->modifiers) &&
1760             (eb->any_mod == eb_in->any_mod) &&
1761             (((eb->action) && (eb_in->action) && (!strcmp(eb->action, eb_in->action))) ||
1762              ((!eb->action) && (!eb_in->action))) &&
1763             (((eb->params) && (eb_in->params) && (!strcmp(eb->params, eb_in->params))) ||
1764              ((!eb->params) && (!eb_in->params))))
1765           return eb;
1766      }
1767    return NULL;
1768 }
1769
1770 EAPI E_Config_Binding_Key *
1771 e_config_binding_key_match(E_Config_Binding_Key *eb_in)
1772 {
1773    Eina_List *l;
1774    E_Config_Binding_Key *eb;
1775
1776    EINA_LIST_FOREACH(e_config->mouse_bindings, l, eb)
1777      {
1778         if ((eb->context == eb_in->context) &&
1779             (eb->modifiers == eb_in->modifiers) &&
1780             (eb->any_mod == eb_in->any_mod) &&
1781             (((eb->key) && (eb_in->key) && (!strcmp(eb->key, eb_in->key))) ||
1782              ((!eb->key) && (!eb_in->key))) &&
1783             (((eb->action) && (eb_in->action) && (!strcmp(eb->action, eb_in->action))) ||
1784              ((!eb->action) && (!eb_in->action))) &&
1785             (((eb->params) && (eb_in->params) && (!strcmp(eb->params, eb_in->params))) ||
1786              ((!eb->params) && (!eb_in->params))))
1787           return eb;
1788      }
1789    return NULL;
1790 }
1791
1792 EAPI E_Config_Binding_Edge *
1793 e_config_binding_edge_match(E_Config_Binding_Edge *eb_in)
1794 {
1795    Eina_List *l;
1796    E_Config_Binding_Edge *eb;
1797
1798    EINA_LIST_FOREACH(e_config->edge_bindings, l, eb)
1799      {
1800         if ((eb->context == eb_in->context) &&
1801             (eb->modifiers == eb_in->modifiers) &&
1802             (eb->any_mod == eb_in->any_mod) &&
1803             (eb->edge == eb_in->edge) &&
1804             (eb->delay == eb_in->delay) &&
1805             (((eb->action) && (eb_in->action) && (!strcmp(eb->action, eb_in->action))) ||
1806              ((!eb->action) && (!eb_in->action))) &&
1807             (((eb->params) && (eb_in->params) && (!strcmp(eb->params, eb_in->params))) ||
1808              ((!eb->params) && (!eb_in->params))))
1809           return eb;
1810      }
1811    return NULL;
1812 }
1813
1814 EAPI E_Config_Binding_Signal *
1815 e_config_binding_signal_match(E_Config_Binding_Signal *eb_in)
1816 {
1817    Eina_List *l;
1818    E_Config_Binding_Signal *eb;
1819
1820    EINA_LIST_FOREACH(e_config->signal_bindings, l, eb)
1821      {
1822         if ((eb->context == eb_in->context) &&
1823             (eb->modifiers == eb_in->modifiers) &&
1824             (eb->any_mod == eb_in->any_mod) &&
1825             (((eb->signal) && (eb_in->signal) && (!strcmp(eb->signal, eb_in->signal))) ||
1826              ((!eb->signal) && (!eb_in->signal))) &&
1827             (((eb->source) && (eb_in->source) && (!strcmp(eb->source, eb_in->source))) ||
1828              ((!eb->source) && (!eb_in->source))) &&
1829             (((eb->action) && (eb_in->action) && (!strcmp(eb->action, eb_in->action))) ||
1830              ((!eb->action) && (!eb_in->action))) &&
1831             (((eb->params) && (eb_in->params) && (!strcmp(eb->params, eb_in->params))) ||
1832              ((!eb->params) && (!eb_in->params))))
1833           return eb;
1834      }
1835    return NULL;
1836 }
1837
1838 EAPI E_Config_Binding_Wheel *
1839 e_config_binding_wheel_match(E_Config_Binding_Wheel *eb_in)
1840 {
1841    Eina_List *l;
1842    E_Config_Binding_Wheel *eb;
1843
1844    EINA_LIST_FOREACH(e_config->wheel_bindings, l, eb)
1845      {
1846         if ((eb->context == eb_in->context) &&
1847             (eb->direction == eb_in->direction) &&
1848             (eb->z == eb_in->z) &&
1849             (eb->modifiers == eb_in->modifiers) &&
1850             (eb->any_mod == eb_in->any_mod) &&
1851             (((eb->action) && (eb_in->action) && (!strcmp(eb->action, eb_in->action))) ||
1852                 ((!eb->action) && (!eb_in->action))) &&
1853             (((eb->params) && (eb_in->params) && (!strcmp(eb->params, eb_in->params))) ||
1854                 ((!eb->params) && (!eb_in->params))))
1855           return eb;
1856      }
1857    return NULL;
1858 }
1859
1860 EAPI E_Config_Binding_Acpi *
1861 e_config_binding_acpi_match(E_Config_Binding_Acpi *eb_in)
1862 {
1863    Eina_List *l;
1864    E_Config_Binding_Acpi *eb;
1865
1866    EINA_LIST_FOREACH(e_config->acpi_bindings, l, eb)
1867      {
1868         if ((eb->context == eb_in->context) &&
1869             (eb->type == eb_in->type) &&
1870             (eb->status == eb_in->status) &&
1871             (((eb->action) && (eb_in->action) &&
1872               (!strcmp(eb->action, eb_in->action))) ||
1873                 ((!eb->action) && (!eb_in->action))) &&
1874             (((eb->params) && (eb_in->params) &&
1875               (!strcmp(eb->params, eb_in->params))) ||
1876                 ((!eb->params) && (!eb_in->params))))
1877           return eb;
1878      }
1879    return NULL;
1880 }
1881
1882 EAPI void
1883 e_config_mode_changed(void)
1884 {
1885    ecore_event_add(E_EVENT_CONFIG_MODE_CHANGED, NULL, NULL, NULL);
1886 }
1887
1888 /* local subsystem functions */
1889 static void
1890 _e_config_save_cb(void *data __UNUSED__)
1891 {
1892    e_config_profile_save();
1893    e_module_save_all();
1894    e_config_domain_save("e", _e_config_edd, e_config);
1895    _e_config_save_defer = NULL;
1896 }
1897
1898 static void
1899 _e_config_free(E_Config *ecf)
1900 {
1901    E_Config_Binding_Signal *ebs;
1902    E_Config_Binding_Mouse *ebm;
1903    E_Config_Binding_Wheel *ebw;
1904    E_Config_Syscon_Action *sca;
1905    E_Config_Binding_Key *ebk;
1906    E_Config_Binding_Edge *ebe;
1907    E_Config_Binding_Acpi *eba;
1908    E_Font_Fallback *eff;
1909    E_Config_Module *em;
1910    E_Font_Default *efd;
1911    E_Config_Theme *et;
1912    E_Color_Class *cc;
1913    E_Path_Dir *epd;
1914    E_Remember *rem;
1915    E_Config_Env_Var *evr;
1916
1917    if (!ecf) return;
1918
1919    EINA_LIST_FREE(ecf->modules, em)
1920      {
1921         if (em->name) eina_stringshare_del(em->name);
1922         E_FREE(em);
1923      }
1924    EINA_LIST_FREE(ecf->font_fallbacks, eff)
1925      {
1926         if (eff->name) eina_stringshare_del(eff->name);
1927         E_FREE(eff);
1928      }
1929    EINA_LIST_FREE(ecf->font_defaults, efd)
1930      {
1931         if (efd->text_class) eina_stringshare_del(efd->text_class);
1932         if (efd->font) eina_stringshare_del(efd->font);
1933         E_FREE(efd);
1934      }
1935    EINA_LIST_FREE(ecf->themes, et)
1936      {
1937         if (et->category) eina_stringshare_del(et->category);
1938         if (et->file) eina_stringshare_del(et->file);
1939         E_FREE(et);
1940      }
1941    EINA_LIST_FREE(ecf->mouse_bindings, ebm)
1942      {
1943         if (ebm->action) eina_stringshare_del(ebm->action);
1944         if (ebm->params) eina_stringshare_del(ebm->params);
1945         E_FREE(ebm);
1946      }
1947    EINA_LIST_FREE(ecf->key_bindings, ebk)
1948      {
1949         if (ebk->key) eina_stringshare_del(ebk->key);
1950         if (ebk->action) eina_stringshare_del(ebk->action);
1951         if (ebk->params) eina_stringshare_del(ebk->params);
1952         E_FREE(ebk);
1953      }
1954    EINA_LIST_FREE(ecf->edge_bindings, ebe)
1955      {
1956         if (ebe->action) eina_stringshare_del(ebe->action);
1957         if (ebe->params) eina_stringshare_del(ebe->params);
1958         E_FREE(ebe);
1959      }
1960    EINA_LIST_FREE(ecf->signal_bindings, ebs)
1961      {
1962         if (ebs->signal) eina_stringshare_del(ebs->signal);
1963         if (ebs->source) eina_stringshare_del(ebs->source);
1964         if (ebs->action) eina_stringshare_del(ebs->action);
1965         if (ebs->params) eina_stringshare_del(ebs->params);
1966         E_FREE(ebs);
1967      }
1968    EINA_LIST_FREE(ecf->wheel_bindings, ebw)
1969      {
1970         if (ebw->action) eina_stringshare_del(ebw->action);
1971         if (ebw->params) eina_stringshare_del(ebw->params);
1972         E_FREE(ebw);
1973      }
1974    EINA_LIST_FREE(ecf->acpi_bindings, eba)
1975      {
1976         if (eba->action) eina_stringshare_del(eba->action);
1977         if (eba->params) eina_stringshare_del(eba->params);
1978         E_FREE(eba);
1979      }
1980    EINA_LIST_FREE(ecf->path_append_data, epd)
1981      {
1982         if (epd->dir) eina_stringshare_del(epd->dir);
1983         E_FREE(epd);
1984      }
1985    EINA_LIST_FREE(ecf->path_append_images, epd)
1986      {
1987         if (epd->dir) eina_stringshare_del(epd->dir);
1988         E_FREE(epd);
1989      }
1990    EINA_LIST_FREE(ecf->path_append_fonts, epd)
1991      {
1992         if (epd->dir) eina_stringshare_del(epd->dir);
1993         E_FREE(epd);
1994      }
1995    EINA_LIST_FREE(ecf->path_append_themes, epd)
1996      {
1997         if (epd->dir) eina_stringshare_del(epd->dir);
1998         E_FREE(epd);
1999      }
2000    EINA_LIST_FREE(ecf->path_append_init, epd)
2001      {
2002         if (epd->dir) eina_stringshare_del(epd->dir);
2003         E_FREE(epd);
2004      }
2005    EINA_LIST_FREE(ecf->path_append_icons, epd)
2006      {
2007         if (epd->dir) eina_stringshare_del(epd->dir);
2008         E_FREE(epd);
2009      }
2010    EINA_LIST_FREE(ecf->path_append_modules, epd)
2011      {
2012         if (epd->dir) eina_stringshare_del(epd->dir);
2013         E_FREE(epd);
2014      }
2015    EINA_LIST_FREE(ecf->path_append_backgrounds, epd)
2016      {
2017         if (epd->dir) eina_stringshare_del(epd->dir);
2018         E_FREE(epd);
2019      }
2020    EINA_LIST_FREE(ecf->path_append_messages, epd)
2021      {
2022         if (epd->dir) eina_stringshare_del(epd->dir);
2023         E_FREE(epd);
2024      }
2025    EINA_LIST_FREE(ecf->remembers, rem)
2026      {
2027         if (rem->name) eina_stringshare_del(rem->name);
2028         if (rem->class) eina_stringshare_del(rem->class);
2029         if (rem->title) eina_stringshare_del(rem->title);
2030         if (rem->role) eina_stringshare_del(rem->role);
2031         if (rem->prop.border) eina_stringshare_del(rem->prop.border);
2032         if (rem->prop.command) eina_stringshare_del(rem->prop.command);
2033         E_FREE(rem);
2034      }
2035    EINA_LIST_FREE(ecf->color_classes, cc)
2036      {
2037         if (cc->name) eina_stringshare_del(cc->name);
2038         E_FREE(cc);
2039      }
2040    if (ecf->init_default_theme) eina_stringshare_del(ecf->init_default_theme);
2041    if (ecf->desktop_default_background) eina_stringshare_del(ecf->desktop_default_background);
2042    if (ecf->desktop_default_name) eina_stringshare_del(ecf->desktop_default_name);
2043    if (ecf->desktop_default_window_profile) eina_stringshare_del(ecf->desktop_default_window_profile);
2044    if (ecf->language) eina_stringshare_del(ecf->language);
2045    if (ecf->transition_start) eina_stringshare_del(ecf->transition_start);
2046    if (ecf->transition_desk) eina_stringshare_del(ecf->transition_desk);
2047    if (ecf->transition_change) eina_stringshare_del(ecf->transition_change);
2048    if (ecf->input_method) eina_stringshare_del(ecf->input_method);
2049    if (ecf->exebuf_term_cmd) eina_stringshare_del(ecf->exebuf_term_cmd);
2050    if (ecf->desklock_personal_passwd) eina_stringshare_del(ecf->desklock_personal_passwd);
2051    if (ecf->desklock_background) eina_stringshare_del(ecf->desklock_background);
2052    if (ecf->icon_theme) eina_stringshare_del(ecf->icon_theme);
2053    if (ecf->wallpaper_import_last_dev) eina_stringshare_del(ecf->wallpaper_import_last_dev);
2054    if (ecf->wallpaper_import_last_path) eina_stringshare_del(ecf->wallpaper_import_last_path);
2055    if (ecf->theme_default_border_style) eina_stringshare_del(ecf->theme_default_border_style);
2056    if (ecf->desklock_custom_desklock_cmd) eina_stringshare_del(ecf->desklock_custom_desklock_cmd);
2057    EINA_LIST_FREE(ecf->syscon.actions, sca)
2058      {
2059         if (sca->action) eina_stringshare_del(sca->action);
2060         if (sca->params) eina_stringshare_del(sca->params);
2061         if (sca->button) eina_stringshare_del(sca->button);
2062         if (sca->icon) eina_stringshare_del(sca->icon);
2063         E_FREE(sca);
2064      }
2065    if(ecf->randr_serialized_setup)
2066      {
2067          e_randr_serialized_setup_free(ecf->randr_serialized_setup);
2068      }
2069    EINA_LIST_FREE(ecf->env_vars, evr)
2070      {
2071         if (evr->var) eina_stringshare_del(evr->var);
2072         if (evr->val) eina_stringshare_del(evr->val);
2073         E_FREE(evr);
2074      }
2075    if (ecf->xsettings.net_icon_theme_name)
2076      eina_stringshare_del(ecf->xsettings.net_icon_theme_name);
2077    if (ecf->xsettings.net_theme_name)
2078      eina_stringshare_del(ecf->xsettings.net_theme_name);
2079    if (ecf->xsettings.gtk_font_name)
2080      eina_stringshare_del(ecf->xsettings.gtk_font_name);
2081
2082    E_FREE(ecf);
2083 }
2084
2085    static Eina_Bool
2086 _e_config_cb_timer(void *data)
2087 {
2088    e_util_dialog_show(_("Settings Upgraded"), "%s", (char *)data);
2089    return 0;
2090 }
2091
2092    static int
2093 _e_config_eet_close_handle(Eet_File *ef, char *file)
2094 {
2095    Eet_Error err;
2096    char *erstr = NULL;
2097
2098    err = eet_close(ef);
2099    switch (err)
2100      {
2101       case EET_ERROR_NONE:
2102          /* all good - no error */
2103          break;
2104       case EET_ERROR_BAD_OBJECT:
2105          erstr = _("The EET file handle is bad.");
2106          break;
2107       case EET_ERROR_EMPTY:
2108          erstr = _("The file data is empty.");
2109          break;
2110       case EET_ERROR_NOT_WRITABLE:
2111          erstr = _("The file is not writable. Perhaps the disk is read-only<br>or you lost permissions to your files.");
2112         break;
2113       case EET_ERROR_OUT_OF_MEMORY:
2114         erstr = _("Memory ran out while preparing the write.<br>Please free up memory.");
2115         break;
2116       case EET_ERROR_WRITE_ERROR:
2117         erstr = _("This is a generic error.");
2118         break;
2119       case EET_ERROR_WRITE_ERROR_FILE_TOO_BIG:
2120         erstr = _("The settings file is too large.<br>It should be very small (a few hundred KB at most).");
2121         break;
2122       case EET_ERROR_WRITE_ERROR_IO_ERROR:
2123         erstr = _("You have I/O errors on the disk.<br>Maybe it needs replacing?");
2124         break;
2125       case EET_ERROR_WRITE_ERROR_OUT_OF_SPACE:
2126         erstr = _("You ran out of space while writing the file");
2127         break;
2128       case EET_ERROR_WRITE_ERROR_FILE_CLOSED:
2129         erstr = _("The file was closed on it while writing.");
2130         break;
2131       case EET_ERROR_MMAP_FAILED:
2132         erstr = _("Memory-mapping (mmap) of the file failed.");
2133         break;
2134       case EET_ERROR_X509_ENCODING_FAILED:
2135         erstr = _("X509 Encoding failed.");
2136         break;
2137       case EET_ERROR_SIGNATURE_FAILED:
2138         erstr = _("Signature failed.");
2139         break;
2140       case EET_ERROR_INVALID_SIGNATURE:
2141         erstr = _("The signature was invalid.");
2142         break;
2143       case EET_ERROR_NOT_SIGNED:
2144         erstr = _("Not signed.");
2145         break;
2146       case EET_ERROR_NOT_IMPLEMENTED:
2147         erstr = _("Feature not implemented.");
2148         break;
2149       case EET_ERROR_PRNG_NOT_SEEDED:
2150         erstr = _("PRNG was not seeded.");
2151         break;
2152       case EET_ERROR_ENCRYPT_FAILED:
2153         erstr = _("Encryption failed.");
2154         break;
2155       case EET_ERROR_DECRYPT_FAILED:
2156         erstr = _("Decryption failed.");
2157         break;
2158       default: /* if we get here eet added errors we don't know */
2159         erstr = _("The error is unknown to Enlightenment.");
2160         break;
2161      }
2162    if (erstr)
2163      {
2164         /* delete any partially-written file */
2165         ecore_file_unlink(file);
2166 #if _F_USE_EXTN_DIALOG_
2167         char buf[8192];
2168         snprintf(buf, sizeof(buf),
2169                  _("Enlightenment has had an error while writing<br>"
2170                    "its config file.<br>"
2171                    "%s<br>"
2172                    "<br>"
2173                    "The file where the error occurred was:<br>"
2174                    "%s<br>"
2175                    "<br>"
2176                    "This file has been deleted to avoid corrupt data.<br>"),
2177                  erstr, file);
2178         e_util_extn_dialog_show(_("Enlightenment Settings Write Problems"), buf);
2179 #else
2180         /* only show dialog for first error - further ones are likely */
2181         /* more of the same error */
2182         if (!_e_config_error_dialog)
2183           {
2184              E_Dialog *dia;
2185
2186              dia = e_dialog_new(e_container_current_get(e_manager_current_get()), 
2187                                 "E", "_sys_error_logout_slow");
2188              if (dia)
2189                {
2190                   char buf[8192];
2191
2192                   e_dialog_title_set(dia, _("Enlightenment Settings Write Problems"));
2193                   e_dialog_icon_set(dia, "dialog-error", 64);
2194                   snprintf(buf, sizeof(buf), 
2195                            _("Enlightenment has had an error while writing<br>"
2196                              "its config file.<br>"
2197                              "%s<br>"
2198                              "<br>"
2199                              "The file where the error occurred was:<br>"
2200                              "%s<br>"
2201                              "<br>"
2202                              "This file has been deleted to avoid corrupt data.<br>"),
2203                            erstr, file);
2204                   e_dialog_text_set(dia, buf);
2205                   e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL);
2206                   e_dialog_button_focus_num(dia, 0);
2207                   e_win_centered_set(dia->win, 1);
2208                   e_object_del_attach_func_set(E_OBJECT(dia),
2209                                                _e_config_error_dialog_cb_delete);
2210                   e_dialog_show(dia);
2211                   _e_config_error_dialog = dia;
2212                }
2213           }
2214 #endif
2215         return 0;
2216      }
2217    return 1;
2218 }
2219
2220 static void
2221 _e_config_acpi_bindings_add(void)
2222 {
2223    E_Config_Binding_Acpi *bind;
2224
2225    bind = E_NEW(E_Config_Binding_Acpi, 1);
2226    bind->context = E_BINDING_CONTEXT_NONE;
2227    bind->type = E_ACPI_TYPE_AC_ADAPTER;
2228    bind->status = 0;
2229    bind->action = eina_stringshare_add("dim_screen");
2230    bind->params = NULL;
2231    e_config->acpi_bindings = eina_list_append(e_config->acpi_bindings, bind);
2232
2233    bind = E_NEW(E_Config_Binding_Acpi, 1);
2234    bind->context = E_BINDING_CONTEXT_NONE;
2235    bind->type = E_ACPI_TYPE_AC_ADAPTER;
2236    bind->status = 1;
2237    bind->action = eina_stringshare_add("undim_screen");
2238    bind->params = NULL;
2239    e_config->acpi_bindings = eina_list_append(e_config->acpi_bindings, bind);
2240
2241    bind = E_NEW(E_Config_Binding_Acpi, 1);
2242    bind->context = E_BINDING_CONTEXT_NONE;
2243    bind->type = E_ACPI_TYPE_LID;
2244    bind->status = 0;
2245    bind->action = eina_stringshare_add("suspend");
2246    bind->params = eina_stringshare_add("now");
2247    e_config->acpi_bindings = eina_list_append(e_config->acpi_bindings, bind);
2248
2249    bind = E_NEW(E_Config_Binding_Acpi, 1);
2250    bind->context = E_BINDING_CONTEXT_NONE;
2251    bind->type = E_ACPI_TYPE_POWER;
2252    bind->status = -1;
2253    bind->action = eina_stringshare_add("halt_now");
2254    bind->params = eina_stringshare_add("now");
2255    e_config->acpi_bindings = eina_list_append(e_config->acpi_bindings, bind);
2256
2257    bind = E_NEW(E_Config_Binding_Acpi, 1);
2258    bind->context = E_BINDING_CONTEXT_NONE;
2259    bind->type = E_ACPI_TYPE_SLEEP;
2260    bind->status = -1;
2261    bind->action = eina_stringshare_add("suspend");
2262    bind->params = eina_stringshare_add("now");
2263    e_config->acpi_bindings = eina_list_append(e_config->acpi_bindings, bind);
2264 }