chiark / gitweb /
Imported Upstream version 1.0.0
[e16] / src / settings.c
1 /*
2  * Copyright (C) 2000-2007 Carsten Haitzler, Geoff Harrison and various contributors
3  * Copyright (C) 2004-2009 Kim Woelders
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy
6  * of this software and associated documentation files (the "Software"), to
7  * deal in the Software without restriction, including without limitation the
8  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9  * sell copies of the Software, and to permit persons to whom the Software is
10  * furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies of the Software, its documentation and marketing & publicity
14  * materials, and acknowledgment shall be given in the documentation, materials
15  * and software packages that this Software was used.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20  * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 #include "E.h"
25 #if ENABLE_DIALOGS
26 #include "dialog.h"
27 #include "settings.h"
28
29 static int          tmp_move;
30 static int          tmp_resize;
31 static int          tmp_geominfo;
32 static int          tmp_maximize;
33 static char         tmp_dragbar_nocover;
34 static char         tmp_avoid_server_grab;
35 static char         tmp_update_while_moving;
36 static char         tmp_sync_request;
37
38 static void
39 CB_ConfigureMoveResize(Dialog * d __UNUSED__, int val, void *data __UNUSED__)
40 {
41    if (val < 2)
42      {
43         Conf.movres.mode_move = tmp_move;
44         Conf.movres.mode_resize = tmp_resize;
45         Conf.movres.mode_info = tmp_geominfo;
46         Conf.movres.mode_maximize_default = tmp_maximize;
47         Conf.movres.avoid_server_grab = tmp_avoid_server_grab;
48         Conf.movres.update_while_moving = tmp_update_while_moving;
49         Conf.movres.enable_sync_request = tmp_sync_request;
50         Conf.movres.dragbar_nocover = tmp_dragbar_nocover;
51      }
52    autosave();
53 }
54
55 static void
56 _DlgFillMoveResize(Dialog * d __UNUSED__, DItem * table, void *data __UNUSED__)
57 {
58    DItem              *di, *radio1, *radio2, *radio3, *radio4;
59
60    tmp_move = Conf.movres.mode_move;
61    tmp_resize = Conf.movres.mode_resize;
62    tmp_geominfo = Conf.movres.mode_info;
63    tmp_maximize = Conf.movres.mode_maximize_default;
64    tmp_avoid_server_grab = Conf.movres.avoid_server_grab;
65    tmp_update_while_moving = Conf.movres.update_while_moving;
66    tmp_sync_request = Conf.movres.enable_sync_request;
67    tmp_dragbar_nocover = Conf.movres.dragbar_nocover;
68
69    DialogItemTableSetOptions(table, 2, 0, 0, 0);
70
71    di = DialogAddItem(table, DITEM_TEXT);
72    DialogItemSetFill(di, 0, 0);
73    DialogItemSetAlign(di, 0, 512);
74    DialogItemSetText(di, _("Move Methods:"));
75
76    di = DialogAddItem(table, DITEM_TEXT);
77    DialogItemSetFill(di, 0, 0);
78    DialogItemSetAlign(di, 0, 512);
79    DialogItemSetText(di, _("Resize Methods:"));
80
81    radio1 = di = DialogAddItem(table, DITEM_RADIOBUTTON);
82    DialogItemSetText(di, _("Opaque"));
83    DialogItemRadioButtonSetFirst(di, radio1);
84    DialogItemRadioButtonGroupSetVal(di, 0);
85
86    radio2 = di = DialogAddItem(table, DITEM_RADIOBUTTON);
87    DialogItemSetText(di, _("Opaque"));
88    DialogItemRadioButtonSetFirst(di, radio2);
89    DialogItemRadioButtonGroupSetVal(di, 0);
90
91    di = DialogAddItem(table, DITEM_RADIOBUTTON);
92    DialogItemSetText(di, _("Technical"));
93    DialogItemRadioButtonSetFirst(di, radio1);
94    DialogItemRadioButtonGroupSetVal(di, 1);
95
96    di = DialogAddItem(table, DITEM_RADIOBUTTON);
97    DialogItemSetText(di, _("Technical"));
98    DialogItemRadioButtonSetFirst(di, radio2);
99    DialogItemRadioButtonGroupSetVal(di, 1);
100
101    di = DialogAddItem(table, DITEM_RADIOBUTTON);
102    DialogItemSetText(di, _("Box"));
103    DialogItemRadioButtonSetFirst(di, radio1);
104    DialogItemRadioButtonGroupSetVal(di, 2);
105
106    di = DialogAddItem(table, DITEM_RADIOBUTTON);
107    DialogItemSetText(di, _("Box"));
108    DialogItemRadioButtonSetFirst(di, radio2);
109    DialogItemRadioButtonGroupSetVal(di, 2);
110
111    di = DialogAddItem(table, DITEM_RADIOBUTTON);
112    DialogItemSetText(di, _("Shaded"));
113    DialogItemRadioButtonSetFirst(di, radio1);
114    DialogItemRadioButtonGroupSetVal(di, 3);
115
116    di = DialogAddItem(table, DITEM_RADIOBUTTON);
117    DialogItemSetText(di, _("Shaded"));
118    DialogItemRadioButtonSetFirst(di, radio2);
119    DialogItemRadioButtonGroupSetVal(di, 3);
120
121    di = DialogAddItem(table, DITEM_RADIOBUTTON);
122    DialogItemSetText(di, _("Semi-Solid"));
123    DialogItemRadioButtonSetFirst(di, radio1);
124    DialogItemRadioButtonGroupSetVal(di, 4);
125
126    di = DialogAddItem(table, DITEM_RADIOBUTTON);
127    DialogItemSetText(di, _("Semi-Solid"));
128    DialogItemRadioButtonSetFirst(di, radio2);
129    DialogItemRadioButtonGroupSetVal(di, 4);
130    DialogItemRadioButtonGroupSetValPtr(radio2, &tmp_resize);
131
132    di = DialogAddItem(table, DITEM_RADIOBUTTON);
133    DialogItemSetText(di, _("Translucent"));
134    DialogItemRadioButtonSetFirst(di, radio1);
135    DialogItemRadioButtonGroupSetVal(di, 5);
136    DialogItemRadioButtonGroupSetValPtr(radio1, &tmp_move);
137
138    di = DialogAddItem(table, DITEM_NONE);
139
140    di = DialogAddItem(table, DITEM_CHECKBUTTON);
141    DialogItemSetColSpan(di, 2);
142    DialogItemSetText(di, _("Avoid server grab"));
143    DialogItemCheckButtonSetPtr(di, &tmp_avoid_server_grab);
144
145    di = DialogAddItem(table, DITEM_SEPARATOR);
146    DialogItemSetColSpan(di, 2);
147
148    di = DialogAddItem(table, DITEM_TEXT);
149    DialogItemSetColSpan(di, 2);
150    DialogItemSetFill(di, 0, 0);
151    DialogItemSetAlign(di, 0, 512);
152    DialogItemSetText(di, _("Move/Resize Geometry Info Postion:"));
153
154    radio3 = di = DialogAddItem(table, DITEM_RADIOBUTTON);
155    DialogItemSetColSpan(di, 2);
156    DialogItemSetText(di, _("Window Center (O/T/B Methods)"));
157    DialogItemRadioButtonSetFirst(di, radio3);
158    DialogItemRadioButtonGroupSetVal(di, 1);
159
160    di = DialogAddItem(table, DITEM_RADIOBUTTON);
161    DialogItemSetColSpan(di, 2);
162    DialogItemSetText(di, _("Always Screen corner"));
163    DialogItemRadioButtonSetFirst(di, radio3);
164    DialogItemRadioButtonGroupSetVal(di, 2);
165
166    di = DialogAddItem(table, DITEM_RADIOBUTTON);
167    DialogItemSetColSpan(di, 2);
168    DialogItemSetText(di, _("Don't show"));
169    DialogItemRadioButtonSetFirst(di, radio3);
170    DialogItemRadioButtonGroupSetVal(di, 0);
171    DialogItemRadioButtonGroupSetValPtr(radio3, &tmp_geominfo);
172
173    di = DialogAddItem(table, DITEM_SEPARATOR);
174    DialogItemSetColSpan(di, 2);
175
176    di = DialogAddItem(table, DITEM_TEXT);
177    DialogItemSetColSpan(di, 2);
178    DialogItemSetFill(di, 0, 0);
179    DialogItemSetAlign(di, 0, 512);
180    DialogItemSetText(di, _("Default Resize Policy:"));
181
182    radio4 = di = DialogAddItem(table, DITEM_RADIOBUTTON);
183    DialogItemSetColSpan(di, 2);
184    DialogItemSetText(di, _("Conservative"));
185    DialogItemRadioButtonSetFirst(di, radio4);
186    DialogItemRadioButtonGroupSetVal(di, 2);
187
188    di = DialogAddItem(table, DITEM_RADIOBUTTON);
189    DialogItemSetColSpan(di, 2);
190    DialogItemSetText(di, _("Available"));
191    DialogItemRadioButtonSetFirst(di, radio4);
192    DialogItemRadioButtonGroupSetVal(di, 1);
193
194    di = DialogAddItem(table, DITEM_RADIOBUTTON);
195    DialogItemSetColSpan(di, 2);
196    DialogItemSetText(di, _("Absolute"));
197    DialogItemRadioButtonSetFirst(di, radio4);
198    DialogItemRadioButtonGroupSetVal(di, 0);
199    DialogItemRadioButtonGroupSetValPtr(radio4, &tmp_maximize);
200
201    di = DialogAddItem(table, DITEM_SEPARATOR);
202    DialogItemSetColSpan(di, 2);
203
204    di = DialogAddItem(table, DITEM_CHECKBUTTON);
205    DialogItemSetColSpan(di, 2);
206    DialogItemSetText(di, _("Update window while moving"));
207    DialogItemCheckButtonSetPtr(di, &tmp_update_while_moving);
208
209    di = DialogAddItem(table, DITEM_CHECKBUTTON);
210    DialogItemSetColSpan(di, 2);
211    DialogItemSetText(di, _("Synchronize move/resize with application"));
212    DialogItemCheckButtonSetPtr(di, &tmp_sync_request);
213
214    di = DialogAddItem(table, DITEM_CHECKBUTTON);
215    DialogItemSetColSpan(di, 2);
216    DialogItemSetText(di, _("Do not cover dragbar"));
217    DialogItemCheckButtonSetPtr(di, &tmp_dragbar_nocover);
218 }
219
220 const DialogDef     DlgMoveResize = {
221    "CONFIGURE_MOVERESIZE",
222    N_("Move/Resize"),
223    N_("Move & Resize Settings"),
224    SOUND_SETTINGS_MOVERESIZE,
225    "pix/moveres.png",
226    N_("Enlightenment Move & Resize\n" "Method Settings Dialog\n"),
227    _DlgFillMoveResize,
228    DLG_OAC, CB_ConfigureMoveResize,
229 };
230
231 static char         tmp_with_leader;
232 static char         tmp_switch_popup;
233 static char         tmp_manual_placement;
234 static char         tmp_manual_placement_mouse_pointer;
235 static char         tmp_center_if_desk_full;
236 static char         tmp_map_slide;
237 static char         tmp_cleanup_slide;
238 static int          tmp_slide_mode;
239 static int          tmp_map_slide_speed;
240 static int          tmp_cleanup_slide_speed;
241 static char         tmp_animate_shading;
242 static int          tmp_shade_speed;
243 static char         tmp_place_ignore_struts;
244 static char         tmp_raise_fullscreen;
245
246 #ifdef USE_XINERAMA_no          /* Not implemented */
247 static char         tmp_extra_head;
248 #endif
249
250 static void
251 CB_ConfigurePlacement(Dialog * d __UNUSED__, int val, void *data __UNUSED__)
252 {
253    if (val < 2)
254      {
255         Conf.focus.transientsfollowleader = tmp_with_leader;
256         Conf.focus.switchfortransientmap = tmp_switch_popup;
257
258         Conf.place.manual = tmp_manual_placement;
259         Conf.place.manual_mouse_pointer = tmp_manual_placement_mouse_pointer;
260         Conf.place.center_if_desk_full = tmp_center_if_desk_full;
261
262         Conf.place.slidein = tmp_map_slide;
263         Conf.place.cleanupslide = tmp_cleanup_slide;
264         Conf.place.slidemode = tmp_slide_mode;
265         Conf.place.slidespeedmap = tmp_map_slide_speed;
266         Conf.place.slidespeedcleanup = tmp_cleanup_slide_speed;
267
268         Conf.shading.animate = tmp_animate_shading;
269         Conf.shading.speed = tmp_shade_speed;
270
271         Conf.place.ignore_struts = tmp_place_ignore_struts;
272         Conf.place.raise_fullscreen = tmp_raise_fullscreen;
273 #ifdef USE_XINERAMA_no          /* Not implemented */
274         if (Mode.display.xinerama_active)
275            Conf.place.extra_head = tmp_extra_head;
276 #endif
277      }
278    autosave();
279 }
280
281 static void
282 _DlgFillPlacement(Dialog * d __UNUSED__, DItem * table, void *data __UNUSED__)
283 {
284    DItem              *di, *radio;
285
286    tmp_with_leader = Conf.focus.transientsfollowleader;
287    tmp_switch_popup = Conf.focus.switchfortransientmap;
288
289    tmp_manual_placement = Conf.place.manual;
290    tmp_manual_placement_mouse_pointer = Conf.place.manual_mouse_pointer;
291    tmp_center_if_desk_full = Conf.place.center_if_desk_full;
292
293    tmp_map_slide = Conf.place.slidein;
294    tmp_cleanup_slide = Conf.place.cleanupslide;
295    tmp_slide_mode = Conf.place.slidemode;
296    tmp_map_slide_speed = Conf.place.slidespeedmap;
297    tmp_cleanup_slide_speed = Conf.place.slidespeedcleanup;
298
299    tmp_animate_shading = Conf.shading.animate;
300    tmp_shade_speed = Conf.shading.speed;
301
302    tmp_place_ignore_struts = Conf.place.ignore_struts;
303    tmp_raise_fullscreen = Conf.place.raise_fullscreen;
304
305 #ifdef USE_XINERAMA_no          /* Not implemented */
306    tmp_extra_head = Conf.place.extra_head;
307 #endif
308
309    DialogItemTableSetOptions(table, 2, 0, 1, 0);
310
311    di = DialogAddItem(table, DITEM_CHECKBUTTON);
312    DialogItemSetColSpan(di, 2);
313    DialogItemSetText(di, _("Dialog windows appear together with their owner"));
314    DialogItemCheckButtonSetPtr(di, &tmp_with_leader);
315
316    di = DialogAddItem(table, DITEM_CHECKBUTTON);
317    DialogItemSetColSpan(di, 2);
318    DialogItemSetText(di, _("Switch to desktop where dialog appears"));
319    DialogItemCheckButtonSetPtr(di, &tmp_switch_popup);
320
321    di = DialogAddItem(table, DITEM_SEPARATOR);
322    DialogItemSetColSpan(di, 2);
323
324    di = DialogAddItem(table, DITEM_CHECKBUTTON);
325    DialogItemSetColSpan(di, 2);
326    DialogItemSetText(di, _("Place windows manually"));
327    DialogItemCheckButtonSetPtr(di, &tmp_manual_placement);
328
329    di = DialogAddItem(table, DITEM_CHECKBUTTON);
330    DialogItemSetColSpan(di, 2);
331    DialogItemSetText(di, _("Place windows under mouse"));
332    DialogItemCheckButtonSetPtr(di, &tmp_manual_placement_mouse_pointer);
333
334    di = DialogAddItem(table, DITEM_CHECKBUTTON);
335    DialogItemSetColSpan(di, 2);
336    DialogItemSetText(di, _("Center windows when desk is full"));
337    DialogItemCheckButtonSetPtr(di, &tmp_center_if_desk_full);
338
339    di = DialogAddItem(table, DITEM_CHECKBUTTON);
340    DialogItemSetColSpan(di, 2);
341    DialogItemSetText(di, _("Slide windows in when they appear"));
342    DialogItemCheckButtonSetPtr(di, &tmp_map_slide);
343
344    di = DialogAddItem(table, DITEM_CHECKBUTTON);
345    DialogItemSetColSpan(di, 2);
346    DialogItemSetText(di, _("Slide windows around when cleaning up"));
347    DialogItemCheckButtonSetPtr(di, &tmp_cleanup_slide);
348
349    di = DialogAddItem(table, DITEM_TEXT);
350    DialogItemSetColSpan(di, 2);
351    DialogItemSetText(di, _("Slide Method:"));
352
353    radio = di = DialogAddItem(table, DITEM_RADIOBUTTON);
354    DialogItemSetText(di, _("Opaque"));
355    DialogItemRadioButtonSetFirst(di, radio);
356    DialogItemRadioButtonGroupSetVal(di, 0);
357
358    di = DialogAddItem(table, DITEM_RADIOBUTTON);
359    DialogItemSetText(di, _("Technical"));
360    DialogItemRadioButtonSetFirst(di, radio);
361    DialogItemRadioButtonGroupSetVal(di, 1);
362
363    di = DialogAddItem(table, DITEM_RADIOBUTTON);
364    DialogItemSetText(di, _("Box"));
365    DialogItemRadioButtonSetFirst(di, radio);
366    DialogItemRadioButtonGroupSetVal(di, 2);
367
368    di = DialogAddItem(table, DITEM_RADIOBUTTON);
369    DialogItemSetText(di, _("Shaded"));
370    DialogItemRadioButtonSetFirst(di, radio);
371    DialogItemRadioButtonGroupSetVal(di, 3);
372
373    di = DialogAddItem(table, DITEM_RADIOBUTTON);
374    DialogItemSetText(di, _("Semi-Solid"));
375    DialogItemRadioButtonSetFirst(di, radio);
376    DialogItemRadioButtonGroupSetVal(di, 4);
377    DialogItemRadioButtonGroupSetValPtr(radio, &tmp_slide_mode);
378
379    di = DialogAddItem(table, DITEM_NONE);
380
381    di = DialogAddItem(table, DITEM_TEXT);
382    DialogItemSetFill(di, 0, 0);
383    DialogItemSetAlign(di, 1024, 512);
384    DialogItemSetText(di, _("Appear Slide speed:"));
385
386    di = DialogAddItem(table, DITEM_SLIDER);
387    DialogItemSliderSetBounds(di, 0, 20000);
388    DialogItemSliderSetUnits(di, 500);
389    DialogItemSliderSetJump(di, 1000);
390    DialogItemSliderSetValPtr(di, &tmp_map_slide_speed);
391
392    di = DialogAddItem(table, DITEM_TEXT);
393    DialogItemSetFill(di, 0, 0);
394    DialogItemSetAlign(di, 1024, 512);
395    DialogItemSetText(di, _("Cleanup Slide speed:"));
396
397    di = DialogAddItem(table, DITEM_SLIDER);
398    DialogItemSliderSetBounds(di, 0, 20000);
399    DialogItemSliderSetUnits(di, 500);
400    DialogItemSliderSetJump(di, 1000);
401    DialogItemSliderSetValPtr(di, &tmp_cleanup_slide_speed);
402
403    di = DialogAddItem(table, DITEM_SEPARATOR);
404    DialogItemSetColSpan(di, 2);
405
406    di = DialogAddItem(table, DITEM_CHECKBUTTON);
407    DialogItemSetColSpan(di, 2);
408    DialogItemSetText(di, _("Animate shading and unshading of windows"));
409    DialogItemCheckButtonSetPtr(di, &tmp_animate_shading);
410
411    di = DialogAddItem(table, DITEM_TEXT);
412    DialogItemSetFill(di, 0, 0);
413    DialogItemSetAlign(di, 1024, 512);
414    DialogItemSetText(di, _("Window Shading speed:"));
415
416    di = DialogAddItem(table, DITEM_SLIDER);
417    DialogItemSliderSetBounds(di, 0, 20000);
418    DialogItemSliderSetUnits(di, 500);
419    DialogItemSliderSetJump(di, 1000);
420    DialogItemSliderSetValPtr(di, &tmp_shade_speed);
421
422    di = DialogAddItem(table, DITEM_SEPARATOR);
423    DialogItemSetColSpan(di, 2);
424
425    di = DialogAddItem(table, DITEM_CHECKBUTTON);
426    DialogItemSetColSpan(di, 2);
427    DialogItemSetText(di, _("Ignore struts"));
428    DialogItemCheckButtonSetPtr(di, &tmp_place_ignore_struts);
429
430    di = DialogAddItem(table, DITEM_CHECKBUTTON);
431    DialogItemSetColSpan(di, 2);
432    DialogItemSetText(di, _("Raise fullscreen windows"));
433    DialogItemCheckButtonSetPtr(di, &tmp_raise_fullscreen);
434
435 #ifdef USE_XINERAMA_no          /* Not implemented */
436    if (Mode.display.xinerama_active)
437      {
438         di = DialogAddItem(table, DITEM_CHECKBUTTON);
439         DialogItemSetColSpan(di, 2);
440         DialogItemSetText(di, _("Place windows on another head when full"));
441         DialogItemCheckButtonSetPtr(di, &tmp_extra_head);
442      }
443 #endif
444 }
445
446 const DialogDef     DlgPlacement = {
447    "CONFIGURE_PLACEMENT",
448    N_("Placement"),
449    N_("Window Placement Settings"),
450    SOUND_SETTINGS_PLACEMENT,
451    "pix/place.png",
452    N_("Enlightenment Window Placement\n" "Settings Dialog\n"),
453    _DlgFillPlacement,
454    DLG_OAC, CB_ConfigurePlacement,
455 };
456
457 static char         tmp_autoraise;
458 static int          tmp_autoraisetime;
459
460 static void
461 CB_ConfigureAutoraise(Dialog * d __UNUSED__, int val, void *data __UNUSED__)
462 {
463    if (val < 2)
464      {
465         Conf.autoraise.enable = tmp_autoraise;
466         Conf.autoraise.delay = 10 * tmp_autoraisetime;
467      }
468    autosave();
469 }
470
471 static void
472 _DlgFillAutoraise(Dialog * d __UNUSED__, DItem * table, void *data __UNUSED__)
473 {
474    DItem              *di;
475
476    tmp_autoraise = Conf.autoraise.enable;
477    tmp_autoraisetime = Conf.autoraise.delay / 10;
478
479    DialogItemTableSetOptions(table, 2, 0, 0, 0);
480
481    di = DialogAddItem(table, DITEM_CHECKBUTTON);
482    DialogItemSetColSpan(di, 2);
483    DialogItemSetText(di, _("Raise Windows Automatically"));
484    DialogItemCheckButtonSetPtr(di, &tmp_autoraise);
485
486    di = DialogAddItem(table, DITEM_TEXT);
487    DialogItemSetFill(di, 0, 0);
488    DialogItemSetAlign(di, 0, 512);
489    DialogItemSetText(di, _("Autoraise delay:"));
490
491    di = DialogAddItem(table, DITEM_SLIDER);
492    DialogItemSliderSetBounds(di, 0, 300);
493    DialogItemSliderSetUnits(di, 10);
494    DialogItemSliderSetJump(di, 25);
495    DialogItemSliderSetValPtr(di, &tmp_autoraisetime);
496 }
497
498 const DialogDef     DlgAutoraise = {
499    "CONFIGURE_AUTORAISE",
500    N_("Autoraise"),
501    N_("Autoraise Settings"),
502    SOUND_SETTINGS_AUTORAISE,
503    "pix/raise.png",
504    N_("Enlightenment Automatic Raising\n" "of Windows Settings Dialog\n"),
505    _DlgFillAutoraise,
506    DLG_OAC, CB_ConfigureAutoraise,
507 };
508
509 static char         tmp_dialog_headers;
510 static char         tmp_button_image;
511 static char         tmp_animate_startup;
512 static char         tmp_saveunders;
513
514 static void
515 CB_ConfigureMiscellaneous(Dialog * d __UNUSED__, int val, void *data __UNUSED__)
516 {
517    if (val < 2)
518      {
519         Conf.dialogs.headers = tmp_dialog_headers;
520         Conf.dialogs.button_image = tmp_button_image;
521         Conf.startup.animate = tmp_animate_startup;
522         Conf.save_under = tmp_saveunders;
523      }
524    autosave();
525 }
526
527 static void
528 _DlgFillMisc(Dialog * d __UNUSED__, DItem * table, void *data __UNUSED__)
529 {
530    DItem              *di;
531
532    tmp_dialog_headers = Conf.dialogs.headers;
533    tmp_button_image = Conf.dialogs.button_image;
534    tmp_animate_startup = Conf.startup.animate;
535    tmp_saveunders = Conf.save_under;
536
537    DialogItemTableSetOptions(table, 2, 0, 0, 0);
538
539    di = DialogAddItem(table, DITEM_CHECKBUTTON);
540    DialogItemSetColSpan(di, 2);
541    DialogItemSetText(di, _("Enable Dialog Headers"));
542    DialogItemCheckButtonSetPtr(di, &tmp_dialog_headers);
543
544 #if 0                           /* Not functional */
545    di = DialogAddItem(table, DITEM_CHECKBUTTON);
546    DialogItemSetColSpan(di, 2);
547    DialogItemSetText(di, _("Enable Button Images"));
548    DialogItemCheckButtonSetPtr(di, &tmp_button_image);
549 #endif
550
551    di = DialogAddItem(table, DITEM_SEPARATOR);
552    DialogItemSetColSpan(di, 2);
553
554    di = DialogAddItem(table, DITEM_CHECKBUTTON);
555    DialogItemSetColSpan(di, 2);
556    DialogItemSetText(di, _("Enable sliding startup windows"));
557    DialogItemCheckButtonSetPtr(di, &tmp_animate_startup);
558
559    di = DialogAddItem(table, DITEM_SEPARATOR);
560    DialogItemSetColSpan(di, 2);
561
562    di = DialogAddItem(table, DITEM_CHECKBUTTON);
563    DialogItemSetColSpan(di, 2);
564    DialogItemSetText(di, _("Use saveunders to reduce window exposures"));
565    DialogItemCheckButtonSetPtr(di, &tmp_saveunders);
566 }
567
568 const DialogDef     DlgMisc = {
569    "CONFIGURE_MISCELLANEOUS",
570    N_("Miscellaneous"),
571    N_("Miscellaneous Settings"),
572    SOUND_SETTINGS_MISCELLANEOUS,
573    "pix/miscellaneous.png",
574    N_("Enlightenment Miscellaneous\n" "Settings Dialog\n"),
575    _DlgFillMisc,
576    DLG_OAC, CB_ConfigureMiscellaneous,
577 };
578
579 #if USE_COMPOSITE
580 #include "ecompmgr.h"
581
582 /*
583  * Composite dialog
584  */
585
586 static void
587 CB_ConfigureComposite(Dialog * d, int val, void *data __UNUSED__)
588 {
589    cfg_composite      *cfg;
590
591    if (val >= 2)
592       return;
593
594    /* Configure and read back */
595    cfg = (cfg_composite *) DialogGetData(d);
596    ECompMgrConfigSet(cfg);
597    ECompMgrConfigGet(cfg);
598 }
599
600 static void
601 _DlgFillComposite(Dialog * d __UNUSED__, DItem * table, void *data __UNUSED__)
602 {
603    static cfg_composite Cfg_composite;
604    DItem              *di, *radio;
605
606    /* Get current settings */
607    ECompMgrConfigGet(&Cfg_composite);
608    DialogSetData(d, &Cfg_composite);
609
610    /* Layout */
611    DialogItemTableSetOptions(table, 2, 0, 0, 0);
612
613    di = DialogAddItem(table, DITEM_CHECKBUTTON);
614    DialogItemSetColSpan(di, 2);
615    DialogItemSetText(di, _("Enable Composite"));
616    DialogItemCheckButtonSetPtr(di, &Cfg_composite.enable);
617
618    di = DialogAddItem(table, DITEM_SEPARATOR);
619    DialogItemSetColSpan(di, 2);
620
621    di = DialogAddItem(table, DITEM_CHECKBUTTON);
622    DialogItemSetColSpan(di, 2);
623    DialogItemSetText(di, _("Enable Fading"));
624    DialogItemCheckButtonSetPtr(di, &Cfg_composite.fading);
625
626    di = DialogAddItem(table, DITEM_TEXT);
627    DialogItemSetFill(di, 0, 0);
628    DialogItemSetAlign(di, 0, 512);
629    DialogItemSetText(di, _("Fading Speed:"));
630
631    di = DialogAddItem(table, DITEM_SLIDER);
632    DialogItemSliderSetBounds(di, 0, 100);
633    DialogItemSliderSetUnits(di, 5);
634    DialogItemSliderSetJump(di, 5);
635    DialogItemSliderSetValPtr(di, &Cfg_composite.fade_speed);
636
637    di = DialogAddItem(table, DITEM_SEPARATOR);
638    DialogItemSetColSpan(di, 2);
639
640    radio = di = DialogAddItem(table, DITEM_RADIOBUTTON);
641    DialogItemSetColSpan(di, 2);
642    DialogItemSetText(di, _("Shadows Off"));
643    DialogItemRadioButtonSetFirst(di, radio);
644    DialogItemRadioButtonGroupSetVal(di, 0);
645
646    di = DialogAddItem(table, DITEM_RADIOBUTTON);
647    DialogItemSetColSpan(di, 2);
648    DialogItemSetText(di, _("Shadows Sharp"));
649    DialogItemRadioButtonSetFirst(di, radio);
650    DialogItemRadioButtonGroupSetVal(di, 1);
651
652    di = DialogAddItem(table, DITEM_RADIOBUTTON);
653    DialogItemSetColSpan(di, 2);
654    DialogItemSetText(di, _("Shadows Sharp2"));
655    DialogItemRadioButtonSetFirst(di, radio);
656    DialogItemRadioButtonGroupSetVal(di, 3);
657
658    di = DialogAddItem(table, DITEM_RADIOBUTTON);
659    DialogItemSetColSpan(di, 2);
660    DialogItemSetText(di, _("Shadows Blurred"));
661    DialogItemRadioButtonSetFirst(di, radio);
662    DialogItemRadioButtonGroupSetVal(di, 2);
663    DialogItemRadioButtonGroupSetValPtr(radio, &Cfg_composite.shadow);
664
665    di = DialogAddItem(table, DITEM_SEPARATOR);
666    DialogItemSetColSpan(di, 2);
667
668    di = DialogAddItem(table, DITEM_TEXT);
669    DialogItemSetFill(di, 0, 0);
670    DialogItemSetAlign(di, 0, 512);
671    DialogItemSetText(di, _("Default focused window opacity:"));
672
673    di = DialogAddItem(table, DITEM_SLIDER);
674    DialogItemSliderSetBounds(di, 0, 100);
675    DialogItemSliderSetUnits(di, 5);
676    DialogItemSliderSetJump(di, 5);
677    DialogItemSliderSetValPtr(di, &Cfg_composite.opacity_focused);
678
679    di = DialogAddItem(table, DITEM_TEXT);
680    DialogItemSetFill(di, 0, 0);
681    DialogItemSetAlign(di, 0, 512);
682    DialogItemSetText(di, _("Default unfocused window opacity:"));
683
684    di = DialogAddItem(table, DITEM_SLIDER);
685    DialogItemSliderSetBounds(di, 0, 100);
686    DialogItemSliderSetUnits(di, 5);
687    DialogItemSliderSetJump(di, 5);
688    DialogItemSliderSetValPtr(di, &Cfg_composite.opacity_unfocused);
689
690    di = DialogAddItem(table, DITEM_TEXT);
691    DialogItemSetFill(di, 0, 0);
692    DialogItemSetAlign(di, 0, 512);
693    DialogItemSetText(di, _("Default pop-up window opacity:"));
694
695    di = DialogAddItem(table, DITEM_SLIDER);
696    DialogItemSliderSetBounds(di, 0, 100);
697    DialogItemSliderSetUnits(di, 5);
698    DialogItemSliderSetJump(di, 5);
699    DialogItemSliderSetValPtr(di, &Cfg_composite.opacity_override);
700 }
701
702 const DialogDef     DlgComposite = {
703    "CONFIGURE_COMPOSITE",
704    N_("Composite"),
705    N_("Composite Settings"),
706    SOUND_SETTINGS_COMPOSITE,
707    "pix/pager.png",
708    N_("Enlightenment Composite\n" "Settings Dialog\n"),
709    _DlgFillComposite,
710    DLG_OAC, CB_ConfigureComposite,
711 };
712 #endif
713
714 /*
715  * Combined configuration dialog
716  */
717
718 static const DialogDef *dialogs[] = {
719    &DlgFocus,
720    &DlgMoveResize,
721    &DlgPlacement,
722    &DlgDesks,
723    &DlgAreas,
724    &DlgPagers,
725    &DlgMenus,
726    &DlgAutoraise,
727    &DlgTooltips,
728 #if HAVE_SOUND
729    &DlgSound,
730 #endif
731    &DlgGroupDefaults,
732    &DlgRemember,
733    &DlgFx,
734    &DlgBackground,
735    &DlgTheme,
736 #ifdef ENABLE_THEME_TRANSPARENCY
737    &DlgThemeTrans,
738 #endif
739 #if USE_COMPOSITE
740    &DlgComposite,
741 #endif
742    &DlgSession,
743    &DlgMisc,
744 };
745 #define N_CFG_DLGS (sizeof(dialogs)/sizeof(DialogDef*))
746
747 static void
748 CB_DlgSelect(Dialog * d, int val, void *data)
749 {
750    const DialogDef    *dd = dialogs[val];
751    DItem              *table = (DItem *) data;
752
753    if (!table)
754       return;
755    if (!dd->fill)
756       return;
757
758    DialogCallExitFunction(d);
759
760    DialogItemTableEmpty(table);
761    DialogKeybindingsDestroy(d);
762
763    DialogSetTitle(d, _(dd->title));
764    DialogFill(d, table, dd, NULL);
765
766    DialogArrange(d, 1);
767 }
768
769 static void
770 _DlgFillConfiguration(Dialog * d, DItem * table, void *data __UNUSED__)
771 {
772    DItem              *di, *buttons, *content;
773    unsigned int        i;
774
775    DialogItemTableSetOptions(table, 2, 0, 0, 0);
776
777    buttons = DialogAddItem(table, DITEM_TABLE);
778    content = DialogAddItem(table, DITEM_TABLE);
779
780    for (i = 0; i < N_CFG_DLGS; i++)
781      {
782         di = DialogAddItem(buttons, DITEM_BUTTON);
783         DialogItemSetPadding(di, 2, 2, 0, 0);
784         DialogItemSetText(di, _(dialogs[i]->label));
785         DialogItemSetCallback(di, CB_DlgSelect, i, content);
786      }
787
788    DialogFill(d, content, dialogs[0], NULL);
789 }
790
791 static const DialogDef DlgConfiguration = {
792    "CONFIGURE_ALL",
793    NULL,
794    N_("Enlightenment Settings"),
795    SOUND_SETTINGS_ALL,
796    NULL,
797    NULL,
798    _DlgFillConfiguration,
799    0, NULL,
800 };
801
802 void
803 IPC_Cfg(const char *params)
804 {
805    unsigned int        i;
806    const char         *name;
807
808    if (!params || !params[0])
809      {
810         DialogShowSimple(&DlgConfiguration, NULL);
811         return;
812      }
813
814    for (i = 0; i < N_CFG_DLGS; i++)
815      {
816         name = dialogs[i]->label;
817         if (strcasecmp(params, name))
818            continue;
819         DialogShowSimple(dialogs[i], NULL);
820      }
821 }
822 #endif /* ENABLE_DIALOGS */