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