1 /*
2  * Copyright (C) 2000-2007 Carsten Haitzler, Geoff Harrison and various contributors
3  * Copyright (C) 2004-2021 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 "config.h"
25 
26 #if ENABLE_DIALOGS
27 #include "E.h"
28 #include "dialog.h"
29 #include "settings.h"
30 
31 typedef struct {
32    int                 move;
33    int                 resize;
34    int                 geominfo;
35    int                 maximize;
36    int                 maximize_speed;
37    char                maximize_animate;
38    char                dragbar_nocover;
39    char                enable_smart_max_hv;
40    char                avoid_server_grab;
41    char                update_while_moving;
42    char                sync_request;
43 } MovResDlgData;
44 
45 static void
_DlgApplyMoveResize(Dialog * d,int val __UNUSED__,void * data __UNUSED__)46 _DlgApplyMoveResize(Dialog * d, int val __UNUSED__, void *data __UNUSED__)
47 {
48    MovResDlgData      *dd = DLG_DATA_GET(d, MovResDlgData);
49 
50    Conf.movres.mode_move = dd->move;
51    Conf.movres.mode_resize = dd->resize;
52    Conf.movres.mode_info = dd->geominfo;
53    Conf.movres.mode_maximize_default = dd->maximize;
54    Conf.movres.avoid_server_grab = dd->avoid_server_grab;
55    Conf.movres.update_while_moving = dd->update_while_moving;
56    Conf.movres.enable_sync_request = dd->sync_request;
57    Conf.movres.dragbar_nocover = dd->dragbar_nocover;
58    Conf.movres.enable_smart_max_hv = dd->enable_smart_max_hv;
59    Conf.movres.maximize_speed = dd->maximize_speed;
60    Conf.movres.maximize_animate = dd->maximize_animate;
61 
62    autosave();
63 }
64 
65 static void
_DlgFillMoveResize(Dialog * d,DItem * table,void * data __UNUSED__)66 _DlgFillMoveResize(Dialog * d, DItem * table, void *data __UNUSED__)
67 {
68    MovResDlgData      *dd = DLG_DATA_GET(d, MovResDlgData);
69    DItem              *di, *radio1, *radio2, *radio3, *radio4;
70 
71    dd->move = Conf.movres.mode_move;
72    dd->resize = Conf.movres.mode_resize;
73    dd->geominfo = Conf.movres.mode_info;
74    dd->maximize = Conf.movres.mode_maximize_default;
75    dd->avoid_server_grab = Conf.movres.avoid_server_grab;
76    dd->update_while_moving = Conf.movres.update_while_moving;
77    dd->sync_request = Conf.movres.enable_sync_request;
78    dd->dragbar_nocover = Conf.movres.dragbar_nocover;
79    dd->enable_smart_max_hv = Conf.movres.enable_smart_max_hv;
80    dd->maximize_speed = Conf.movres.maximize_speed;
81    dd->maximize_animate = Conf.movres.maximize_animate;
82 
83    DialogItemTableSetOptions(table, 2, 0, 0, 0);
84 
85    di = DialogAddItem(table, DITEM_TEXT);
86    DialogItemSetFill(di, 0, 0);
87    DialogItemSetAlign(di, 0, 512);
88    DialogItemSetText(di, _("Move Methods:"));
89 
90    di = DialogAddItem(table, DITEM_TEXT);
91    DialogItemSetFill(di, 0, 0);
92    DialogItemSetAlign(di, 0, 512);
93    DialogItemSetText(di, _("Resize Methods:"));
94 
95    radio1 = di = DialogAddItem(table, DITEM_RADIOBUTTON);
96    DialogItemSetText(di, _("Opaque"));
97    DialogItemRadioButtonSetFirst(di, radio1);
98    DialogItemRadioButtonGroupSetVal(di, MR_OPAQUE);
99 
100    radio2 = di = DialogAddItem(table, DITEM_RADIOBUTTON);
101    DialogItemSetText(di, _("Opaque"));
102    DialogItemRadioButtonSetFirst(di, radio2);
103    DialogItemRadioButtonGroupSetVal(di, MR_OPAQUE);
104 
105    di = DialogAddItem(table, DITEM_RADIOBUTTON);
106    DialogItemSetText(di, _("Technical"));
107    DialogItemRadioButtonSetFirst(di, radio1);
108    DialogItemRadioButtonGroupSetVal(di, MR_TECHNICAL);
109 
110    di = DialogAddItem(table, DITEM_RADIOBUTTON);
111    DialogItemSetText(di, _("Technical"));
112    DialogItemRadioButtonSetFirst(di, radio2);
113    DialogItemRadioButtonGroupSetVal(di, MR_TECHNICAL);
114 
115    di = DialogAddItem(table, DITEM_RADIOBUTTON);
116    DialogItemSetText(di, _("TechOpaque"));
117    DialogItemRadioButtonSetFirst(di, radio1);
118    DialogItemRadioButtonGroupSetVal(di, MR_TECH_OPAQUE);
119 
120    di = DialogAddItem(table, DITEM_RADIOBUTTON);
121    DialogItemSetText(di, _("TechOpaque"));
122    DialogItemRadioButtonSetFirst(di, radio2);
123    DialogItemRadioButtonGroupSetVal(di, MR_TECH_OPAQUE);
124 
125    di = DialogAddItem(table, DITEM_RADIOBUTTON);
126    DialogItemSetText(di, _("Box"));
127    DialogItemRadioButtonSetFirst(di, radio1);
128    DialogItemRadioButtonGroupSetVal(di, MR_BOX);
129 
130    di = DialogAddItem(table, DITEM_RADIOBUTTON);
131    DialogItemSetText(di, _("Box"));
132    DialogItemRadioButtonSetFirst(di, radio2);
133    DialogItemRadioButtonGroupSetVal(di, MR_BOX);
134 
135    DialogItemRadioButtonGroupSetValPtr(radio1, &dd->move);
136    DialogItemRadioButtonGroupSetValPtr(radio2, &dd->resize);
137 
138    di = DialogAddItem(table, DITEM_CHECKBUTTON);
139    DialogItemSetColSpan(di, 2);
140    DialogItemSetText(di, _("Avoid server grab"));
141    DialogItemCheckButtonSetPtr(di, &dd->avoid_server_grab);
142 
143    di = DialogAddItem(table, DITEM_SEPARATOR);
144    DialogItemSetColSpan(di, 2);
145 
146    di = DialogAddItem(table, DITEM_TEXT);
147    DialogItemSetColSpan(di, 2);
148    DialogItemSetFill(di, 0, 0);
149    DialogItemSetAlign(di, 0, 512);
150    DialogItemSetText(di, _("Move/Resize Geometry Info Postion:"));
151 
152    radio3 = di = DialogAddItem(table, DITEM_RADIOBUTTON);
153    DialogItemSetColSpan(di, 2);
154    DialogItemSetText(di, _("Window Center (O/T/B Methods)"));
155    DialogItemRadioButtonSetFirst(di, radio3);
156    DialogItemRadioButtonGroupSetVal(di, 1);
157 
158    di = DialogAddItem(table, DITEM_RADIOBUTTON);
159    DialogItemSetColSpan(di, 2);
160    DialogItemSetText(di, _("Always Screen corner"));
161    DialogItemRadioButtonSetFirst(di, radio3);
162    DialogItemRadioButtonGroupSetVal(di, 2);
163 
164    di = DialogAddItem(table, DITEM_RADIOBUTTON);
165    DialogItemSetColSpan(di, 2);
166    DialogItemSetText(di, _("Don't show"));
167    DialogItemRadioButtonSetFirst(di, radio3);
168    DialogItemRadioButtonGroupSetVal(di, 0);
169    DialogItemRadioButtonGroupSetValPtr(radio3, &dd->geominfo);
170 
171    di = DialogAddItem(table, DITEM_SEPARATOR);
172    DialogItemSetColSpan(di, 2);
173 
174    di = DialogAddItem(table, DITEM_TEXT);
175    DialogItemSetColSpan(di, 2);
176    DialogItemSetFill(di, 0, 0);
177    DialogItemSetAlign(di, 0, 512);
178    DialogItemSetText(di, _("Default Resize Policy:"));
179 
180    radio4 = di = DialogAddItem(table, DITEM_RADIOBUTTON);
181    DialogItemSetColSpan(di, 2);
182    DialogItemSetText(di, _("Conservative"));
183    DialogItemRadioButtonSetFirst(di, radio4);
184    DialogItemRadioButtonGroupSetVal(di, 2);
185 
186    di = DialogAddItem(table, DITEM_RADIOBUTTON);
187    DialogItemSetColSpan(di, 2);
188    DialogItemSetText(di, _("Available"));
189    DialogItemRadioButtonSetFirst(di, radio4);
190    DialogItemRadioButtonGroupSetVal(di, 1);
191 
192    di = DialogAddItem(table, DITEM_RADIOBUTTON);
193    DialogItemSetColSpan(di, 2);
194    DialogItemSetText(di, _("Absolute"));
195    DialogItemRadioButtonSetFirst(di, radio4);
196    DialogItemRadioButtonGroupSetVal(di, 0);
197    DialogItemRadioButtonGroupSetValPtr(radio4, &dd->maximize);
198 
199    di = DialogAddItem(table, DITEM_SEPARATOR);
200    DialogItemSetColSpan(di, 2);
201 
202    di = DialogAddItem(table, DITEM_CHECKBUTTON);
203    DialogItemSetColSpan(di, 2);
204    DialogItemSetText(di, _("Update window while moving"));
205    DialogItemCheckButtonSetPtr(di, &dd->update_while_moving);
206 
207    di = DialogAddItem(table, DITEM_CHECKBUTTON);
208    DialogItemSetColSpan(di, 2);
209    DialogItemSetText(di, _("Synchronize move/resize with application"));
210    DialogItemCheckButtonSetPtr(di, &dd->sync_request);
211 
212    di = DialogAddItem(table, DITEM_CHECKBUTTON);
213    DialogItemSetColSpan(di, 2);
214    DialogItemSetText(di, _("Do not cover dragbar"));
215    DialogItemCheckButtonSetPtr(di, &dd->dragbar_nocover);
216 
217    di = DialogAddItem(table, DITEM_CHECKBUTTON);
218    DialogItemSetColSpan(di, 2);
219    DialogItemSetText(di, _("Enable smart maximization"));
220    DialogItemCheckButtonSetPtr(di, &dd->enable_smart_max_hv);
221 
222    di = DialogAddItem(table, DITEM_CHECKBUTTON);
223    DialogItemSetColSpan(di, 2);
224    DialogItemSetText(di, _("Animate window maximization"));
225    DialogItemCheckButtonSetPtr(di, &dd->maximize_animate);
226 
227    di = DialogAddItem(table, DITEM_TEXT);
228    DialogItemSetFill(di, 0, 0);
229    DialogItemSetAlign(di, 1024, 512);
230    DialogItemSetText(di, _("Maximization animation speed:"));
231 
232    di = DialogAddItem(table, DITEM_SLIDER);
233    DialogItemSliderSetBounds(di, 0, 20000);
234    DialogItemSliderSetUnits(di, 500);
235    DialogItemSliderSetJump(di, 1000);
236    DialogItemSliderSetValPtr(di, &dd->maximize_speed);
237 }
238 
239 const DialogDef     DlgMoveResize = {
240    "CONFIGURE_MOVERESIZE",
241    N_("Move/Resize"), N_("Move & Resize Settings"),
242    sizeof(MovResDlgData),
243    SOUND_SETTINGS_MOVERESIZE,
244    "pix/moveres.png",
245    N_("Enlightenment Move & Resize\n" "Method Settings Dialog"),
246    _DlgFillMoveResize,
247    DLG_OAC, _DlgApplyMoveResize, NULL
248 };
249 
250 typedef struct {
251    char                with_leader;
252    char                switch_popup;
253    char                manual_placement;
254    char                manual_placement_mouse_pointer;
255    char                center_if_desk_full;
256    char                map_slide;
257    char                cleanup_slide;
258    int                 slide_mode;
259    int                 map_slide_speed;
260    int                 cleanup_slide_speed;
261    char                animate_shading;
262    int                 shade_speed;
263    char                place_ignore_struts;
264    char                place_ignore_struts_fullscreen;
265    char                place_ignore_struts_maximize;
266    char                raise_fullscreen;
267 #ifdef USE_XINERAMA_no		/* Not implemented */
268    char                extra_head;
269 #endif
270 } PlaceDlgData;
271 
272 static void
_DlgApplyPlacement(Dialog * d,int val __UNUSED__,void * data __UNUSED__)273 _DlgApplyPlacement(Dialog * d, int val __UNUSED__, void *data __UNUSED__)
274 {
275    PlaceDlgData       *dd = DLG_DATA_GET(d, PlaceDlgData);
276 
277    Conf.focus.transientsfollowleader = dd->with_leader;
278    Conf.focus.switchfortransientmap = dd->switch_popup;
279 
280    Conf.place.manual = dd->manual_placement;
281    Conf.place.manual_mouse_pointer = dd->manual_placement_mouse_pointer;
282    Conf.place.center_if_desk_full = dd->center_if_desk_full;
283 
284    Conf.place.slidein = dd->map_slide;
285    Conf.place.cleanupslide = dd->cleanup_slide;
286    Conf.place.slidemode = dd->slide_mode;
287    Conf.place.slidespeedmap = dd->map_slide_speed;
288    Conf.place.slidespeedcleanup = dd->cleanup_slide_speed;
289 
290    Conf.shading.animate = dd->animate_shading;
291    Conf.shading.speed = dd->shade_speed;
292 
293    Conf.place.ignore_struts = dd->place_ignore_struts;
294    Conf.place.ignore_struts_fullscreen = dd->place_ignore_struts_fullscreen;
295    Conf.place.ignore_struts_maximize = dd->place_ignore_struts_maximize;
296    Conf.place.raise_fullscreen = dd->raise_fullscreen;
297 
298    autosave();
299 }
300 
301 static void
_DlgFillPlacement(Dialog * d,DItem * table,void * data __UNUSED__)302 _DlgFillPlacement(Dialog * d, DItem * table, void *data __UNUSED__)
303 {
304    PlaceDlgData       *dd = DLG_DATA_GET(d, PlaceDlgData);
305    DItem              *di, *radio;
306 
307    dd->with_leader = Conf.focus.transientsfollowleader;
308    dd->switch_popup = Conf.focus.switchfortransientmap;
309 
310    dd->manual_placement = Conf.place.manual;
311    dd->manual_placement_mouse_pointer = Conf.place.manual_mouse_pointer;
312    dd->center_if_desk_full = Conf.place.center_if_desk_full;
313 
314    dd->map_slide = Conf.place.slidein;
315    dd->cleanup_slide = Conf.place.cleanupslide;
316    dd->slide_mode = Conf.place.slidemode;
317    dd->map_slide_speed = Conf.place.slidespeedmap;
318    dd->cleanup_slide_speed = Conf.place.slidespeedcleanup;
319 
320    dd->animate_shading = Conf.shading.animate;
321    dd->shade_speed = Conf.shading.speed;
322 
323    dd->place_ignore_struts = Conf.place.ignore_struts;
324    dd->place_ignore_struts_fullscreen = Conf.place.ignore_struts_fullscreen;
325    dd->place_ignore_struts_maximize = Conf.place.ignore_struts_maximize;
326    dd->raise_fullscreen = Conf.place.raise_fullscreen;
327 
328 #ifdef USE_XINERAMA_no		/* Not implemented */
329    dd->extra_head = Conf.place.extra_head;
330 #endif
331 
332    DialogItemTableSetOptions(table, 2, 0, 1, 0);
333 
334    di = DialogAddItem(table, DITEM_CHECKBUTTON);
335    DialogItemSetColSpan(di, 2);
336    DialogItemSetText(di, _("Dialog windows appear together with their owner"));
337    DialogItemCheckButtonSetPtr(di, &dd->with_leader);
338 
339    di = DialogAddItem(table, DITEM_CHECKBUTTON);
340    DialogItemSetColSpan(di, 2);
341    DialogItemSetText(di, _("Switch to desktop where dialog appears"));
342    DialogItemCheckButtonSetPtr(di, &dd->switch_popup);
343 
344    di = DialogAddItem(table, DITEM_SEPARATOR);
345    DialogItemSetColSpan(di, 2);
346 
347    di = DialogAddItem(table, DITEM_CHECKBUTTON);
348    DialogItemSetColSpan(di, 2);
349    DialogItemSetText(di, _("Place windows manually"));
350    DialogItemCheckButtonSetPtr(di, &dd->manual_placement);
351 
352    di = DialogAddItem(table, DITEM_CHECKBUTTON);
353    DialogItemSetColSpan(di, 2);
354    DialogItemSetText(di, _("Place windows under mouse"));
355    DialogItemCheckButtonSetPtr(di, &dd->manual_placement_mouse_pointer);
356 
357    di = DialogAddItem(table, DITEM_CHECKBUTTON);
358    DialogItemSetColSpan(di, 2);
359    DialogItemSetText(di, _("Center windows when desk is full"));
360    DialogItemCheckButtonSetPtr(di, &dd->center_if_desk_full);
361 
362    di = DialogAddItem(table, DITEM_CHECKBUTTON);
363    DialogItemSetColSpan(di, 2);
364    DialogItemSetText(di, _("Slide windows in when they appear"));
365    DialogItemCheckButtonSetPtr(di, &dd->map_slide);
366 
367    di = DialogAddItem(table, DITEM_CHECKBUTTON);
368    DialogItemSetColSpan(di, 2);
369    DialogItemSetText(di, _("Slide windows around when cleaning up"));
370    DialogItemCheckButtonSetPtr(di, &dd->cleanup_slide);
371 
372    di = DialogAddItem(table, DITEM_TEXT);
373    DialogItemSetColSpan(di, 2);
374    DialogItemSetText(di, _("Slide Method:"));
375 
376    radio = di = DialogAddItem(table, DITEM_RADIOBUTTON);
377    DialogItemSetText(di, _("Opaque"));
378    DialogItemRadioButtonSetFirst(di, radio);
379    DialogItemRadioButtonGroupSetVal(di, MR_OPAQUE);
380 
381    di = DialogAddItem(table, DITEM_RADIOBUTTON);
382    DialogItemSetText(di, _("Technical"));
383    DialogItemRadioButtonSetFirst(di, radio);
384    DialogItemRadioButtonGroupSetVal(di, MR_TECHNICAL);
385 
386    di = DialogAddItem(table, DITEM_RADIOBUTTON);
387    DialogItemSetText(di, _("TechOpaque"));
388    DialogItemRadioButtonSetFirst(di, radio);
389    DialogItemRadioButtonGroupSetVal(di, MR_TECH_OPAQUE);
390 
391    di = DialogAddItem(table, DITEM_RADIOBUTTON);
392    DialogItemSetText(di, _("Box"));
393    DialogItemRadioButtonSetFirst(di, radio);
394    DialogItemRadioButtonGroupSetVal(di, MR_BOX);
395 
396    DialogItemRadioButtonGroupSetValPtr(radio, &dd->slide_mode);
397 
398    di = DialogAddItem(table, DITEM_TEXT);
399    DialogItemSetFill(di, 0, 0);
400    DialogItemSetAlign(di, 1024, 512);
401    DialogItemSetText(di, _("Appear Slide speed:"));
402 
403    di = DialogAddItem(table, DITEM_SLIDER);
404    DialogItemSliderSetBounds(di, 0, 20000);
405    DialogItemSliderSetUnits(di, 500);
406    DialogItemSliderSetJump(di, 1000);
407    DialogItemSliderSetValPtr(di, &dd->map_slide_speed);
408 
409    di = DialogAddItem(table, DITEM_TEXT);
410    DialogItemSetFill(di, 0, 0);
411    DialogItemSetAlign(di, 1024, 512);
412    DialogItemSetText(di, _("Cleanup Slide speed:"));
413 
414    di = DialogAddItem(table, DITEM_SLIDER);
415    DialogItemSliderSetBounds(di, 0, 20000);
416    DialogItemSliderSetUnits(di, 500);
417    DialogItemSliderSetJump(di, 1000);
418    DialogItemSliderSetValPtr(di, &dd->cleanup_slide_speed);
419 
420    di = DialogAddItem(table, DITEM_SEPARATOR);
421    DialogItemSetColSpan(di, 2);
422 
423    di = DialogAddItem(table, DITEM_CHECKBUTTON);
424    DialogItemSetColSpan(di, 2);
425    DialogItemSetText(di, _("Animate shading and unshading of windows"));
426    DialogItemCheckButtonSetPtr(di, &dd->animate_shading);
427 
428    di = DialogAddItem(table, DITEM_TEXT);
429    DialogItemSetFill(di, 0, 0);
430    DialogItemSetAlign(di, 1024, 512);
431    DialogItemSetText(di, _("Window Shading speed:"));
432 
433    di = DialogAddItem(table, DITEM_SLIDER);
434    DialogItemSliderSetBounds(di, 0, 20000);
435    DialogItemSliderSetUnits(di, 500);
436    DialogItemSliderSetJump(di, 1000);
437    DialogItemSliderSetValPtr(di, &dd->shade_speed);
438 
439    di = DialogAddItem(table, DITEM_SEPARATOR);
440    DialogItemSetColSpan(di, 2);
441 
442    di = DialogAddItem(table, DITEM_CHECKBUTTON);
443    DialogItemSetColSpan(di, 2);
444    DialogItemSetText(di, _("Ignore struts/panels for placing normal windows"));
445    DialogItemCheckButtonSetPtr(di, &dd->place_ignore_struts);
446 
447    di = DialogAddItem(table, DITEM_CHECKBUTTON);
448    DialogItemSetColSpan(di, 2);
449    DialogItemSetText(di, _("Ignore struts/panels when windows are fullscreen"));
450    DialogItemCheckButtonSetPtr(di, &dd->place_ignore_struts_fullscreen);
451 
452    di = DialogAddItem(table, DITEM_CHECKBUTTON);
453    DialogItemSetColSpan(di, 2);
454    DialogItemSetText(di, _("Ignore struts/panels when maximizing windows"));
455    DialogItemCheckButtonSetPtr(di, &dd->place_ignore_struts_maximize);
456 
457    di = DialogAddItem(table, DITEM_CHECKBUTTON);
458    DialogItemSetColSpan(di, 2);
459    DialogItemSetText(di, _("Raise fullscreen windows"));
460    DialogItemCheckButtonSetPtr(di, &dd->raise_fullscreen);
461 }
462 
463 const DialogDef     DlgPlacement = {
464    "CONFIGURE_PLACEMENT",
465    N_("Placement"), N_("Window Placement Settings"),
466    sizeof(PlaceDlgData),
467    SOUND_SETTINGS_PLACEMENT,
468    "pix/place.png",
469    N_("Enlightenment Window Placement\n" "Settings Dialog"),
470    _DlgFillPlacement,
471    DLG_OAC, _DlgApplyPlacement, NULL
472 };
473 
474 typedef struct {
475    char                dialog_headers;
476    char                button_image;
477    char                animate_startup;
478    int                 magwin_zoom_res;
479 } MiscDlgData;
480 
481 static void
_DlgApplyMisc(Dialog * d,int val __UNUSED__,void * data __UNUSED__)482 _DlgApplyMisc(Dialog * d, int val __UNUSED__, void *data __UNUSED__)
483 {
484    MiscDlgData        *dd = DLG_DATA_GET(d, MiscDlgData);
485 
486    Conf.dialogs.headers = dd->dialog_headers;
487    Conf.dialogs.button_image = dd->button_image;
488    Conf.startup.animate = dd->animate_startup;
489    Conf.magwin.zoom_res = dd->magwin_zoom_res;
490 
491    autosave();
492 }
493 
494 static void
_DlgFillMisc(Dialog * d,DItem * table,void * data __UNUSED__)495 _DlgFillMisc(Dialog * d, DItem * table, void *data __UNUSED__)
496 {
497    MiscDlgData        *dd = DLG_DATA_GET(d, MiscDlgData);
498    DItem              *di;
499 
500    dd->dialog_headers = Conf.dialogs.headers;
501    dd->button_image = Conf.dialogs.button_image;
502    dd->animate_startup = Conf.startup.animate;
503    dd->magwin_zoom_res = Conf.magwin.zoom_res;
504 
505    DialogItemTableSetOptions(table, 2, 0, 0, 0);
506 
507    di = DialogAddItem(table, DITEM_CHECKBUTTON);
508    DialogItemSetColSpan(di, 2);
509    DialogItemSetText(di, _("Enable Dialog Headers"));
510    DialogItemCheckButtonSetPtr(di, &dd->dialog_headers);
511 
512 #if 0				/* Not functional */
513    di = DialogAddItem(table, DITEM_CHECKBUTTON);
514    DialogItemSetColSpan(di, 2);
515    DialogItemSetText(di, _("Enable Button Images"));
516    DialogItemCheckButtonSetPtr(di, &dd->button_image);
517 #endif
518 
519    di = DialogAddItem(table, DITEM_SEPARATOR);
520    DialogItemSetColSpan(di, 2);
521 
522    di = DialogAddItem(table, DITEM_CHECKBUTTON);
523    DialogItemSetColSpan(di, 2);
524    DialogItemSetText(di, _("Enable sliding startup windows"));
525    DialogItemCheckButtonSetPtr(di, &dd->animate_startup);
526 
527    di = DialogAddItem(table, DITEM_SEPARATOR);
528    DialogItemSetColSpan(di, 2);
529 
530    di = DialogAddItem(table, DITEM_SEPARATOR);
531    DialogItemSetColSpan(di, 2);
532 
533    di = DialogAddItem(table, DITEM_TEXT);
534    DialogItemSetColSpan(di, 2);
535    DialogItemSetAlign(di, 1024, 512);
536    DialogItemSetText(di, _("Magwin zoom resolution"));
537 
538    di = DialogAddItem(table, DITEM_SLIDER);
539    DialogItemSetColSpan(di, 2);
540    DialogItemSliderSetBounds(di, 1, 32);
541    DialogItemSliderSetUnits(di, 1);
542    DialogItemSliderSetJump(di, 1);
543    DialogItemSliderSetValPtr(di, &dd->magwin_zoom_res);
544 }
545 
546 const DialogDef     DlgMisc = {
547    "CONFIGURE_MISCELLANEOUS",
548    N_("Miscellaneous"), N_("Miscellaneous Settings"),
549    sizeof(MiscDlgData),
550    SOUND_SETTINGS_MISCELLANEOUS,
551    "pix/miscellaneous.png",
552    N_("Enlightenment Miscellaneous\n" "Settings Dialog"),
553    _DlgFillMisc,
554    DLG_OAC, _DlgApplyMisc, NULL
555 };
556 
557 #if USE_COMPOSITE
558 #include "ecompmgr.h"
559 
560 /*
561  * Composite dialog
562  */
563 
564 static void
_DlgApplyComposite(Dialog * d,int val __UNUSED__,void * data __UNUSED__)565 _DlgApplyComposite(Dialog * d, int val __UNUSED__, void *data __UNUSED__)
566 {
567    cfg_composite      *dd = DLG_DATA_GET(d, cfg_composite);
568 
569    /* Configure and read back */
570    ECompMgrConfigSet(dd);
571    ECompMgrConfigGet(dd);
572 }
573 
574 static void
_DlgFillComposite(Dialog * d,DItem * table,void * data __UNUSED__)575 _DlgFillComposite(Dialog * d, DItem * table, void *data __UNUSED__)
576 {
577    cfg_composite      *dd = DLG_DATA_GET(d, cfg_composite);
578    DItem              *di, *radio;
579 
580    /* Get current settings */
581    ECompMgrConfigGet(dd);
582 
583    /* Layout */
584    DialogItemTableSetOptions(table, 2, 0, 0, 0);
585 
586    di = DialogAddItem(table, DITEM_CHECKBUTTON);
587    DialogItemSetColSpan(di, 2);
588    DialogItemSetText(di, _("Enable Composite"));
589    DialogItemCheckButtonSetPtr(di, &dd->enable);
590 
591    di = DialogAddItem(table, DITEM_SEPARATOR);
592    DialogItemSetColSpan(di, 2);
593 
594    di = DialogAddItem(table, DITEM_CHECKBUTTON);
595    DialogItemSetColSpan(di, 2);
596    DialogItemSetText(di, _("Enable Fading"));
597    DialogItemCheckButtonSetPtr(di, &dd->fading);
598 
599    di = DialogAddItem(table, DITEM_TEXT);
600    DialogItemSetFill(di, 0, 0);
601    DialogItemSetAlign(di, 0, 512);
602    DialogItemSetText(di, _("Fading Speed:"));
603 
604    di = DialogAddItem(table, DITEM_SLIDER);
605    DialogItemSliderSetBounds(di, 0, 100);
606    DialogItemSliderSetUnits(di, 5);
607    DialogItemSliderSetJump(di, 5);
608    DialogItemSliderSetValPtr(di, &dd->fade_speed);
609 
610    di = DialogAddItem(table, DITEM_SEPARATOR);
611    DialogItemSetColSpan(di, 2);
612 
613    radio = di = DialogAddItem(table, DITEM_RADIOBUTTON);
614    DialogItemSetColSpan(di, 2);
615    DialogItemSetText(di, _("Shadows Off"));
616    DialogItemRadioButtonSetFirst(di, radio);
617    DialogItemRadioButtonGroupSetVal(di, 0);
618 
619    di = DialogAddItem(table, DITEM_RADIOBUTTON);
620    DialogItemSetColSpan(di, 2);
621    DialogItemSetText(di, _("Shadows Sharp"));
622    DialogItemRadioButtonSetFirst(di, radio);
623    DialogItemRadioButtonGroupSetVal(di, 1);
624 
625    di = DialogAddItem(table, DITEM_RADIOBUTTON);
626    DialogItemSetColSpan(di, 2);
627    DialogItemSetText(di, _("Shadows Sharp2"));
628    DialogItemRadioButtonSetFirst(di, radio);
629    DialogItemRadioButtonGroupSetVal(di, 3);
630 
631    di = DialogAddItem(table, DITEM_RADIOBUTTON);
632    DialogItemSetColSpan(di, 2);
633    DialogItemSetText(di, _("Shadows Blurred"));
634    DialogItemRadioButtonSetFirst(di, radio);
635    DialogItemRadioButtonGroupSetVal(di, 2);
636    DialogItemRadioButtonGroupSetValPtr(radio, &dd->shadow);
637 
638    di = DialogAddItem(table, DITEM_SEPARATOR);
639    DialogItemSetColSpan(di, 2);
640 
641    di = DialogAddItem(table, DITEM_TEXT);
642    DialogItemSetFill(di, 0, 0);
643    DialogItemSetAlign(di, 0, 512);
644    DialogItemSetText(di, _("Default focused window opacity:"));
645 
646    di = DialogAddItem(table, DITEM_SLIDER);
647    DialogItemSliderSetBounds(di, 0, 100);
648    DialogItemSliderSetUnits(di, 5);
649    DialogItemSliderSetJump(di, 5);
650    DialogItemSliderSetValPtr(di, &dd->opacity_focused);
651 
652    di = DialogAddItem(table, DITEM_TEXT);
653    DialogItemSetFill(di, 0, 0);
654    DialogItemSetAlign(di, 0, 512);
655    DialogItemSetText(di, _("Default unfocused window opacity:"));
656 
657    di = DialogAddItem(table, DITEM_SLIDER);
658    DialogItemSliderSetBounds(di, 0, 100);
659    DialogItemSliderSetUnits(di, 5);
660    DialogItemSliderSetJump(di, 5);
661    DialogItemSliderSetValPtr(di, &dd->opacity_unfocused);
662 
663    di = DialogAddItem(table, DITEM_TEXT);
664    DialogItemSetFill(di, 0, 0);
665    DialogItemSetAlign(di, 0, 512);
666    DialogItemSetText(di, _("Default pop-up window opacity:"));
667 
668    di = DialogAddItem(table, DITEM_SLIDER);
669    DialogItemSliderSetBounds(di, 0, 100);
670    DialogItemSliderSetUnits(di, 5);
671    DialogItemSliderSetJump(di, 5);
672    DialogItemSliderSetValPtr(di, &dd->opacity_override);
673 }
674 
675 const DialogDef     DlgComposite = {
676    "CONFIGURE_COMPOSITE",
677    N_("Composite"), N_("Composite Settings"),
678    sizeof(cfg_composite),
679    SOUND_SETTINGS_COMPOSITE,
680    "pix/pager.png",
681    N_("Enlightenment Composite\n" "Settings Dialog"),
682    _DlgFillComposite,
683    DLG_OAC, _DlgApplyComposite, NULL
684 };
685 #endif
686 
687 /*
688  * Combined configuration dialog
689  */
690 
691 static const DialogDef *const dialogs[] = {
692    &DlgFocus,
693    &DlgMoveResize,
694    &DlgPlacement,
695    &DlgDesks,
696    &DlgAreas,
697    &DlgPagers,
698    &DlgMenus,
699    &DlgTooltips,
700 #if ENABLE_SOUND
701    &DlgSound,
702 #endif
703    &DlgGroupDefaults,
704    &DlgRemember,
705    &DlgFx,
706    &DlgBackground,
707    &DlgTheme,
708 #if USE_COMPOSITE
709    &DlgComposite,
710 #endif
711    &DlgSession,
712    &DlgMisc,
713 };
714 
715 static void
CB_DlgSelect(Dialog * d,int val,void * data)716 CB_DlgSelect(Dialog * d, int val, void *data)
717 {
718    const DialogDef    *dd = dialogs[val];
719    DItem              *table = (DItem *) data;
720 
721    if (!table)
722       return;
723    if (!dd->fill)
724       return;
725 
726    DialogCallExitFunction(d);
727 
728    DialogItemTableEmpty(table);
729    DialogKeybindingsDestroy(d);
730 
731    DialogSetTitle(d, _(dd->title));
732    DialogFill(d, table, dd, NULL);
733 
734    DialogArrange(d, 1);
735 }
736 
737 static void
_DlgFillConfiguration(Dialog * d,DItem * table,void * data __UNUSED__)738 _DlgFillConfiguration(Dialog * d, DItem * table, void *data __UNUSED__)
739 {
740    DItem              *di, *buttons, *content;
741    unsigned int        i;
742 
743    DialogItemTableSetOptions(table, 2, 0, 0, 0);
744 
745    buttons = DialogAddItem(table, DITEM_TABLE);
746    content = DialogAddItem(table, DITEM_TABLE);
747 
748    for (i = 0; i < E_ARRAY_SIZE(dialogs); i++)
749      {
750 	di = DialogAddItem(buttons, DITEM_BUTTON);
751 	DialogItemSetPadding(di, 2, 2, 0, 0);
752 	DialogItemSetText(di, _(dialogs[i]->label));
753 	DialogItemSetCallback(di, CB_DlgSelect, i, content);
754      }
755 
756    DialogFill(d, content, dialogs[0], NULL);
757 }
758 
759 static const DialogDef DlgConfiguration = {
760    "CONFIGURE_ALL",
761    NULL, N_("Enlightenment Settings"),
762    0,
763    SOUND_SETTINGS_ALL,
764    NULL,
765    NULL,
766    _DlgFillConfiguration,
767    0, NULL, NULL
768 };
769 
770 void
IPC_Cfg(const char * params)771 IPC_Cfg(const char *params)
772 {
773    unsigned int        i;
774    const char         *name;
775 
776    if (!params || !params[0])
777      {
778 	DialogShowSimple(&DlgConfiguration, NULL);
779 	return;
780      }
781 
782    for (i = 0; i < E_ARRAY_SIZE(dialogs); i++)
783      {
784 	name = dialogs[i]->label;
785 	if (Estrcasecmp(params, name))
786 	   continue;
787 	DialogShowSimple(dialogs[i], NULL);
788      }
789 }
790 #endif /* ENABLE_DIALOGS */
791