create rotation job and EAPI e_border_rotation_set
[platform/core/uifw/e17.git] / src / bin / e_int_border_remember.c
1 #include "e.h"
2
3 /* PROTOTYPES - same all the time */
4 static void        *_create_data(E_Config_Dialog *cfd);
5 static void         _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
6 static int          _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
7 static int          _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
8 static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
9 static Evas_Object *_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
10
11 /* Actual config data we will be playing with whil the dialog is active */
12 #define MODE_NOTHING        0
13 #define MODE_GEOMETRY       E_REMEMBER_APPLY_POS | E_REMEMBER_APPLY_SIZE
14 #define MODE_LOCKS          E_REMEMBER_APPLY_LOCKS
15 #define MODE_GEOMETRY_LOCKS E_REMEMBER_APPLY_POS | E_REMEMBER_APPLY_SIZE | E_REMEMBER_APPLY_LOCKS
16 #define MODE_ALL            E_REMEMBER_APPLY_POS | E_REMEMBER_APPLY_SIZE | E_REMEMBER_APPLY_LAYER | \
17                             E_REMEMBER_APPLY_LOCKS | E_REMEMBER_APPLY_BORDER | E_REMEMBER_APPLY_STICKY | \
18                             E_REMEMBER_APPLY_DESKTOP | E_REMEMBER_APPLY_SHADE | E_REMEMBER_APPLY_ZONE | \
19                             E_REMEMBER_APPLY_SKIP_WINLIST | E_REMEMBER_APPLY_SKIP_PAGER | \
20                             E_REMEMBER_APPLY_SKIP_TASKBAR | E_REMEMBER_APPLY_FULLSCREEN | E_REMEMBER_APPLY_ICON_PREF | \
21                             E_REMEMBER_APPLY_OFFER_RESISTANCE
22 struct _E_Config_Dialog_Data
23 {
24    E_Border *border;
25    /*- BASIC -*/
26    int       mode;
27    int       warned;
28    /*- ADVANCED -*/
29    char     *name;
30    char     *class;
31    char     *title;
32    char     *role;
33    char     *command;
34    char     *desktop;
35    struct
36    {
37       int match_name;
38       int match_class;
39       int match_title;
40       int match_role;
41       int match_type;
42       int match_transient;
43       int apply_first_only;
44       int apply_pos;
45       int apply_size;
46       int apply_layer;
47       int apply_locks;
48       int apply_border;
49       int apply_sticky;
50       int apply_desktop;
51       int apply_shade;
52       int apply_fullscreen;
53       int apply_zone;
54       int apply_skip_winlist;
55       int apply_skip_pager;
56       int apply_skip_taskbar;
57       int apply_run;
58       int apply_icon_pref;
59       int apply_desktop_file;
60       int set_focus_on_start;
61       int keep_settings;
62       int offer_resistance;
63    } remember;
64
65    int applied;
66 };
67
68 /* a nice easy setup function that does the dirty work */
69 EAPI void
70 e_int_border_remember(E_Border *bd)
71 {
72    E_Config_Dialog *cfd;
73    E_Config_Dialog_View *v;
74
75    v = E_NEW(E_Config_Dialog_View, 1);
76    if (v)
77      {
78         /* methods */
79         v->create_cfdata = _create_data;
80         v->free_cfdata = _free_data;
81         v->basic.apply_cfdata = _basic_apply_data;
82         v->basic.create_widgets = _basic_create_widgets;
83         v->advanced.apply_cfdata = _advanced_apply_data;
84         v->advanced.create_widgets = _advanced_create_widgets;
85         v->override_auto_apply = 1;
86
87         /* create config dialog for bd object/data */
88         cfd = e_config_dialog_new(bd->zone->container,
89                                   _("Window Remember"),
90                                   "E", "_border_remember_dialog",
91                                   NULL, 0, v, bd);
92         bd->border_remember_dialog = cfd;
93      }
94 }
95
96 /**--CREATE--**/
97 static void
98 _clear_data(E_Config_Dialog_Data *cfdata)
99 {
100    E_FREE(cfdata->name);
101    E_FREE(cfdata->class);
102    E_FREE(cfdata->title);
103    E_FREE(cfdata->role);
104    E_FREE(cfdata->command);
105    E_FREE(cfdata->desktop);
106    cfdata->mode = 0;
107    memset(&cfdata->remember, 0, sizeof(cfdata->remember));
108 }
109
110 static void
111 _fill_data(E_Config_Dialog_Data *cfdata)
112 {
113    E_Border *bd;
114    E_Remember *rem;
115
116    bd = cfdata->border;
117    rem = bd->remember;
118
119    if (rem)
120      {
121         if (rem->name && rem->name[0])
122           cfdata->name = strdup(rem->name);
123         if (rem->class && rem->class[0])
124           cfdata->class = strdup(rem->class);
125         if (rem->title && rem->title[0])
126           cfdata->title = strdup(rem->title);
127         if (rem->role && rem->role[0])
128           cfdata->role = strdup(rem->role);
129         if (rem->prop.command && rem->prop.command[0])
130           cfdata->command = strdup(rem->prop.command);
131         if (rem->prop.desktop_file && rem->prop.desktop_file[0])
132           cfdata->desktop = strdup(rem->prop.desktop_file);
133         if (cfdata->desktop)
134           cfdata->remember.apply_desktop_file = 1;
135      }
136
137    if (!cfdata->name &&
138        bd->client.icccm.name &&
139        bd->client.icccm.name[0])
140      cfdata->name = strdup(bd->client.icccm.name);
141    if (!cfdata->class &&
142        bd->client.icccm.class &&
143        bd->client.icccm.class[0])
144      cfdata->class = strdup(bd->client.icccm.class);
145    if (!cfdata->role &&
146        bd->client.icccm.window_role &&
147        bd->client.icccm.window_role[0])
148      cfdata->role = strdup(bd->client.icccm.window_role);
149    if (!cfdata->title)
150      {
151         const char *title = e_border_name_get(bd);
152         if (title && title[0])
153           cfdata->title = strdup(title);
154      }
155    if (!cfdata->desktop && bd->desktop)
156      cfdata->desktop = strdup(bd->desktop->name);
157
158    if (!cfdata->command &&
159        (bd->client.icccm.command.argc > 0) &&
160        (bd->client.icccm.command.argv))
161      {
162         char buf[4096];
163         int i, j, k;
164
165         buf[0] = 0;
166         k = 0;
167         for (i = 0; i < bd->client.icccm.command.argc; i++)
168           {
169              if (i > 0)
170                {
171                   buf[k] = ' ';
172                   k++;
173                }
174              for (j = 0; bd->client.icccm.command.argv[i][j]; j++)
175                {
176                   if (k >= (int)(sizeof(buf) - 10))
177                     {
178                        buf[k] = 0;
179                        goto done;
180                     }
181                   if ((bd->client.icccm.command.argv[i][j] == ' ') ||
182                       (bd->client.icccm.command.argv[i][j] == '\t') ||
183                       (bd->client.icccm.command.argv[i][j] == '\\') ||
184                       (bd->client.icccm.command.argv[i][j] == '\"') ||
185                       (bd->client.icccm.command.argv[i][j] == '\'') ||
186                       (bd->client.icccm.command.argv[i][j] == '$') ||
187                       (bd->client.icccm.command.argv[i][j] == '%'))
188                     {
189                        buf[k] = '\\';
190                        k++;
191                     }
192                   buf[k] = bd->client.icccm.command.argv[i][j];
193                   k++;
194                }
195           }
196         buf[k] = 0;
197 done:
198         cfdata->command = strdup(buf);
199      }
200
201    if (rem)
202      {
203         if (rem->apply_first_only) cfdata->remember.apply_first_only = 1;
204         if (rem->keep_settings) cfdata->remember.keep_settings = 1;
205
206         if (rem->match & E_REMEMBER_MATCH_NAME)
207           cfdata->remember.match_name = 1;
208         if (rem->match & E_REMEMBER_MATCH_CLASS)
209           cfdata->remember.match_class = 1;
210         if (rem->match & E_REMEMBER_MATCH_TITLE)
211           cfdata->remember.match_title = 1;
212         if (rem->match & E_REMEMBER_MATCH_ROLE)
213           cfdata->remember.match_role = 1;
214         if (rem->match & E_REMEMBER_MATCH_TYPE)
215           cfdata->remember.match_type = 1;
216         if (rem->match & E_REMEMBER_MATCH_TRANSIENT)
217           cfdata->remember.match_transient = 1;
218         if (rem->apply & E_REMEMBER_APPLY_POS)
219           cfdata->remember.apply_pos = 1;
220         if (rem->apply & E_REMEMBER_APPLY_SIZE)
221           cfdata->remember.apply_size = 1;
222         if (rem->apply & E_REMEMBER_APPLY_LAYER)
223           cfdata->remember.apply_layer = 1;
224         if (rem->apply & E_REMEMBER_APPLY_LOCKS)
225           cfdata->remember.apply_locks = 1;
226         if (rem->apply & E_REMEMBER_APPLY_BORDER)
227           cfdata->remember.apply_border = 1;
228         if (rem->apply & E_REMEMBER_APPLY_STICKY)
229           cfdata->remember.apply_sticky = 1;
230         if (rem->apply & E_REMEMBER_APPLY_DESKTOP)
231           cfdata->remember.apply_desktop = 1;
232         if (rem->apply & E_REMEMBER_APPLY_SHADE)
233           cfdata->remember.apply_shade = 1;
234         if (rem->apply & E_REMEMBER_APPLY_FULLSCREEN)
235           cfdata->remember.apply_fullscreen = 1;
236         if (rem->apply & E_REMEMBER_APPLY_ZONE)
237           cfdata->remember.apply_zone = 1;
238         if (rem->apply & E_REMEMBER_APPLY_SKIP_WINLIST)
239           cfdata->remember.apply_skip_winlist = 1;
240         if (rem->apply & E_REMEMBER_APPLY_SKIP_PAGER)
241           cfdata->remember.apply_skip_pager = 1;
242         if (rem->apply & E_REMEMBER_APPLY_SKIP_TASKBAR)
243           cfdata->remember.apply_skip_taskbar = 1;
244         if (rem->apply & E_REMEMBER_APPLY_RUN)
245           cfdata->remember.apply_run = 1;
246         if (rem->apply & E_REMEMBER_APPLY_ICON_PREF)
247           cfdata->remember.apply_icon_pref = 1;
248         if (rem->apply & E_REMEMBER_SET_FOCUS_ON_START)
249           cfdata->remember.set_focus_on_start = 1;
250         if (rem->apply & E_REMEMBER_APPLY_OFFER_RESISTANCE)
251           cfdata->remember.offer_resistance = 1;
252      }
253
254    if (!rem) cfdata->mode = MODE_NOTHING;
255    else cfdata->mode = rem->apply;
256 }
257
258 static void *
259 _create_data(E_Config_Dialog *cfd)
260 {
261    /* Create cfdata - cfdata is a temporary block of config data that this
262     * dialog will be dealing with while configuring. it will be applied to
263     * the running systems/config in the apply methods
264     */
265    E_Config_Dialog_Data *cfdata;
266
267    cfdata = E_NEW(E_Config_Dialog_Data, 1);
268    cfdata->border = cfd->data;
269    cfdata->applied = 1;
270    return cfdata;
271 }
272
273 static void
274 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
275 {
276    /* Free the cfdata */
277    if (cfdata->name) free(cfdata->name);
278    if (cfdata->class) free(cfdata->class);
279    if (cfdata->title) free(cfdata->title);
280    if (cfdata->role) free(cfdata->role);
281    if (cfdata->command) free(cfdata->command);
282    if (cfdata->desktop) free(cfdata->desktop);
283
284    if (!cfdata->applied && cfdata->border->remember)
285      {
286         e_remember_unuse(cfdata->border->remember);
287         e_remember_del(cfdata->border->remember);
288         e_config_save_queue();
289      }
290
291    cfdata->border->border_remember_dialog = NULL;
292    free(cfdata);
293 }
294
295 static void
296 _warning_dialog_show(E_Container *con)
297 {
298    E_Dialog *dia;
299
300    dia = e_dialog_new(con, "E", "_border_remember_error_multi_dialog");
301    e_dialog_title_set(dia, _("Window properties are not a unique match"));
302    e_dialog_text_set
303      (dia,
304      _("You are trying to ask Enlightenment to remember to apply<br>"
305        "properties (such as size, location, border style etc.) to<br>"
306        "a window that <hilight>does not have unique properties</hilight>.<br>"
307        "<br>"
308        "This means it shares Name/Class, Transience, Role etc. properties<br>"
309        "with more than 1 other window on the screen and remembering<br>"
310        "properties for this window will apply to all other windows<br>"
311        "that match these properties.<br>"
312        "<br>"
313        "This is just a warning in case you did not intend this to happen.<br>"
314        "If you did, simply press <hilight>Apply</hilight> or <hilight>OK</hilight> buttons<br>"
315        "and your settings will be accepted. Press <hilight>Cancel</hilight> if you<br>"
316        "are not sure and nothing will be affected.")
317      );
318    e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL);
319    e_win_centered_set(dia->win, 1);
320    e_dialog_show(dia);
321 }
322
323 static int
324 _check_matches(E_Remember *rem, int update)
325 {
326    Eina_List *l;
327    E_Border *bd;
328    const char *title;
329    int n = 0;
330
331    EINA_LIST_FOREACH(e_border_client_list(), l, bd)
332      {
333         int match = rem->match;
334         title = e_border_name_get(bd);
335
336         if ((match & E_REMEMBER_MATCH_NAME) &&
337             (e_util_glob_match(bd->client.icccm.name, rem->name)))
338           match &= ~E_REMEMBER_MATCH_NAME;
339
340         if ((match & E_REMEMBER_MATCH_CLASS) &&
341             (e_util_glob_match(bd->client.icccm.class, rem->class)))
342           match &= ~E_REMEMBER_MATCH_CLASS;
343
344         if ((match & E_REMEMBER_MATCH_TITLE) &&
345             (e_util_glob_match(title, rem->title)))
346           match &= ~E_REMEMBER_MATCH_TITLE;
347
348         if ((match & E_REMEMBER_MATCH_ROLE) &&
349             ((!e_util_strcmp(rem->role, bd->client.icccm.window_role)) ||
350              (e_util_both_str_empty(rem->role, bd->client.icccm.window_role))))
351           match &= ~E_REMEMBER_MATCH_ROLE;
352
353         if ((match & E_REMEMBER_MATCH_TYPE) &&
354             (rem->type == (int)bd->client.netwm.type))
355           match &= ~E_REMEMBER_MATCH_TYPE;
356
357         if ((match & E_REMEMBER_MATCH_TRANSIENT) &&
358             ((rem->transient && bd->client.icccm.transient_for != 0) ||
359              (!rem->transient && (bd->client.icccm.transient_for == 0))))
360           match &= ~E_REMEMBER_MATCH_TRANSIENT;
361
362         if (match == 0) n++;
363
364         if (update)
365           {
366              bd->changed = 1;
367              bd->changes.icon = 1;
368           }
369         else if (n > 1)
370           break;
371      }
372    return n;
373 }
374
375 static int
376 _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
377 {
378    /* Actually take our cfdata settings and apply them in real life */
379    E_Border *bd = cfdata->border;
380    E_Remember *rem = bd->remember;
381
382    if (cfdata->mode == MODE_NOTHING)
383      {
384         if (rem)
385           {
386              e_remember_unuse(rem);
387              e_remember_del(rem);
388           }
389         e_config_save_queue();
390         return 1;
391      }
392
393    if (!rem)
394      {
395         rem = e_remember_new();
396         if (rem)
397           {
398              bd->remember = rem;
399              cfdata->applied = 0;
400           }
401         else
402           return 0;
403      }
404
405    e_remember_default_match_set(rem, cfdata->border);
406
407    if ((!cfdata->warned) && (_check_matches(rem, 0) > 1))
408      {
409         _warning_dialog_show(cfd->con);
410         cfdata->warned = 1;
411         return 0;
412      }
413
414    rem->apply = cfdata->mode;
415    rem->apply_first_only = 0;
416
417    e_remember_use(rem);
418    e_remember_update(bd);
419    cfdata->applied = 1;
420    e_config_save_queue();
421    return 1; /* Apply was OK */
422 }
423
424 static int
425 _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
426 {
427    E_Border *bd = cfdata->border;
428    E_Remember *rem = bd->remember;
429
430    if (!rem)
431      {
432         cfdata->applied = 0;
433         rem = e_remember_new();
434         if (rem)
435           e_remember_use(rem);
436         else
437           return 0;
438      }
439    else
440      {
441         if (rem->name) eina_stringshare_del(rem->name);
442         if (rem->class) eina_stringshare_del(rem->class);
443         if (rem->title) eina_stringshare_del(rem->title);
444         if (rem->role) eina_stringshare_del(rem->role);
445         if (rem->prop.command) eina_stringshare_del(rem->prop.command);
446         if (rem->prop.desktop_file) eina_stringshare_del(rem->prop.desktop_file);
447         rem->name = NULL;
448         rem->class = NULL;
449         rem->title = NULL;
450         rem->role = NULL;
451         rem->prop.command = NULL;
452         rem->prop.desktop_file = NULL;
453      }
454
455    rem->match = 0;
456    rem->apply_first_only = cfdata->remember.apply_first_only;
457
458    if (cfdata->remember.match_name && cfdata->name && cfdata->name[0])
459      {
460         rem->match |= E_REMEMBER_MATCH_NAME;
461         rem->name = eina_stringshare_add(cfdata->name);
462      }
463    if (cfdata->remember.match_class && cfdata->class && cfdata->class[0])
464      {
465         rem->match |= E_REMEMBER_MATCH_CLASS;
466         rem->class = eina_stringshare_add(cfdata->class);
467      }
468    if (cfdata->remember.match_title && cfdata->title && cfdata->title[0])
469      {
470         rem->match |= E_REMEMBER_MATCH_TITLE;
471         rem->title = eina_stringshare_add(cfdata->title);
472      }
473    if (cfdata->remember.match_role && cfdata->role && cfdata->role[0])
474      {
475         rem->match |= E_REMEMBER_MATCH_ROLE;
476         rem->role = eina_stringshare_add(cfdata->role);
477      }
478    if (cfdata->remember.match_type)
479      {
480         rem->match |= E_REMEMBER_MATCH_TYPE;
481         rem->type = bd->client.netwm.type;
482      }
483
484    if (cfdata->remember.match_transient)
485      {
486         rem->match |= E_REMEMBER_MATCH_TRANSIENT;
487         if (bd->client.icccm.transient_for != 0)
488           rem->transient = 1;
489         else
490           rem->transient = 0;
491      }
492
493    if (!rem->match)
494      {
495         E_Dialog *dia;
496
497         dia = e_dialog_new(cfd->con, "E", "_border_remember_error_noprop_dialog");
498         e_dialog_title_set(dia, _("No match properties set"));
499         e_dialog_text_set
500           (dia,
501           _("You are trying to ask Enlightenment to remember to apply<br>"
502             "properties (such as size, location, border style etc.) to<br>"
503             "a window <hilight>without specifying how to remember it</hilight>.<br>"
504             "<br>"
505             "You must specify at least 1 way of remembering this window.")
506           );
507         e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL);
508         e_win_centered_set(dia->win, 1);
509         e_dialog_show(dia);
510         cfdata->border->remember = rem;
511         return 0;
512      }
513
514    /* TODO warn when match doesn't match the current window
515     * (when using globs) */
516
517    if (!cfdata->warned)
518      {
519         if ((!cfdata->remember.apply_first_only) &&
520             (_check_matches(rem, 0) > 1))
521           {
522              _warning_dialog_show(cfd->con);
523              cfdata->warned = 1;
524              return 0;
525           }
526      }
527
528    if (cfdata->command && cfdata->command[0])
529      rem->prop.command = eina_stringshare_add(cfdata->command);
530    if (cfdata->remember.apply_desktop_file && cfdata->desktop)
531      rem->prop.desktop_file = eina_stringshare_add(cfdata->desktop);
532
533    rem->apply = 0;
534    if (cfdata->remember.apply_pos)
535      rem->apply |= E_REMEMBER_APPLY_POS;
536    if (cfdata->remember.apply_size)
537      rem->apply |= E_REMEMBER_APPLY_SIZE;
538    if (cfdata->remember.apply_layer)
539      rem->apply |= E_REMEMBER_APPLY_LAYER;
540    if (cfdata->remember.apply_locks)
541      rem->apply |= E_REMEMBER_APPLY_LOCKS;
542    if (cfdata->remember.apply_border)
543      rem->apply |= E_REMEMBER_APPLY_BORDER;
544    if (cfdata->remember.apply_sticky)
545      rem->apply |= E_REMEMBER_APPLY_STICKY;
546    if (cfdata->remember.apply_desktop)
547      rem->apply |= E_REMEMBER_APPLY_DESKTOP;
548    if (cfdata->remember.apply_shade)
549      rem->apply |= E_REMEMBER_APPLY_SHADE;
550    if (cfdata->remember.apply_fullscreen)
551      rem->apply |= E_REMEMBER_APPLY_FULLSCREEN;
552    if (cfdata->remember.apply_zone)
553      rem->apply |= E_REMEMBER_APPLY_ZONE;
554    if (cfdata->remember.apply_skip_winlist)
555      rem->apply |= E_REMEMBER_APPLY_SKIP_WINLIST;
556    if (cfdata->remember.apply_skip_pager)
557      rem->apply |= E_REMEMBER_APPLY_SKIP_PAGER;
558    if (cfdata->remember.apply_skip_taskbar)
559      rem->apply |= E_REMEMBER_APPLY_SKIP_TASKBAR;
560    if (cfdata->remember.apply_run)
561      rem->apply |= E_REMEMBER_APPLY_RUN;
562    if (cfdata->remember.apply_icon_pref)
563      rem->apply |= E_REMEMBER_APPLY_ICON_PREF;
564    if (cfdata->remember.set_focus_on_start)
565      rem->apply |= E_REMEMBER_SET_FOCUS_ON_START;
566    if (cfdata->remember.offer_resistance)
567      rem->apply |= E_REMEMBER_APPLY_OFFER_RESISTANCE;
568
569    if (!rem->apply && !rem->prop.desktop_file)
570      {
571         e_remember_unuse(rem);
572         e_remember_del(rem);
573         if (cfdata->border->remember)
574           e_config_save_queue();
575         return 1;
576      }
577
578    _check_matches(rem, 1);
579    rem->keep_settings = 0;
580    cfdata->border->remember = rem;
581    e_remember_update(cfdata->border);
582    rem->keep_settings = cfdata->remember.keep_settings;
583
584    cfdata->applied = 1;
585    e_config_save_queue();
586    return 1; /* Apply was OK */
587 }
588
589 /**--GUI--**/
590 static Evas_Object *
591 _basic_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
592 {
593    /* generate the core widget layout for a basic dialog */
594    Evas_Object *o, *ob;
595    E_Radio_Group *rg;
596
597    _clear_data(cfdata);
598    _fill_data(cfdata);
599    o = e_widget_list_add(evas, 0, 0);
600    rg = e_widget_radio_group_new(&(cfdata->mode));
601    ob = e_widget_radio_add(evas, _("Nothing"), MODE_NOTHING, rg);
602    e_widget_list_object_append(o, ob, 1, 1, 0.5);
603    ob = e_widget_radio_add(evas, _("Size and Position"), MODE_GEOMETRY, rg);
604    e_widget_list_object_append(o, ob, 1, 1, 0.5);
605    ob = e_widget_radio_add(evas, _("Locks"), MODE_LOCKS, rg);
606    e_widget_list_object_append(o, ob, 1, 1, 0.5);
607    ob = e_widget_radio_add(evas, _("Size, Position and Locks"), MODE_GEOMETRY_LOCKS, rg);
608    e_widget_list_object_append(o, ob, 1, 1, 0.5);
609    ob = e_widget_radio_add(evas, _("All"), MODE_ALL, rg);
610    e_widget_list_object_append(o, ob, 1, 1, 0.5);
611    return o;
612 }
613
614 static Evas_Object *
615 _advanced_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
616 {
617    /* generate the core widget layout for an advanced dialog */
618    Evas_Object *o, *ob, *of;
619
620    _clear_data(cfdata);
621    _fill_data(cfdata);
622    o = e_widget_toolbook_add(evas, (48 * e_scale), (48 * e_scale));
623
624    of = e_widget_list_add(evas, 0, 0);
625    if (cfdata->name)
626      {
627         ob = e_widget_check_add(evas, _("Window name"),
628                                 &(cfdata->remember.match_name));
629         e_widget_list_object_append(of, ob, 1, 0, 0.5);
630         ob = e_widget_entry_add(evas, &cfdata->name, NULL, NULL, NULL);
631         e_widget_list_object_append(of, ob, 1, 0, 0.5);
632      }
633    else
634      {
635         cfdata->remember.match_name = 0;
636      }
637    if (cfdata->class)
638      {
639         ob = e_widget_check_add(evas, _("Window class"),
640                                 &(cfdata->remember.match_class));
641         e_widget_list_object_append(of, ob, 1, 0, 0.5);
642         ob = e_widget_entry_add(evas, &cfdata->class, NULL, NULL, NULL);
643         e_widget_list_object_append(of, ob, 1, 0, 0.5);
644      }
645    else
646      {
647         cfdata->remember.match_class = 0;
648      }
649    if (cfdata->title)
650      {
651         ob = e_widget_check_add(evas, _("Title"),
652                                 &(cfdata->remember.match_title));
653         e_widget_list_object_append(of, ob, 1, 0, 0.5);
654         ob = e_widget_entry_add(evas, &cfdata->title, NULL, NULL, NULL);
655         e_widget_list_object_append(of, ob, 1, 0, 0.5);
656      }
657    else
658      {
659         cfdata->remember.match_title = 0;
660      }
661    if (cfdata->role)
662      {
663         ob = e_widget_check_add(evas, _("Window Role"),
664                                 &(cfdata->remember.match_role));
665         e_widget_list_object_append(of, ob, 1, 0, 0.5);
666         ob = e_widget_entry_add(evas, &cfdata->role, NULL, NULL, NULL);
667         e_widget_list_object_append(of, ob, 1, 0, 0.5);
668      }
669    else
670      {
671         cfdata->remember.match_role = 0;
672      }
673    if (cfdata->border->client.netwm.type != ECORE_X_WINDOW_TYPE_UNKNOWN)
674      {
675         ob = e_widget_check_add(evas, _("Window type"),
676                                 &(cfdata->remember.match_type));
677         e_widget_list_object_append(of, ob, 1, 0, 0.5);
678      }
679    else
680      {
681         cfdata->remember.match_type = 0;
682      }
683    ob = e_widget_label_add(evas, _("wildcard matches are allowed"));
684    e_widget_list_object_append(of, ob, 1, 0, 0.5);
685    ob = e_widget_check_add(evas, _("Transience"),
686                            &(cfdata->remember.match_transient));
687    e_widget_list_object_append(of, ob, 1, 0, 0.5);
688    e_widget_toolbook_page_append(o, NULL, _("Using"), of, 1, 1, 1, 1, 0.5, 0.0);
689
690
691    of = e_widget_table_add(evas, 0);
692    ob = e_widget_check_add(evas, _("Position"),
693                            &(cfdata->remember.apply_pos));
694    e_widget_table_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 1);
695    ob = e_widget_check_add(evas, _("Size"),
696                            &(cfdata->remember.apply_size));
697    e_widget_table_object_append(of, ob, 0, 1, 1, 1, 1, 1, 1, 1);
698    ob = e_widget_check_add(evas, _("Stacking"),
699                            &(cfdata->remember.apply_layer));
700    e_widget_table_object_append(of, ob, 0, 2, 1, 1, 1, 1, 1, 1);
701    ob = e_widget_check_add(evas, _("Locks"),
702                            &(cfdata->remember.apply_locks));
703    e_widget_table_object_append(of, ob, 0, 3, 1, 1, 1, 1, 1, 1);
704    ob = e_widget_check_add(evas, _("Border style"),
705                            &(cfdata->remember.apply_border));
706    e_widget_table_object_append(of, ob, 0, 4, 1, 1, 1, 1, 1, 1);
707    ob = e_widget_check_add(evas, _("Icon Preference"),
708                            &(cfdata->remember.apply_icon_pref));
709    e_widget_table_object_append(of, ob, 0, 5, 1, 1, 1, 1, 1, 1);
710    ob = e_widget_check_add(evas, _("Stickiness"),
711                            &(cfdata->remember.apply_sticky));
712    e_widget_table_object_append(of, ob, 0, 6, 1, 1, 1, 1, 1, 1);
713    ob = e_widget_check_add(evas, _("Virtual Desktop"),
714                            &(cfdata->remember.apply_desktop));
715    e_widget_table_object_append(of, ob, 1, 0, 1, 1, 1, 1, 1, 1);
716    ob = e_widget_check_add(evas, _("Shaded state"),
717                            &(cfdata->remember.apply_shade));
718    e_widget_table_object_append(of, ob, 1, 1, 1, 1, 1, 1, 1, 1);
719    ob = e_widget_check_add(evas, _("Fullscreen state"),
720                            &(cfdata->remember.apply_fullscreen));
721    e_widget_table_object_append(of, ob, 1, 2, 1, 1, 1, 1, 1, 1);
722    ob = e_widget_check_add(evas, _("Current Screen"),
723                            &(cfdata->remember.apply_zone));
724    e_widget_table_object_append(of, ob, 1, 3, 1, 1, 1, 1, 1, 1);
725    ob = e_widget_check_add(evas, _("Skip Window List"),
726                            &(cfdata->remember.apply_skip_winlist));
727    e_widget_table_object_append(of, ob, 1, 4, 1, 1, 1, 1, 1, 1);
728    ob = e_widget_check_add(evas, _("Skip Pager"),
729                            &(cfdata->remember.apply_skip_pager));
730    e_widget_table_object_append(of, ob, 1, 5, 1, 1, 1, 1, 1, 1);
731    ob = e_widget_check_add(evas, _("Skip Taskbar"),
732                            &(cfdata->remember.apply_skip_taskbar));
733    e_widget_table_object_append(of, ob, 1, 6, 1, 1, 1, 1, 1, 1);
734    ob = e_widget_check_add(evas, _("Offer Resistance"),
735                            &(cfdata->remember.offer_resistance));
736    e_widget_table_object_append(of, ob, 1, 7, 1, 1, 1, 1, 1, 1);
737    ob = e_widget_check_add(evas, _("Application file or name (.desktop)"),
738                            &(cfdata->remember.apply_desktop_file));
739    e_widget_table_object_append(of, ob, 0, 7, 1, 1, 1, 1, 1, 1);
740    ob = e_widget_entry_add(evas, &cfdata->desktop, NULL, NULL, NULL);
741    e_widget_table_object_append(of, ob, 0, 8, 2, 1, 1, 1, 1, 1);
742    e_widget_toolbook_page_append(o, NULL, _("Properties"), of, 1, 1, 1, 1, 0.5, 0.0);
743
744    of = e_widget_table_add(evas, 0);
745    ob = e_widget_check_add(evas, _("Match only one window"),
746                            &(cfdata->remember.apply_first_only));
747    e_widget_table_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 1);
748
749    ob = e_widget_check_add(evas, _("Always focus on start"),
750                            &(cfdata->remember.set_focus_on_start));
751    e_widget_table_object_append(of, ob, 0, 1, 1, 1, 1, 1, 1, 1);
752
753    ob = e_widget_check_add(evas, _("Keep current properties"),
754                            &(cfdata->remember.keep_settings));
755    e_widget_table_object_append(of, ob, 0, 2, 1, 1, 1, 1, 1, 1);
756
757    if (cfdata->command)
758      {
759         ob = e_widget_check_add(evas, _("Start this program on login"),
760                                 &(cfdata->remember.apply_run));
761         e_widget_table_object_append(of, ob, 0, 3, 1, 1, 1, 1, 1, 1);
762      }
763    e_widget_toolbook_page_append(o, NULL, _("Options"), of, 1, 1, 1, 1, 0.5, 0.0);
764    e_widget_toolbook_page_show(o, 0);
765
766    return o;
767 }
768