update for beta release
[framework/uifw/e17.git] / src / modules / comp / e_mod_config.c
1 #include "e.h"
2 #include "e_mod_main.h"
3 #include "e_mod_config.h"
4 #include "e_mod_comp.h"
5
6 typedef struct _E_Demo_Style_Item
7 {
8    Evas_Object *preview;
9    Evas_Object *frame;
10    Evas_Object *livethumb;
11    Evas_Object *layout;
12    Evas_Object *border;
13    Evas_Object *client;
14 } E_Demo_Style_Item;
15
16 typedef struct _Match_Config
17 {
18    Match            match;
19    E_Config_Dialog *cfd;
20    char            *title, *name, *clas, *role;
21    int              borderless, dialog, accepts_focus, vkbd;
22    int              quickpanel, argb, fullscreen, modal;
23 } Match_Config;
24
25 struct _E_Config_Dialog_Data
26 {
27    int         use_shadow;
28    int         engine;
29    int         indirect;
30    int         texture_from_pixmap;
31    int         smooth_windows;
32    int         lock_fps;
33    int         efl_sync;
34    int         loose_sync;
35    int         grab;
36    int         vsync;
37
38    const char *shadow_style;
39
40    struct
41    {
42       Eina_List *popups;
43       Eina_List *borders;
44       Eina_List *overrides;
45       Eina_List *menus;
46       int        changed;
47    } match;
48
49    Evas_Object *popups_il;
50    Evas_Object *borders_il;
51    Evas_Object *overrides_il;
52    Evas_Object *menus_il;
53
54    Evas_Object *edit_il;
55
56    int          keep_unmapped;
57    int          max_unmapped_pixels;
58    int          max_unmapped_time;
59    int          min_unmapped_time;
60    int          send_flush;
61    int          send_dump;
62    int          nocomp_fs;
63
64    int          fps_show;
65    int          fps_corner;
66    int          fps_average_range;
67    double       first_draw_delay;
68 };
69
70 /* Protos */
71 static void        *_create_data(E_Config_Dialog *cfd);
72 static void         _free_data(E_Config_Dialog      *cfd,
73                                E_Config_Dialog_Data *cfdata);
74 static Evas_Object *_basic_create_widgets(E_Config_Dialog      *cfd,
75                                           Evas                 *evas,
76                                           E_Config_Dialog_Data *cfdata);
77 static int _basic_apply_data(E_Config_Dialog      *cfd,
78                              E_Config_Dialog_Data *cfdata);
79
80 E_Config_Dialog *
81 e_int_config_comp_module(E_Container       *con,
82                          const char *params __UNUSED__)
83 {
84    E_Config_Dialog *cfd;
85    E_Config_Dialog_View *v;
86    char buf[4096];
87    Mod *mod = _comp_mod;
88
89    if (e_config_dialog_find("E", "appearance/comp")) return NULL;
90    v = E_NEW(E_Config_Dialog_View, 1);
91
92    v->create_cfdata = _create_data;
93    v->free_cfdata = _free_data;
94    v->basic.apply_cfdata = _basic_apply_data;
95    v->basic.create_widgets = _basic_create_widgets;
96
97    snprintf(buf, sizeof(buf), "%s/e-module-comp.edj",
98             e_module_dir_get(mod->module));
99    cfd = e_config_dialog_new(con, _("Composite Settings"),
100                              "E", "appearance/comp", buf, 0, v, mod);
101    mod->config_dialog = cfd;
102    return cfd;
103 }
104
105 static void
106 _match_dup(Match        *m,
107            Match_Config *m2)
108 {
109    m2->match = *m;
110    if (m2->match.title) m2->match.title = eina_stringshare_add(m2->match.title);
111    if (m2->match.name) m2->match.name = eina_stringshare_add(m2->match.name);
112    if (m2->match.clas) m2->match.clas = eina_stringshare_add(m2->match.clas);
113    if (m2->match.role) m2->match.role = eina_stringshare_add(m2->match.role);
114    if (m2->match.shadow_style) m2->match.shadow_style = eina_stringshare_add(m2->match.shadow_style);
115 }
116
117 static void *
118 _create_data(E_Config_Dialog *cfd)
119 {
120    E_Config_Dialog_Data *cfdata;
121    Eina_List *l;
122    Match *m;
123    Match_Config *m2;
124
125    cfdata = E_NEW(E_Config_Dialog_Data, 1);
126
127    cfdata->use_shadow = _comp_mod->conf->use_shadow;
128    cfdata->engine = _comp_mod->conf->engine;
129    if ((cfdata->engine != E_EVAS_ENGINE_SOFTWARE_X11) &&
130        (cfdata->engine != E_EVAS_ENGINE_GL_X11))
131      cfdata->engine = E_EVAS_ENGINE_SOFTWARE_X11;
132    cfdata->indirect = _comp_mod->conf->indirect;
133    cfdata->texture_from_pixmap = _comp_mod->conf->texture_from_pixmap;
134    cfdata->smooth_windows = _comp_mod->conf->smooth_windows;
135    cfdata->lock_fps = _comp_mod->conf->lock_fps;
136    cfdata->efl_sync = _comp_mod->conf->efl_sync;
137    cfdata->loose_sync = _comp_mod->conf->loose_sync;
138    cfdata->grab = _comp_mod->conf->grab;
139    cfdata->vsync = _comp_mod->conf->vsync;
140    if (_comp_mod->conf->shadow_style)
141      cfdata->shadow_style = eina_stringshare_add(_comp_mod->conf->shadow_style);
142
143    cfdata->keep_unmapped = _comp_mod->conf->keep_unmapped;
144    cfdata->max_unmapped_pixels = _comp_mod->conf->max_unmapped_pixels;
145    cfdata->max_unmapped_time = _comp_mod->conf->max_unmapped_time;
146    cfdata->min_unmapped_time = _comp_mod->conf->min_unmapped_time;
147    cfdata->send_flush = _comp_mod->conf->send_flush;
148    cfdata->send_dump = _comp_mod->conf->send_dump;
149    cfdata->nocomp_fs = _comp_mod->conf->nocomp_fs;
150
151    cfdata->fps_show = _comp_mod->conf->fps_show;
152    cfdata->fps_corner = _comp_mod->conf->fps_corner;
153    cfdata->fps_average_range = _comp_mod->conf->fps_average_range;
154    if (cfdata->fps_average_range < 1) cfdata->fps_average_range = 12;
155    else if (cfdata->fps_average_range > 120)
156      cfdata->fps_average_range = 120;
157    cfdata->first_draw_delay = _comp_mod->conf->first_draw_delay;
158
159    EINA_LIST_FOREACH(_comp_mod->conf->match.popups, l, m)
160      {
161         m2 = E_NEW(Match_Config, 1);
162         _match_dup(m, m2);
163         m2->cfd = cfd;
164         cfdata->match.popups = eina_list_append(cfdata->match.popups, m2);
165      }
166
167    EINA_LIST_FOREACH(_comp_mod->conf->match.borders, l, m)
168      {
169         m2 = E_NEW(Match_Config, 1);
170         _match_dup(m, m2);
171         m2->cfd = cfd;
172         cfdata->match.borders = eina_list_append(cfdata->match.borders, m2);
173      }
174
175    EINA_LIST_FOREACH(_comp_mod->conf->match.overrides, l, m)
176      {
177         m2 = E_NEW(Match_Config, 1);
178         _match_dup(m, m2);
179         m2->cfd = cfd;
180         cfdata->match.overrides = eina_list_append(cfdata->match.overrides, m2);
181      }
182
183    EINA_LIST_FOREACH(_comp_mod->conf->match.menus, l, m)
184      {
185         m2 = E_NEW(Match_Config, 1);
186         _match_dup(m, m2);
187         m2->cfd = cfd;
188         cfdata->match.menus = eina_list_append(cfdata->match.menus, m2);
189      }
190
191    return cfdata;
192 }
193
194 static void
195 _match_free(Match_Config *m)
196 {
197    if (m->match.title) eina_stringshare_del(m->match.title);
198    if (m->match.name) eina_stringshare_del(m->match.name);
199    if (m->match.clas) eina_stringshare_del(m->match.clas);
200    if (m->match.role) eina_stringshare_del(m->match.role);
201    if (m->match.shadow_style) eina_stringshare_del(m->match.shadow_style);
202    if (m->title) free(m->title);
203    if (m->name) free(m->name);
204    if (m->clas) free(m->clas);
205    if (m->role) free(m->role);
206    free(m);
207 }
208
209 static void
210 _free_data(E_Config_Dialog *cfd  __UNUSED__,
211            E_Config_Dialog_Data *cfdata)
212 {
213    Match_Config *m;
214
215    _comp_mod->config_dialog = NULL;
216    if (cfdata->shadow_style) eina_stringshare_del(cfdata->shadow_style);
217    EINA_LIST_FREE(cfdata->match.popups, m)
218      {
219         _match_free(m);
220      }
221    EINA_LIST_FREE(cfdata->match.borders, m)
222      {
223         _match_free(m);
224      }
225    EINA_LIST_FREE(cfdata->match.overrides, m)
226      {
227         _match_free(m);
228      }
229    EINA_LIST_FREE(cfdata->match.menus, m)
230      {
231         _match_free(m);
232      }
233    free(cfdata);
234 }
235
236 static void
237 _shadow_changed(void            *data,
238                 Evas_Object     *obj,
239                 void *event_info __UNUSED__)
240 {
241    E_Config_Dialog_Data *cfdata = data;
242    Evas_Object *orec0;
243    Eina_List *style_list;
244    const E_Demo_Style_Item *it;
245    const Eina_List *l;
246
247    orec0 = evas_object_name_find(evas_object_evas_get(obj), "style_shadows");
248    style_list = evas_object_data_get(orec0, "list");
249    EINA_LIST_FOREACH(style_list, l, it)
250      {
251         if (cfdata->use_shadow)
252           edje_object_signal_emit(it->preview, "e,state,shadow,on", "e");
253         else
254           edje_object_signal_emit(it->preview, "e,state,shadow,off", "e");
255      }
256 }
257
258 static Eina_Bool
259 _style_demo(void *data)
260 {
261    Eina_List *style_shadows, *l;
262    int demo_state;
263    const E_Demo_Style_Item *it;
264
265    demo_state = (long)evas_object_data_get(data, "style_demo_state");
266    demo_state = (demo_state + 1) % 4;
267    evas_object_data_set(data, "style_demo_state", (void *)(long)demo_state);
268
269    style_shadows = evas_object_data_get(data, "style_shadows");
270    EINA_LIST_FOREACH(style_shadows, l, it)
271      {
272         Evas_Object *ob = it->preview;
273         Evas_Object *of = it->frame;
274
275         switch (demo_state)
276           {
277            case 0:
278              edje_object_signal_emit(ob, "e,state,visible,on", "e");
279              edje_object_signal_emit(ob, "e,state,focus,on", "e");
280              edje_object_part_text_set(of, "e.text.label", _("Visible"));
281              break;
282
283            case 1:
284              edje_object_signal_emit(ob, "e,state,focus,off", "e");
285              edje_object_part_text_set(of, "e.text.label", _("Focus-Out"));
286              break;
287
288            case 2:
289              edje_object_signal_emit(ob, "e,state,focus,on", "e");
290              edje_object_part_text_set(of, "e.text.label", _("Focus-In"));
291              break;
292
293            case 3:
294              edje_object_signal_emit(ob, "e,state,visible,off", "e");
295              edje_object_part_text_set(of, "e.text.label", _("Hidden"));
296              break;
297
298            default:
299              break;
300           }
301      }
302    return ECORE_CALLBACK_RENEW;
303 }
304
305 static void
306 _style_selector_del(void *data       __UNUSED__,
307                     Evas            *e,
308                     Evas_Object     *o,
309                     void *event_info __UNUSED__)
310 {
311    Eina_List *style_shadows, *style_list;
312    Ecore_Timer *timer;
313    Evas_Object *orec0;
314
315    orec0 = evas_object_name_find(e, "style_shadows");
316    style_list = evas_object_data_get(orec0, "list");
317
318    style_shadows = evas_object_data_get(o, "style_shadows");
319    if (style_shadows)
320      {
321         E_Demo_Style_Item *ds_it;
322
323         EINA_LIST_FREE(style_shadows, ds_it)
324           {
325              style_list = eina_list_remove(style_list, ds_it);
326
327              evas_object_del(ds_it->client);
328              evas_object_del(ds_it->border);
329              evas_object_del(ds_it->frame);
330              evas_object_del(ds_it->preview);
331              evas_object_del(ds_it->layout);
332              evas_object_del(ds_it->livethumb);
333              free(ds_it);
334           }
335         evas_object_data_set(o, "style_shadows", NULL);
336      }
337
338    timer = evas_object_data_get(o, "style_timer");
339    if (timer)
340      {
341         ecore_timer_del(timer);
342         evas_object_data_set(o, "style_timer", NULL);
343      }
344
345    evas_object_data_set(orec0, "list", style_list);
346 }
347
348 static Evas_Object *
349 _style_selector(Evas        *evas,
350                 int          use_shadow,
351                 const char **source)
352 {
353    Evas_Object *oi, *ob, *oo, *obd, *orec, *oly, *orec0;
354    Eina_List *styles, *l, *style_shadows = NULL, *style_list;
355    char *style;
356    const char *str;
357    int n, sel;
358    Evas_Coord wmw, wmh;
359    Ecore_Timer *timer;
360
361    orec0 = evas_object_name_find(evas, "style_shadows");
362    style_list = evas_object_data_get(orec0, "list");
363    oi = e_widget_ilist_add(evas, 80, 80, source);
364    evas_object_event_callback_add(oi, EVAS_CALLBACK_DEL,
365                                   _style_selector_del, oi);
366    sel = 0;
367    styles = e_theme_comp_list();
368    n = 0;
369    EINA_LIST_FOREACH(styles, l, style)
370      {
371         E_Demo_Style_Item *ds_it;
372         char buf[PATH_MAX];
373
374         ds_it = malloc(sizeof(E_Demo_Style_Item));
375
376         ob = e_livethumb_add(evas);
377         ds_it->livethumb = ob;
378         e_livethumb_vsize_set(ob, 240, 240);
379
380         oly = e_layout_add(e_livethumb_evas_get(ob));
381         ds_it->layout = ob;
382         e_layout_virtual_size_set(oly, 240, 240);
383         e_livethumb_thumb_set(ob, oly);
384         evas_object_show(oly);
385
386         oo = edje_object_add(e_livethumb_evas_get(ob));
387         ds_it->preview = oo;
388         snprintf(buf, sizeof(buf), "e/comp/%s", style);
389         e_theme_edje_object_set(oo, "base/theme/borders", buf);
390         e_layout_pack(oly, oo);
391         e_layout_child_move(oo, 39, 39);
392         e_layout_child_resize(oo, 162, 162);
393         if (use_shadow) edje_object_signal_emit(oo, "e,state,shadow,on", "e");
394         edje_object_signal_emit(oo, "e,state,visible,on", "e");
395         evas_object_show(oo);
396
397         ds_it->frame = edje_object_add(evas);
398         e_theme_edje_object_set
399           (ds_it->frame, "base/theme/modules/comp", "e/modules/comp/preview");
400         edje_object_part_swallow(ds_it->frame, "e.swallow.preview", ob);
401         evas_object_show(ds_it->frame);
402         style_shadows = eina_list_append(style_shadows, ds_it);
403
404         obd = edje_object_add(e_livethumb_evas_get(ob));
405         ds_it->border = obd;
406         e_theme_edje_object_set(obd, "base/theme/borders",
407                                 "e/widgets/border/default/border");
408         edje_object_part_text_set(obd, "e.text.title", _("Title"));
409         edje_object_signal_emit(obd, "e,state,focused", "e");
410         edje_object_part_swallow(oo, "e.swallow.content", obd);
411         evas_object_show(obd);
412
413         orec = evas_object_rectangle_add(e_livethumb_evas_get(ob));
414         ds_it->client = orec;
415         evas_object_color_set(orec, 255, 255, 255, 255);
416         edje_object_part_swallow(obd, "e.swallow.client", orec);
417         evas_object_show(orec);
418
419         e_widget_ilist_append(oi, ds_it->frame, style, NULL, NULL, style);
420         evas_object_show(ob);
421         if (*source)
422           {
423              if (!strcmp(*source, style)) sel = n;
424           }
425         n++;
426
427         style_list = eina_list_append(style_list, ds_it);
428      }
429    evas_object_data_set(orec0, "list", style_list);
430    evas_object_data_set(oi, "style_shadows", style_shadows);
431    timer = ecore_timer_add(3.0, _style_demo, oi);
432    evas_object_data_set(oi, "style_timer", timer);
433    evas_object_data_set(oi, "style_demo_state", (void *)1);
434    e_widget_size_min_get(oi, &wmw, &wmh);
435    e_widget_size_min_set(oi, 160, 100);
436    e_widget_ilist_selected_set(oi, sel);
437    e_widget_ilist_go(oi);
438
439    EINA_LIST_FREE(styles, str)
440      eina_stringshare_del(str);
441
442    return oi;
443 }
444
445 static void
446 _match_sel(void *data __UNUSED__)
447 {
448 //   Match_Config *m = data;
449 //   E_Config_Dialog *cfd = m->cfd;
450 }
451
452 static const char *
453 _match_type_label_get(int type)
454 {
455    if (ECORE_X_WINDOW_TYPE_UNKNOWN == type)
456      return _("Unused");
457    if (ECORE_X_WINDOW_TYPE_COMBO == type)
458      return _("Combo");
459    if (ECORE_X_WINDOW_TYPE_DESKTOP == type)
460      return _("Desktop");
461    if (ECORE_X_WINDOW_TYPE_DIALOG == type)
462      return _("Dialog");
463    if (ECORE_X_WINDOW_TYPE_DOCK == type)
464      return _("Dock");
465    if (ECORE_X_WINDOW_TYPE_DND == type)
466      return _("Drag and Drop");
467    if (ECORE_X_WINDOW_TYPE_MENU == type)
468      return _("Menu");
469    if (ECORE_X_WINDOW_TYPE_DROPDOWN_MENU == type)
470      return _("Menu (Dropdown)");
471    if (ECORE_X_WINDOW_TYPE_POPUP_MENU == type)
472      return _("Menu (Popup)");
473    if (ECORE_X_WINDOW_TYPE_NORMAL == type)
474      return _("Normal");
475    if (ECORE_X_WINDOW_TYPE_NOTIFICATION == type)
476      return _("Notification");
477    if (ECORE_X_WINDOW_TYPE_SPLASH == type)
478      return _("Splash");
479    if (ECORE_X_WINDOW_TYPE_TOOLBAR == type)
480      return _("Toolbar");
481    if (ECORE_X_WINDOW_TYPE_TOOLTIP == type)
482      return _("Tooltip");
483    if (ECORE_X_WINDOW_TYPE_UTILITY == type)
484      return _("Utility");
485
486    return _("Unused");
487 }
488
489 static char *
490 _match_label_get(Match_Config *m)
491 {
492    char *label;
493    Eina_Strbuf *buf = eina_strbuf_new();
494
495    if (m->match.title)
496      {
497         eina_strbuf_append(buf, _("Title:"));
498         eina_strbuf_append(buf, m->match.title);
499         eina_strbuf_append(buf, _(" / "));
500      }
501    if (m->match.primary_type)
502      {
503         eina_strbuf_append(buf, _("Type:"));
504         eina_strbuf_append(buf, _match_type_label_get(m->match.primary_type));
505         eina_strbuf_append(buf, _(" / "));
506      }
507    if (m->match.name)
508      {
509         eina_strbuf_append(buf, _("Name:"));
510         eina_strbuf_append(buf, m->match.name);
511         eina_strbuf_append(buf, _(" / "));
512      }
513    if (m->match.clas)
514      {
515         eina_strbuf_append(buf, _("Class:"));
516         eina_strbuf_append(buf, m->match.clas);
517         eina_strbuf_append(buf, _(" / "));
518      }
519    if (m->match.role)
520      {
521         eina_strbuf_append(buf, _("Role:"));
522         eina_strbuf_append(buf, m->match.role);
523         eina_strbuf_append(buf, _(" / "));
524      }
525    if (m->match.shadow_style)
526      {
527         eina_strbuf_append(buf, _("Style:"));
528         eina_strbuf_append(buf, m->match.shadow_style);
529      }
530
531    if (!eina_strbuf_length_get(buf))
532      return _("Unknown");
533
534    label = strdup(eina_strbuf_string_get(buf));
535    eina_strbuf_free(buf);
536
537    return label;
538 }
539
540 static void
541 _match_ilist_append(Evas_Object  *il,
542                     Match_Config *m,
543                     int           pos,
544                     int           pre)
545 {
546    char *name = _match_label_get(m);
547
548    if (pos == -1)
549      e_widget_ilist_append(il, NULL, name, _match_sel, m, NULL);
550    else
551      {
552         if (pre)
553           e_widget_ilist_prepend_relative(il, NULL, name, _match_sel, m, NULL, pos);
554         else
555           e_widget_ilist_append_relative(il, NULL, name, _match_sel, m, NULL, pos);
556      }
557    E_FREE(name);
558 }
559
560 static void
561 _match_list_up(Eina_List   **list,
562                Match_Config *m)
563 {
564    Eina_List *l, *lp;
565
566    l = eina_list_data_find_list(*list, m);
567    if (!l) return;
568    lp = l->prev;
569    *list = eina_list_remove_list(*list, l);
570    if (lp) *list = eina_list_prepend_relative_list(*list, m, lp);
571    else *list = eina_list_prepend(*list, m);
572 }
573
574 static void
575 _match_list_down(Eina_List   **list,
576                  Match_Config *m)
577 {
578    Eina_List *l, *lp;
579
580    l = eina_list_data_find_list(*list, m);
581    if (!l) return;
582    lp = l->next;
583    *list = eina_list_remove_list(*list, l);
584    if (lp) *list = eina_list_append_relative_list(*list, m, lp);
585    else *list = eina_list_append(*list, m);
586 }
587
588 static void
589 _match_list_del(Eina_List   **list,
590                 Match_Config *m)
591 {
592    Eina_List *l, *lp;
593
594    l = eina_list_data_find_list(*list, m);
595    if (!l) return;
596    lp = l->next;
597    *list = eina_list_remove_list(*list, l);
598    _match_free(m);
599 }
600
601 static void
602 _cb_dialog_resize(void            *data,
603                   Evas *e          __UNUSED__,
604                   Evas_Object     *obj,
605                   void *event_info __UNUSED__)
606 {
607    Evas_Object *bg, *of;
608    int x, y, w, h;
609
610    of = data;
611    bg = evas_object_data_get(of, "bg");
612    evas_object_geometry_get(obj, &x, &y, &w, &h);
613
614    evas_object_move(bg, x, y);
615    evas_object_resize(bg, w, h);
616    evas_object_move(of, x, y);
617    evas_object_resize(of, w, h);
618 }
619
620 static void
621 _edit_ok(void *d1,
622          void *d2)
623 {
624    Match_Config *m = d1;
625    Evas_Object *dia, *bg, *of = d2;
626    Evas_Object *il;
627    char *label;
628    int n;
629
630    if (m->match.title) eina_stringshare_del(m->match.title);
631    m->match.title = NULL;
632    if (m->title)
633      {
634         if (m->title[0]) m->match.title = eina_stringshare_add(m->title);
635         free(m->title);
636         m->title = NULL;
637      }
638    if (m->match.name) eina_stringshare_del(m->match.name);
639    m->match.name = NULL;
640    if (m->name)
641      {
642         if (m->name[0]) m->match.name = eina_stringshare_add(m->name);
643         free(m->name);
644         m->name = NULL;
645      }
646    if (m->match.clas) eina_stringshare_del(m->match.clas);
647    m->match.clas = NULL;
648    if (m->clas)
649      {
650         if (m->clas[0]) m->match.clas = eina_stringshare_add(m->clas);
651         free(m->clas);
652         m->clas = NULL;
653      }
654    if (m->match.role) eina_stringshare_del(m->match.role);
655    m->match.role = NULL;
656    if (m->role)
657      {
658         if (m->role[0]) m->match.role = eina_stringshare_add(m->role);
659         free(m->role);
660         m->role = NULL;
661      }
662    m->match.borderless = m->borderless;
663    m->match.dialog = m->dialog;
664    m->match.accepts_focus = m->accepts_focus;
665    m->match.vkbd = m->vkbd;
666    m->match.quickpanel = m->quickpanel;
667    m->match.argb = m->argb;
668    m->match.fullscreen = m->fullscreen;
669    m->match.modal = m->modal;
670
671    il = m->cfd->cfdata->edit_il;
672    n = e_widget_ilist_selected_get(il);
673    label = _match_label_get(m);
674    e_widget_ilist_nth_label_set(il, n, label);
675    E_FREE(label);
676    bg = evas_object_data_get(of, "bg");
677    dia = evas_object_data_get(of, "dia");
678
679    evas_object_event_callback_del(dia, EVAS_CALLBACK_RESIZE, _cb_dialog_resize);
680    evas_object_del(bg);
681    evas_object_del(of);
682 }
683
684 static void
685 _create_edit_frame(E_Config_Dialog      *cfd,
686                    Evas                 *evas,
687                    E_Config_Dialog_Data *cfdata,
688                    Match_Config         *m)
689 {
690    Evas_Object *of, *oi, *lb, *en, *bt, *tb, *tab2, *o, *sf, *li;
691    E_Radio_Group *rg;
692    int row;
693    int x, y, w, h;
694
695    o = edje_object_add(evas);
696    e_theme_edje_object_set(o, "base/theme/dialog", "e/widgets/dialog/main");
697    evas_object_geometry_get(cfd->dia->bg_object, &x, &y, &w, &h);
698    evas_object_move(o, x, y);
699    evas_object_resize(o, w, h);
700    evas_object_show(o);
701
702    of = e_widget_frametable_add(evas, _("Edit Match"), 0);
703    evas_object_data_set(of, "bg", o);
704    evas_object_data_set(of, "dia", cfd->dia->bg_object);
705    evas_object_move(of, x, y);
706    evas_object_resize(of, w, h);
707    evas_object_show(of);
708
709    evas_object_event_callback_add(cfd->dia->bg_object, EVAS_CALLBACK_RESIZE,
710                                   _cb_dialog_resize, of);
711
712    tb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale);
713
714    tab2 = e_widget_table_add(evas, 0);
715    if (cfdata->edit_il == cfdata->borders_il)
716      {
717         if (m->match.title) m->title = strdup(m->match.title);
718         else m->title = NULL;
719         lb = e_widget_label_add(evas, _("Title"));
720         e_widget_table_object_append(tab2, lb, 0, 0, 1, 1, 1, 0, 0, 0);
721         en = e_widget_entry_add(evas, &(m->title), NULL, NULL, NULL);
722         e_widget_table_object_append(tab2, en, 1, 0, 1, 1, 1, 0, 1, 0);
723      }
724    if ((cfdata->edit_il == cfdata->borders_il) ||
725        (cfdata->edit_il == cfdata->overrides_il) ||
726        (cfdata->edit_il == cfdata->popups_il))
727      {
728         if (m->match.name) m->name = strdup(m->match.name);
729         else m->name = NULL;
730         lb = e_widget_label_add(evas, _("Name"));
731         e_widget_table_object_append(tab2, lb, 0, 1, 1, 1, 1, 0, 0, 0);
732         en = e_widget_entry_add(evas, &(m->name), NULL, NULL, NULL);
733         e_widget_table_object_append(tab2, en, 1, 1, 1, 1, 1, 0, 1, 0);
734      }
735    if ((cfdata->edit_il == cfdata->borders_il) ||
736        (cfdata->edit_il == cfdata->overrides_il))
737      {
738         if (m->match.clas) m->clas = strdup(m->match.clas);
739         else m->clas = NULL;
740         lb = e_widget_label_add(evas, _("Class"));
741         e_widget_table_object_append(tab2, lb, 0, 2, 1, 1, 1, 0, 0, 0);
742         en = e_widget_entry_add(evas, &(m->clas), NULL, NULL, NULL);
743         e_widget_table_object_append(tab2, en, 1, 2, 1, 1, 1, 0, 1, 0);
744      }
745    if (cfdata->edit_il == cfdata->borders_il)
746      {
747         if (m->match.role) m->role = strdup(m->match.role);
748         else m->role = NULL;
749         lb = e_widget_label_add(evas, _("Role"));
750         e_widget_table_object_append(tab2, lb, 0, 3, 1, 1, 1, 0, 0, 0);
751         en = e_widget_entry_add(evas, &(m->role), NULL, NULL, NULL);
752         e_widget_table_object_append(tab2, en, 1, 3, 1, 1, 1, 0, 1, 0);
753      }
754    e_widget_toolbook_page_append(tb, NULL, _("Names"), tab2, 1, 1, 1, 1, 0.5, 0.0);
755
756    if ((cfdata->edit_il == cfdata->borders_il) ||
757        (cfdata->edit_il == cfdata->overrides_il))
758      {
759         Evas_Coord mw, mh;
760
761         rg = e_widget_radio_group_new(&m->match.primary_type);
762
763         li = e_widget_list_add(evas, 1, 0);
764
765         o = e_widget_radio_add(evas, _("Unused"), ECORE_X_WINDOW_TYPE_UNKNOWN, rg);
766         e_widget_list_object_append(li, o, 1, 0, 0.0);
767
768         o = e_widget_radio_add(evas, _("Combo"), ECORE_X_WINDOW_TYPE_COMBO, rg);
769         e_widget_list_object_append(li, o, 1, 0, 0.0);
770         o = e_widget_radio_add(evas, _("Desktop"), ECORE_X_WINDOW_TYPE_DESKTOP, rg);
771         e_widget_list_object_append(li, o, 1, 0, 0.0);
772         o = e_widget_radio_add(evas, _("Dialog"), ECORE_X_WINDOW_TYPE_DIALOG, rg);
773         e_widget_list_object_append(li, o, 1, 0, 0.0);
774         o = e_widget_radio_add(evas, _("Dock"), ECORE_X_WINDOW_TYPE_DOCK, rg);
775         e_widget_list_object_append(li, o, 1, 0, 0.0);
776         o = e_widget_radio_add(evas, _("Drag and Drop"), ECORE_X_WINDOW_TYPE_DND, rg);
777         e_widget_list_object_append(li, o, 1, 0, 0.0);
778         o = e_widget_radio_add(evas, _("Menu"), ECORE_X_WINDOW_TYPE_MENU, rg);
779         e_widget_list_object_append(li, o, 1, 0, 0.0);
780         o = e_widget_radio_add(evas, _("Menu (Dropdown)"), ECORE_X_WINDOW_TYPE_DROPDOWN_MENU, rg);
781         e_widget_list_object_append(li, o, 1, 0, 0.0);
782         o = e_widget_radio_add(evas, _("Menu (Popup)"), ECORE_X_WINDOW_TYPE_POPUP_MENU, rg);
783         e_widget_list_object_append(li, o, 1, 0, 0.0);
784         o = e_widget_radio_add(evas, _("Normal"), ECORE_X_WINDOW_TYPE_NORMAL, rg);
785         e_widget_list_object_append(li, o, 1, 0, 0.0);
786         o = e_widget_radio_add(evas, _("Notification"), ECORE_X_WINDOW_TYPE_NOTIFICATION, rg);
787         e_widget_list_object_append(li, o, 1, 0, 0.0);
788         o = e_widget_radio_add(evas, _("Splash"), ECORE_X_WINDOW_TYPE_SPLASH, rg);
789         e_widget_list_object_append(li, o, 1, 0, 0.0);
790         o = e_widget_radio_add(evas, _("Toolbar"), ECORE_X_WINDOW_TYPE_TOOLBAR, rg);
791         e_widget_list_object_append(li, o, 1, 0, 0.0);
792         o = e_widget_radio_add(evas, _("Tooltip"), ECORE_X_WINDOW_TYPE_TOOLTIP, rg);
793         e_widget_list_object_append(li, o, 1, 0, 0.0);
794         o = e_widget_radio_add(evas, _("Utility"), ECORE_X_WINDOW_TYPE_UTILITY, rg);
795         e_widget_list_object_append(li, o, 1, 0, 0.0);
796
797         e_widget_size_min_get(li, &mw, &mh);
798         evas_object_resize(li, mw, mh);
799
800         sf = e_widget_scrollframe_simple_add(evas, li);
801         e_widget_toolbook_page_append(tb, NULL, _("Types"), sf,
802                                       1, 1, 1, 1, 0.5, 0.0);
803      }
804
805    m->borderless = m->match.borderless;
806    m->dialog = m->match.dialog;
807    m->accepts_focus = m->match.accepts_focus;
808    m->vkbd = m->match.vkbd;
809    m->quickpanel = m->match.quickpanel;
810    m->argb = m->match.argb;
811    m->fullscreen = m->match.fullscreen;
812    m->modal = m->match.modal;
813
814    row = 0;
815    tab2 = e_widget_table_add(evas, 0);
816    lb = e_widget_label_add(evas, _("Unused"));
817    e_widget_table_object_append(tab2, lb, 1, row, 1, 1, 0, 0, 0, 0);
818    lb = e_widget_label_add(evas, _("On"));
819    e_widget_table_object_append(tab2, lb, 2, row, 1, 1, 0, 0, 0, 0);
820    lb = e_widget_label_add(evas, _("Off"));
821    e_widget_table_object_append(tab2, lb, 3, row, 1, 1, 0, 0, 0, 0);
822    row++;
823
824    if (cfdata->edit_il == cfdata->borders_il)
825      {
826         lb = e_widget_label_add(evas, _("Borderless"));
827         e_widget_table_object_append(tab2, lb, 0, row, 1, 1, 1, 0, 1, 0);
828         rg = e_widget_radio_group_new(&m->borderless);
829         o = e_widget_radio_add(evas, NULL, 0, rg);
830         e_widget_table_object_append(tab2, o, 1, row, 1, 1, 0, 0, 0, 0);
831         o = e_widget_radio_add(evas, NULL, 1, rg);
832         e_widget_table_object_append(tab2, o, 2, row, 1, 1, 0, 0, 0, 0);
833         o = e_widget_radio_add(evas, NULL, -1, rg);
834         e_widget_table_object_append(tab2, o, 3, row, 1, 1, 0, 0, 0, 0);
835         row++;
836      }
837    if (cfdata->edit_il == cfdata->borders_il)
838      {
839         lb = e_widget_label_add(evas, _("Dialog"));
840         e_widget_table_object_append(tab2, lb, 0, row, 1, 1, 1, 0, 1, 0);
841         rg = e_widget_radio_group_new(&m->dialog);
842         o = e_widget_radio_add(evas, NULL, 0, rg);
843         e_widget_table_object_append(tab2, o, 1, row, 1, 1, 0, 0, 0, 0);
844         o = e_widget_radio_add(evas, NULL, 1, rg);
845         e_widget_table_object_append(tab2, o, 2, row, 1, 1, 0, 0, 0, 0);
846         o = e_widget_radio_add(evas, NULL, -1, rg);
847         e_widget_table_object_append(tab2, o, 3, row, 1, 1, 0, 0, 0, 0);
848         row++;
849      }
850    if (cfdata->edit_il == cfdata->borders_il)
851      {
852         lb = e_widget_label_add(evas, _("Accepts Focus"));
853         e_widget_table_object_append(tab2, lb, 0, row, 1, 1, 1, 0, 1, 0);
854         rg = e_widget_radio_group_new(&m->accepts_focus);
855         o = e_widget_radio_add(evas, NULL, 0, rg);
856         e_widget_table_object_append(tab2, o, 1, row, 1, 1, 0, 0, 0, 0);
857         o = e_widget_radio_add(evas, NULL, 1, rg);
858         e_widget_table_object_append(tab2, o, 2, row, 1, 1, 0, 0, 0, 0);
859         o = e_widget_radio_add(evas, NULL, -1, rg);
860         e_widget_table_object_append(tab2, o, 3, row, 1, 1, 0, 0, 0, 0);
861         row++;
862      }
863    if (cfdata->edit_il == cfdata->borders_il)
864      {
865         lb = e_widget_label_add(evas, _("Virtual Keyboard"));
866         e_widget_table_object_append(tab2, lb, 0, row, 1, 1, 1, 0, 1, 0);
867         rg = e_widget_radio_group_new(&m->vkbd);
868         o = e_widget_radio_add(evas, NULL, 0, rg);
869         e_widget_table_object_append(tab2, o, 1, row, 1, 1, 0, 0, 0, 0);
870         o = e_widget_radio_add(evas, NULL, 1, rg);
871         e_widget_table_object_append(tab2, o, 2, row, 1, 1, 0, 0, 0, 0);
872         o = e_widget_radio_add(evas, NULL, -1, rg);
873         e_widget_table_object_append(tab2, o, 3, row, 1, 1, 0, 0, 0, 0);
874         row++;
875      }
876    if (cfdata->edit_il == cfdata->borders_il)
877      {
878         lb = e_widget_label_add(evas, _("Quick Panel"));
879         e_widget_table_object_append(tab2, lb, 0, row, 1, 1, 1, 0, 1, 0);
880         rg = e_widget_radio_group_new(&m->quickpanel);
881         o = e_widget_radio_add(evas, NULL, 0, rg);
882         e_widget_table_object_append(tab2, o, 1, row, 1, 1, 0, 0, 0, 0);
883         o = e_widget_radio_add(evas, NULL, 1, rg);
884         e_widget_table_object_append(tab2, o, 2, row, 1, 1, 0, 0, 0, 0);
885         o = e_widget_radio_add(evas, NULL, -1, rg);
886         e_widget_table_object_append(tab2, o, 3, row, 1, 1, 0, 0, 0, 0);
887         row++;
888      }
889    lb = e_widget_label_add(evas, _("ARGB"));
890    e_widget_table_object_append(tab2, lb, 0, row, 1, 1, 1, 0, 1, 0);
891    rg = e_widget_radio_group_new(&m->argb);
892    o = e_widget_radio_add(evas, NULL, 0, rg);
893    e_widget_table_object_append(tab2, o, 1, row, 1, 1, 0, 0, 0, 0);
894    o = e_widget_radio_add(evas, NULL, 1, rg);
895    e_widget_table_object_append(tab2, o, 2, row, 1, 1, 0, 0, 0, 0);
896    o = e_widget_radio_add(evas, NULL, -1, rg);
897    e_widget_table_object_append(tab2, o, 3, row, 1, 1, 0, 0, 0, 0);
898    row++;
899    if (cfdata->edit_il == cfdata->borders_il)
900      {
901         lb = e_widget_label_add(evas, _("Fullscreen"));
902         e_widget_table_object_append(tab2, lb, 0, row, 1, 1, 1, 0, 1, 0);
903         rg = e_widget_radio_group_new(&m->fullscreen);
904         o = e_widget_radio_add(evas, NULL, 0, rg);
905         e_widget_table_object_append(tab2, o, 1, row, 1, 1, 0, 0, 0, 0);
906         o = e_widget_radio_add(evas, NULL, 1, rg);
907         e_widget_table_object_append(tab2, o, 2, row, 1, 1, 0, 0, 0, 0);
908         o = e_widget_radio_add(evas, NULL, -1, rg);
909         e_widget_table_object_append(tab2, o, 3, row, 1, 1, 0, 0, 0, 0);
910         row++;
911      }
912    if (cfdata->edit_il == cfdata->borders_il)
913      {
914         lb = e_widget_label_add(evas, _("Modal"));
915         e_widget_table_object_append(tab2, lb, 0, row, 1, 1, 1, 0, 1, 0);
916         rg = e_widget_radio_group_new(&m->modal);
917         o = e_widget_radio_add(evas, NULL, 0, rg);
918         e_widget_table_object_append(tab2, o, 1, row, 1, 1, 0, 0, 0, 0);
919         o = e_widget_radio_add(evas, NULL, 1, rg);
920         e_widget_table_object_append(tab2, o, 2, row, 1, 1, 0, 0, 0, 0);
921         o = e_widget_radio_add(evas, NULL, -1, rg);
922         e_widget_table_object_append(tab2, o, 3, row, 1, 1, 0, 0, 0, 0);
923         row++;
924      }
925    e_widget_toolbook_page_append(tb, NULL, _("Flags"), tab2,
926                                  1, 1, 1, 1, 0.5, 0.0);
927
928    oi = _style_selector(evas, cfdata->use_shadow, &(m->match.shadow_style));
929    e_widget_toolbook_page_append(tb, NULL, _("Style"), oi,
930                                  1, 1, 1, 1, 0.5, 0.0);
931
932    e_widget_frametable_object_append(of, tb, 0, 0, 1, 1, 1, 1, 1, 1);
933    e_widget_toolbook_page_show(tb, 0);
934
935    bt = e_widget_button_add(evas, _("OK"), NULL, _edit_ok, m, of);
936    e_widget_frametable_object_append(of, bt, 0, 1, 1, 1, 0, 0, 0, 0);
937 }
938
939 static void
940 _but_up(void *d1,
941         void *d2)
942 {
943    E_Config_Dialog *cfd = d1;
944    Evas_Object *il = d2;
945    Match_Config *m;
946    int n;
947
948    e_widget_ilist_freeze(il);
949    n = e_widget_ilist_selected_get(il);
950    if (n < 1) return;
951    m = e_widget_ilist_nth_data_get(il, n);
952    if (!m)
953      {
954         e_widget_ilist_thaw(il);
955         return;
956      }
957    e_widget_ilist_remove_num(il, n);
958    n--;
959    _match_ilist_append(il, m, n, 1);
960    e_widget_ilist_nth_show(il, n, 0);
961    e_widget_ilist_selected_set(il, n);
962    e_widget_ilist_thaw(il);
963    e_widget_ilist_go(il);
964    _match_list_up(&(cfd->cfdata->match.popups), m);
965    _match_list_up(&(cfd->cfdata->match.borders), m);
966    _match_list_up(&(cfd->cfdata->match.overrides), m);
967    _match_list_up(&(cfd->cfdata->match.menus), m);
968    cfd->cfdata->match.changed = 1;
969 }
970
971 static void
972 _but_down(void *d1,
973           void *d2)
974 {
975    E_Config_Dialog *cfd = d1;
976    Evas_Object *il = d2;
977    Match_Config *m;
978    int n;
979
980    e_widget_ilist_freeze(il);
981    n = e_widget_ilist_selected_get(il);
982    if (n >= (e_widget_ilist_count(il) - 1)) return;
983    m = e_widget_ilist_nth_data_get(il, n);
984    if (!m)
985      {
986         e_widget_ilist_thaw(il);
987         return;
988      }
989    e_widget_ilist_remove_num(il, n);
990    _match_ilist_append(il, m, n, 0);
991    e_widget_ilist_nth_show(il, n + 1, 0);
992    e_widget_ilist_selected_set(il, n + 1);
993    e_widget_ilist_thaw(il);
994    e_widget_ilist_go(il);
995    _match_list_down(&(cfd->cfdata->match.popups), m);
996    _match_list_down(&(cfd->cfdata->match.borders), m);
997    _match_list_down(&(cfd->cfdata->match.overrides), m);
998    _match_list_down(&(cfd->cfdata->match.menus), m);
999    cfd->cfdata->match.changed = 1;
1000 }
1001
1002 static void
1003 _but_add(void *d1,
1004          void *d2)
1005 {
1006    E_Config_Dialog *cfd = d1;
1007    Evas_Object *il = d2;
1008    Match_Config *m;
1009    int n;
1010
1011    m = E_NEW(Match_Config, 1);
1012    m->cfd = cfd;
1013    m->match.title = NULL;
1014    m->match.name = NULL;
1015    m->match.clas = NULL;
1016    m->match.role = NULL;
1017    m->match.shadow_style = eina_stringshare_add("default");
1018
1019    if (il == cfd->cfdata->popups_il)
1020      cfd->cfdata->match.popups = eina_list_append(cfd->cfdata->match.popups, m);
1021    else if (il == cfd->cfdata->borders_il)
1022      cfd->cfdata->match.borders = eina_list_append(cfd->cfdata->match.borders, m);
1023    else if (il == cfd->cfdata->overrides_il)
1024      cfd->cfdata->match.overrides = eina_list_append(cfd->cfdata->match.overrides, m);
1025    else if (il == cfd->cfdata->menus_il)
1026      cfd->cfdata->match.menus = eina_list_append(cfd->cfdata->match.menus, m);
1027    e_widget_ilist_freeze(il);
1028    _match_ilist_append(il, m, -1, 0);
1029    e_widget_ilist_thaw(il);
1030    e_widget_ilist_go(il);
1031    n = e_widget_ilist_count(il);
1032    e_widget_ilist_nth_show(il, n - 1, 0);
1033    e_widget_ilist_selected_set(il, n - 1);
1034
1035    cfd->cfdata->edit_il = il;
1036    _create_edit_frame(cfd, evas_object_evas_get(il), cfd->cfdata, m);
1037    cfd->cfdata->match.changed = 1;
1038 }
1039
1040 static void
1041 _but_del(void *d1,
1042          void *d2)
1043 {
1044    E_Config_Dialog *cfd = d1;
1045    Evas_Object *il = d2;
1046    Match_Config *m;
1047    int n;
1048
1049    e_widget_ilist_freeze(il);
1050    n = e_widget_ilist_selected_get(il);
1051    m = e_widget_ilist_nth_data_get(il, n);
1052    if (!m)
1053      {
1054         e_widget_ilist_thaw(il);
1055         return;
1056      }
1057    e_widget_ilist_remove_num(il, n);
1058    e_widget_ilist_thaw(il);
1059    e_widget_ilist_go(il);
1060    _match_list_del(&(cfd->cfdata->match.popups), m);
1061    _match_list_del(&(cfd->cfdata->match.borders), m);
1062    _match_list_del(&(cfd->cfdata->match.overrides), m);
1063    _match_list_del(&(cfd->cfdata->match.menus), m);
1064    cfd->cfdata->match.changed = 1;
1065 }
1066
1067 static void
1068 _but_edit(void *d1,
1069           void *d2)
1070 {
1071    E_Config_Dialog *cfd = d1;
1072    Evas_Object *il = d2;
1073    int n;
1074    Match_Config *m;
1075
1076    n = e_widget_ilist_selected_get(il);
1077    m = e_widget_ilist_nth_data_get(il, n);
1078    if (!m) return;
1079
1080    cfd->cfdata->edit_il = il;
1081    _create_edit_frame(cfd, evas_object_evas_get(il), cfd->cfdata, m);
1082    cfd->cfdata->match.changed = 1;
1083 }
1084
1085 static Evas_Object *
1086 _create_match_editor(E_Config_Dialog             *cfd,
1087                      Evas                        *evas,
1088                      E_Config_Dialog_Data *cfdata __UNUSED__,
1089                      Eina_List                  **matches,
1090                      Evas_Object                **il_ret)
1091 {
1092    Evas_Object *tab, *il, *bt;
1093    Match_Config *m;
1094    Eina_List *l;
1095
1096    tab = e_widget_table_add(evas, 0);
1097
1098    il = e_widget_ilist_add(evas, 16, 16, NULL);
1099    e_widget_size_min_set(il, 160, 100);
1100
1101    EINA_LIST_FOREACH(*matches, l, m)
1102      {
1103         _match_ilist_append(il, m, -1, 0);
1104      }
1105
1106    e_widget_ilist_go(il);
1107    e_widget_table_object_append(tab, il, 0, 0, 1, 5, 1, 1, 1, 1);
1108
1109    bt = e_widget_button_add(evas, _("Up"), NULL, _but_up, cfd, il);
1110    e_widget_table_object_append(tab, bt, 1, 0, 1, 1, 1, 1, 0, 0);
1111    bt = e_widget_button_add(evas, _("Down"), NULL, _but_down, cfd, il);
1112    e_widget_table_object_append(tab, bt, 1, 1, 1, 1, 1, 1, 0, 0);
1113    bt = e_widget_button_add(evas, _("Add"), NULL, _but_add, cfd, il);
1114    e_widget_table_object_append(tab, bt, 1, 2, 1, 1, 1, 1, 0, 0);
1115    bt = e_widget_button_add(evas, _("Del"), NULL, _but_del, cfd, il);
1116    e_widget_table_object_append(tab, bt, 1, 3, 1, 1, 1, 1, 0, 0);
1117    bt = e_widget_button_add(evas, _("Edit"), NULL, _but_edit, cfd, il);
1118    e_widget_table_object_append(tab, bt, 1, 4, 1, 1, 1, 1, 0, 0);
1119
1120    *il_ret = il;
1121
1122    return tab;
1123 }
1124
1125 static Evas_Object *
1126 _create_styles_toolbook(E_Config_Dialog      *cfd,
1127                         Evas                 *evas,
1128                         E_Config_Dialog_Data *cfdata)
1129 {
1130    Evas_Object *tb, *oi, *il;
1131
1132    tb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale);
1133
1134    oi = _style_selector(evas, cfdata->use_shadow, &(cfdata->shadow_style));
1135    e_widget_toolbook_page_append(tb, NULL, _("Default"), oi, 1, 1, 1, 1, 0.5, 0.0);
1136
1137    oi = _create_match_editor(cfd, evas, cfdata, &(cfdata->match.borders), &il);
1138    cfdata->borders_il = il;
1139    e_widget_toolbook_page_append(tb, NULL, _("Apps"), oi, 1, 1, 1, 1, 0.5, 0.0);
1140
1141    oi = _create_match_editor(cfd, evas, cfdata, &(cfdata->match.popups), &il);
1142    cfdata->popups_il = il;
1143    e_widget_toolbook_page_append(tb, NULL, _("E"), oi, 1, 1, 1, 1, 0.5, 0.0);
1144
1145    oi = _create_match_editor(cfd, evas, cfdata, &(cfdata->match.overrides), &il);
1146    cfdata->overrides_il = il;
1147    e_widget_toolbook_page_append(tb, NULL, _("Over"), oi, 1, 1, 1, 1, 0.5, 0.0);
1148
1149    oi = _create_match_editor(cfd, evas, cfdata, &(cfdata->match.menus), &il);
1150    cfdata->menus_il = il;
1151    e_widget_toolbook_page_append(tb, NULL, _("Menus"), oi, 1, 1, 1, 1, 0.5, 0.0);
1152
1153    e_widget_toolbook_page_show(tb, 0);
1154
1155    return tb;
1156 }
1157
1158 static Evas_Object *
1159 _basic_create_widgets(E_Config_Dialog      *cfd,
1160                       Evas                 *evas,
1161                       E_Config_Dialog_Data *cfdata)
1162 {
1163    Evas_Object *ob, *ol, *ol2, *of, *otb, *oi, *orec0, *tab;
1164    E_Radio_Group *rg;
1165
1166    orec0 = evas_object_rectangle_add(evas);
1167    evas_object_name_set(orec0, "style_shadows");
1168
1169    tab = e_widget_table_add(evas, 0);
1170    evas_object_name_set(tab, "dia_table");
1171
1172    otb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale);
1173
1174    ///////////////////////////////////////////
1175    ol = e_widget_list_add(evas, 0, 0);
1176    ob = e_widget_check_add(evas, _("Shadows"), &(cfdata->use_shadow));
1177    evas_object_smart_callback_add(ob, "changed", _shadow_changed, cfdata);
1178    e_widget_list_object_append(ol, ob, 1, 0, 0.5);
1179    ob = e_widget_check_add(evas, _("Limit framerate"), &(cfdata->lock_fps));
1180    e_widget_list_object_append(ol, ob, 1, 0, 0.5);
1181    ob = e_widget_check_add(evas, _("Smooth scaling"), &(cfdata->smooth_windows));
1182    e_widget_list_object_append(ol, ob, 1, 0, 0.5);
1183
1184    of = e_widget_frametable_add(evas, _("Styles"), 0);
1185    e_widget_frametable_content_align_set(of, 0.5, 0.5);
1186    oi = _create_styles_toolbook(cfd, evas, cfdata);
1187    e_widget_frametable_object_append(of, oi, 0, 0, 1, 1, 1, 1, 1, 1);
1188    e_widget_list_object_append(ol, of, 1, 1, 0.5);
1189
1190    e_widget_toolbook_page_append(otb, NULL, _("Effects"), ol, 1, 1, 1, 1, 0.5, 0.0);
1191
1192    ///////////////////////////////////////////
1193    ol = e_widget_list_add(evas, 0, 0);
1194    ob = e_widget_check_add(evas, _("Sync screen (VBlank)"), &(cfdata->vsync));
1195    e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1196    ob = e_widget_check_add(evas, _("Sync windows"), &(cfdata->efl_sync));
1197    e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1198    ob = e_widget_check_add(evas, _("Loose sync"), &(cfdata->loose_sync));
1199    e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1200    ob = e_widget_check_add(evas, _("Grab Server during draw"), &(cfdata->grab));
1201    e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1202    ob = e_widget_label_add(evas, _("Initial draw timeout for newly mapped windows"));
1203    e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1204    ob = e_widget_slider_add(evas, 1, 0, _("%1.2f Seconds"), 0.01, 0.5, 0.01, 0, &(cfdata->first_draw_delay), NULL, 150);
1205    e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1206    e_widget_toolbook_page_append(otb, NULL, _("Sync"), ol, 0, 0, 0, 0, 0.5, 0.0);
1207
1208    ol = e_widget_list_add(evas, 0, 0);
1209    rg = e_widget_radio_group_new(&(cfdata->engine));
1210    ob = e_widget_radio_add(evas, _("Software"), E_EVAS_ENGINE_SOFTWARE_X11, rg);
1211    e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1212    if (!getenv("ECORE_X_NO_XLIB")) 
1213      {
1214         if (ecore_evas_engine_type_supported_get(ECORE_EVAS_ENGINE_OPENGL_X11))
1215           {
1216              ob = e_widget_radio_add(evas, _("OpenGL"), E_EVAS_ENGINE_GL_X11, rg);
1217              e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1218
1219              of = e_widget_framelist_add(evas, _("OpenGL options"), 0);
1220              e_widget_framelist_content_align_set(of, 0.5, 0.0);
1221              ob = e_widget_check_add(evas, _("Texture from pixmap"), &(cfdata->texture_from_pixmap));
1222              e_widget_framelist_object_append(of, ob);
1223              ob = e_widget_label_add(evas, _("Ctrl+Alt+Shift+Home resets compositor"));
1224              e_widget_framelist_object_append(of, ob);
1225              ob = e_widget_check_add(evas, _("Indirect OpenGL (EXPERIMENTAL)"), &(cfdata->indirect));
1226              e_widget_framelist_object_append(of, ob);
1227              e_widget_list_object_append(ol, of, 1, 1, 0.5);
1228           }
1229      }
1230    e_widget_toolbook_page_append(otb, NULL, _("Engine"), ol, 0, 0, 0, 0, 0.5, 0.0);
1231
1232    ///////////////////////////////////////////
1233    ol = e_widget_list_add(evas, 0, 0);
1234    ob = e_widget_check_add(evas, _("Send flush"), &(cfdata->send_flush));
1235    e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1236    ob = e_widget_check_add(evas, _("Send dump"), &(cfdata->send_dump));
1237    e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1238    ob = e_widget_check_add(evas, _("Don't composite fullscreen"), &(cfdata->nocomp_fs));
1239    e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1240    ob = e_widget_check_add(evas, _("Keep hidden windows"), &(cfdata->keep_unmapped));
1241    e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1242    of = e_widget_frametable_add(evas, _("Maximum hidden pixels"), 0);
1243    e_widget_frametable_content_align_set(of, 0.5, 0.5);
1244    rg = e_widget_radio_group_new(&(cfdata->max_unmapped_pixels));
1245    ob = e_widget_radio_add(evas, _("1M"), 1 * 1024, rg);
1246    e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 1, 0, 0);
1247    ob = e_widget_radio_add(evas, _("2M"), 2 * 1024, rg);
1248    e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 1, 0, 0);
1249    ob = e_widget_radio_add(evas, _("4M"), 4 * 1024, rg);
1250    e_widget_frametable_object_append(of, ob, 0, 2, 1, 1, 1, 1, 0, 0);
1251    ob = e_widget_radio_add(evas, _("8M"), 8 * 1024, rg);
1252    e_widget_frametable_object_append(of, ob, 1, 0, 1, 1, 1, 1, 0, 0);
1253    ob = e_widget_radio_add(evas, _("16M"), 16 * 1024, rg);
1254    e_widget_frametable_object_append(of, ob, 1, 1, 1, 1, 1, 1, 0, 0);
1255    ob = e_widget_radio_add(evas, _("32M"), 32 * 1024, rg);
1256    e_widget_frametable_object_append(of, ob, 1, 2, 1, 1, 1, 1, 0, 0);
1257    ob = e_widget_radio_add(evas, _("64M"), 64 * 1024, rg);
1258    e_widget_frametable_object_append(of, ob, 2, 0, 1, 1, 1, 1, 0, 0);
1259    ob = e_widget_radio_add(evas, _("128M"), 128 * 1024, rg);
1260    e_widget_frametable_object_append(of, ob, 2, 1, 1, 1, 1, 1, 0, 0);
1261    ob = e_widget_radio_add(evas, _("256M"), 256 * 1024, rg);
1262    e_widget_frametable_object_append(of, ob, 2, 2, 1, 1, 1, 1, 0, 0);
1263    e_widget_list_object_append(ol, of, 1, 1, 0.5);
1264    e_widget_toolbook_page_append(otb, NULL, _("Memory"), ol, 0, 0, 0, 0, 0.5, 0.0);
1265
1266    ///////////////////////////////////////////
1267    ol = e_widget_list_add(evas, 0, 0);
1268    ol2 = e_widget_list_add(evas, 1, 1);
1269    of = e_widget_framelist_add(evas, _("Min hidden"), 0);
1270    e_widget_framelist_content_align_set(of, 0.5, 0.0);
1271    rg = e_widget_radio_group_new(&(cfdata->min_unmapped_time));
1272    ob = e_widget_radio_add(evas, _("30 Seconds"), 30, rg);
1273    e_widget_framelist_object_append(of, ob);
1274    ob = e_widget_radio_add(evas, _("1 Minute"), 60, rg);
1275    e_widget_framelist_object_append(of, ob);
1276    ob = e_widget_radio_add(evas, _("5 Minutes"), 5 * 60, rg);
1277    e_widget_framelist_object_append(of, ob);
1278    ob = e_widget_radio_add(evas, _("30 Minutes"), 30 * 60, rg);
1279    e_widget_framelist_object_append(of, ob);
1280    ob = e_widget_radio_add(evas, _("2 Hours"), 2 * 3600, rg);
1281    e_widget_framelist_object_append(of, ob);
1282    ob = e_widget_radio_add(evas, _("10 Hours"), 10 * 3600, rg);
1283    e_widget_framelist_object_append(of, ob);
1284    ob = e_widget_radio_add(evas, _("Forever"), 0, rg);
1285    e_widget_framelist_object_append(of, ob);
1286    e_widget_list_object_append(ol2, of, 1, 1, 0.5);
1287    of = e_widget_framelist_add(evas, _("Max hidden"), 0);
1288    e_widget_framelist_content_align_set(of, 0.5, 0.0);
1289    rg = e_widget_radio_group_new(&(cfdata->max_unmapped_time));
1290    ob = e_widget_radio_add(evas, _("30 Seconds"), 30, rg);
1291    e_widget_framelist_object_append(of, ob);
1292    ob = e_widget_radio_add(evas, _("1 Minute"), 60, rg);
1293    e_widget_framelist_object_append(of, ob);
1294    ob = e_widget_radio_add(evas, _("5 Minutes"), 5 * 60, rg);
1295    e_widget_framelist_object_append(of, ob);
1296    ob = e_widget_radio_add(evas, _("30 Minutes"), 30 * 60, rg);
1297    e_widget_framelist_object_append(of, ob);
1298    ob = e_widget_radio_add(evas, _("2 Hours"), 2 * 3600, rg);
1299    e_widget_framelist_object_append(of, ob);
1300    ob = e_widget_radio_add(evas, _("10 Hours"), 10 * 3600, rg);
1301    e_widget_framelist_object_append(of, ob);
1302    ob = e_widget_radio_add(evas, _("Forever"), 0, rg);
1303    e_widget_framelist_object_append(of, ob);
1304    e_widget_list_object_append(ol2, of, 1, 1, 0.5);
1305    e_widget_list_object_append(ol, ol2, 1, 1, 0.5);
1306    e_widget_toolbook_page_append(otb, NULL, _("Timeouts"), ol, 0, 0, 0, 0, 0.5, 0.0);
1307
1308    ///////////////////////////////////////////
1309    ol = e_widget_list_add(evas, 0, 0);
1310
1311    ob = e_widget_check_add(evas, _("Show Framerate"), &(cfdata->fps_show));
1312    e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1313    ob = e_widget_label_add(evas, _("Rolling average frame count"));
1314    e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1315    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f Frames"), 1, 120, 1, 0,
1316                             NULL, &(cfdata->fps_average_range), 240);
1317    e_widget_list_object_append(ol, ob, 1, 1, 0.5);
1318
1319    of = e_widget_frametable_add(evas, _("Corner"), 0);
1320    e_widget_frametable_content_align_set(of, 0.5, 0.5);
1321    rg = e_widget_radio_group_new(&(cfdata->fps_corner));
1322    ob = e_widget_radio_icon_add(evas, NULL, "preferences-position-top-left",
1323                                 24, 24, 0, rg);
1324    e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 1);
1325    ob = e_widget_radio_icon_add(evas, NULL, "preferences-position-top-right",
1326                                 24, 24, 1, rg);
1327    e_widget_frametable_object_append(of, ob, 1, 0, 1, 1, 1, 1, 1, 1);
1328    ob = e_widget_radio_icon_add(evas, NULL, "preferences-position-bottom-left",
1329                                 24, 24, 2, rg);
1330    e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 1, 1, 1);
1331    ob = e_widget_radio_icon_add(evas, NULL, "preferences-position-bottom-right",
1332                                 24, 24, 3, rg);
1333    e_widget_frametable_object_append(of, ob, 1, 1, 1, 1, 1, 1, 1, 1);
1334    e_widget_list_object_append(ol, of, 1, 1, 0.5);
1335
1336    e_widget_toolbook_page_append(otb, NULL, _("Debug"), ol, 0, 0, 0, 0, 0.5, 0.0);
1337
1338    e_widget_toolbook_page_show(otb, 0);
1339
1340    e_dialog_resizable_set(cfd->dia, 1);
1341
1342    e_widget_table_object_append(tab, otb, 0, 0, 1, 1, 1, 1, 1, 1);
1343    return tab;
1344 }
1345
1346 static void
1347 _match_list_free(Eina_List *list)
1348 {
1349    Match *m;
1350
1351    EINA_LIST_FREE(list, m)
1352      {
1353         if (m->title) eina_stringshare_del(m->title);
1354         if (m->name) eina_stringshare_del(m->name);
1355         if (m->clas) eina_stringshare_del(m->clas);
1356         if (m->role) eina_stringshare_del(m->role);
1357         if (m->shadow_style) eina_stringshare_del(m->shadow_style);
1358         free(m);
1359      }
1360 }
1361
1362 static void
1363 _match_dup2(Match_Config *m2,
1364             Match        *m)
1365 {
1366    *m = m2->match;
1367    if (m->title) m->title = eina_stringshare_add(m->title);
1368    if (m->name) m->name = eina_stringshare_add(m->name);
1369    if (m->clas) m->clas = eina_stringshare_add(m->clas);
1370    if (m->role) m->role = eina_stringshare_add(m->role);
1371    if (m->shadow_style) m->shadow_style = eina_stringshare_add(m->shadow_style);
1372 }
1373
1374 static int
1375 _basic_apply_data(E_Config_Dialog *cfd  __UNUSED__,
1376                   E_Config_Dialog_Data *cfdata)
1377 {
1378    if ((cfdata->use_shadow != _comp_mod->conf->use_shadow) ||
1379        (cfdata->lock_fps != _comp_mod->conf->lock_fps) ||
1380        (cfdata->smooth_windows != _comp_mod->conf->smooth_windows) ||
1381        (cfdata->grab != _comp_mod->conf->grab) ||
1382        (cfdata->keep_unmapped != _comp_mod->conf->keep_unmapped) ||
1383        (cfdata->nocomp_fs != _comp_mod->conf->nocomp_fs) ||
1384        (cfdata->shadow_style != _comp_mod->conf->shadow_style) ||
1385        (cfdata->max_unmapped_pixels != _comp_mod->conf->max_unmapped_pixels) ||
1386        (cfdata->max_unmapped_time != _comp_mod->conf->max_unmapped_time) ||
1387        (cfdata->min_unmapped_time != _comp_mod->conf->min_unmapped_time) ||
1388        (cfdata->send_flush != _comp_mod->conf->send_flush) ||
1389        (cfdata->send_dump != _comp_mod->conf->send_dump) ||
1390        (cfdata->fps_show != _comp_mod->conf->fps_show) ||
1391        (cfdata->fps_corner != _comp_mod->conf->fps_corner) ||
1392        (cfdata->fps_average_range != _comp_mod->conf->fps_average_range) ||
1393        (cfdata->first_draw_delay != _comp_mod->conf->first_draw_delay) ||
1394        (cfdata->match.changed)
1395        )
1396      {
1397         if (cfdata->match.changed)
1398           {
1399              Eina_List *l;
1400              Match *m;
1401              Match_Config *m2;
1402
1403              _match_list_free(_comp_mod->conf->match.popups);
1404              _match_list_free(_comp_mod->conf->match.borders);
1405              _match_list_free(_comp_mod->conf->match.overrides);
1406              _match_list_free(_comp_mod->conf->match.menus);
1407
1408              _comp_mod->conf->match.popups = NULL;
1409              _comp_mod->conf->match.borders = NULL;
1410              _comp_mod->conf->match.overrides = NULL;
1411              _comp_mod->conf->match.menus = NULL;
1412
1413              EINA_LIST_FOREACH(cfdata->match.popups, l, m2)
1414                {
1415                   m = E_NEW(Match, 1);
1416                   _match_dup2(m2, m);
1417                   _comp_mod->conf->match.popups =
1418                     eina_list_append(_comp_mod->conf->match.popups, m);
1419                }
1420              EINA_LIST_FOREACH(cfdata->match.borders, l, m2)
1421                {
1422                   m = E_NEW(Match, 1);
1423                   _match_dup2(m2, m);
1424                   _comp_mod->conf->match.borders =
1425                     eina_list_append(_comp_mod->conf->match.borders, m);
1426                }
1427              EINA_LIST_FOREACH(cfdata->match.overrides, l, m2)
1428                {
1429                   m = E_NEW(Match, 1);
1430                   _match_dup2(m2, m);
1431                   _comp_mod->conf->match.overrides =
1432                     eina_list_append(_comp_mod->conf->match.overrides, m);
1433                }
1434              EINA_LIST_FOREACH(cfdata->match.menus, l, m2)
1435                {
1436                   m = E_NEW(Match, 1);
1437                   _match_dup2(m2, m);
1438                   _comp_mod->conf->match.menus =
1439                     eina_list_append(_comp_mod->conf->match.menus, m);
1440                }
1441              cfdata->match.changed = 0;
1442           }
1443         _comp_mod->conf->use_shadow = cfdata->use_shadow;
1444         _comp_mod->conf->lock_fps = cfdata->lock_fps;
1445         _comp_mod->conf->smooth_windows = cfdata->smooth_windows;
1446         _comp_mod->conf->grab = cfdata->grab;
1447         _comp_mod->conf->keep_unmapped = cfdata->keep_unmapped;
1448         _comp_mod->conf->nocomp_fs = cfdata->nocomp_fs;
1449         _comp_mod->conf->max_unmapped_pixels = cfdata->max_unmapped_pixels;
1450         _comp_mod->conf->max_unmapped_time = cfdata->max_unmapped_time;
1451         _comp_mod->conf->min_unmapped_time = cfdata->min_unmapped_time;
1452         _comp_mod->conf->send_flush = cfdata->send_flush;
1453         _comp_mod->conf->send_dump = cfdata->send_dump;
1454         _comp_mod->conf->fps_show = cfdata->fps_show;
1455         _comp_mod->conf->fps_corner = cfdata->fps_corner;
1456         _comp_mod->conf->fps_average_range = cfdata->fps_average_range;
1457         _comp_mod->conf->first_draw_delay = cfdata->first_draw_delay;
1458         if (_comp_mod->conf->shadow_style)
1459           eina_stringshare_del(_comp_mod->conf->shadow_style);
1460         _comp_mod->conf->shadow_style = NULL;
1461         if (cfdata->shadow_style)
1462           _comp_mod->conf->shadow_style = eina_stringshare_add(cfdata->shadow_style);
1463         e_mod_comp_shadow_set();
1464      }
1465    if ((cfdata->engine != _comp_mod->conf->engine) ||
1466        (cfdata->indirect != _comp_mod->conf->indirect) ||
1467        (cfdata->texture_from_pixmap != _comp_mod->conf->texture_from_pixmap) ||
1468        (cfdata->efl_sync != _comp_mod->conf->efl_sync) ||
1469        (cfdata->loose_sync != _comp_mod->conf->loose_sync) ||
1470        (cfdata->vsync != _comp_mod->conf->vsync))
1471      {
1472         E_Action *a;
1473
1474         _comp_mod->conf->engine = cfdata->engine;
1475         _comp_mod->conf->indirect = cfdata->indirect;
1476         _comp_mod->conf->texture_from_pixmap = cfdata->texture_from_pixmap;
1477         _comp_mod->conf->efl_sync = cfdata->efl_sync;
1478         _comp_mod->conf->loose_sync = cfdata->loose_sync;
1479         _comp_mod->conf->vsync = cfdata->vsync;
1480
1481         a = e_action_find("restart");
1482         if ((a) && (a->func.go)) a->func.go(NULL, NULL);
1483 //        e_mod_comp_shutdown();
1484 //        e_mod_comp_init();
1485      }
1486    e_config_save_queue();
1487    return 1;
1488 }
1489