c2ea25ef6d953851c3a0b41981c5daef989b7361
[framework/uifw/e17.git] / src / modules / conf_theme / e_int_config_wallpaper.c
1 #include "e.h"
2 #include "e_mod_main.h"
3
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 void _fill_data(E_Config_Dialog_Data *cfdata);
7 static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
8 static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
9 static int _adv_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
10 static Evas_Object *_adv_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
11
12 static E_Config_Dialog *_e_int_config_wallpaper_desk(E_Container *con, int con_num, int zone_num, int desk_x, int desk_y);
13
14 static void _cb_button_up(void *data1, void *data2);
15 static void _cb_files_changed(void *data, Evas_Object *obj, void *event_info);
16 static void _cb_files_selection_change(void *data, Evas_Object *obj, void *event_info);
17 static void _cb_files_files_changed(void *data, Evas_Object *obj, void *event_info);
18 static void _cb_files_files_deleted(void *data, Evas_Object *obj, void *event_info);
19 static void _cb_theme_wallpaper(void *data, Evas_Object *obj, void *event_info);
20 static void _cb_dir(void *data, Evas_Object *obj, void *event_info);
21 static void _cb_import(void *data1, void *data2);
22
23 #define E_CONFIG_WALLPAPER_ALL 0
24 #define E_CONFIG_WALLPAPER_DESK 1
25 #define E_CONFIG_WALLPAPER_SCREEN 2
26
27 struct _E_Config_Wallpaper
28 {
29    int specific_config;
30    int con_num, zone_num;
31    int desk_x, desk_y;
32 };
33
34 struct _E_Config_Dialog_Data
35 {
36    E_Config_Dialog *cfd;
37    Evas_Object *o_fm;
38    Evas_Object *o_up_button;
39    Evas_Object *o_preview;
40    Evas_Object *o_theme_bg;
41    Evas_Object *o_personal;
42    Evas_Object *o_system;
43    int fmdir, use_theme_bg;
44    char *bg;
45
46    /* advanced */
47    int all_this_desk_screen;
48
49    /* dialogs */
50    E_Win *win_import;
51 #ifdef HAVE_EXCHANGE
52    E_Dialog *dia_web;
53 #endif
54 };
55
56 E_Config_Dialog *
57 e_int_config_wallpaper(E_Container *con, const char *params __UNUSED__)
58 {
59    return _e_int_config_wallpaper_desk(con, -1, -1, -1, -1);
60 }
61
62 E_Config_Dialog *
63 e_int_config_wallpaper_desk(E_Container *con, const char *params)
64 {
65    int con_num, zone_num, desk_x, desk_y;
66
67    if (!params) return NULL;
68    con_num = zone_num = desk_x = desk_y = -1;
69    if (sscanf(params, "%i %i %i %i", &con_num, &zone_num, &desk_x, &desk_y) != 4)
70      return NULL;
71    return _e_int_config_wallpaper_desk(con, con_num, zone_num, desk_x, desk_y);
72 }
73
74 static E_Config_Dialog *
75 _e_int_config_wallpaper_desk(E_Container *con, int con_num, int zone_num, int desk_x, int desk_y)
76 {
77    E_Config_Dialog *cfd;
78    E_Config_Dialog_View *v;
79    E_Config_Wallpaper *cw;
80
81    if (e_config_dialog_find("E", "appearance/wallpaper")) return NULL;
82    v = E_NEW(E_Config_Dialog_View, 1);
83    cw = E_NEW(E_Config_Wallpaper, 1);
84
85    v->create_cfdata = _create_data;
86    v->free_cfdata = _free_data;
87    v->basic.apply_cfdata = _basic_apply;
88    v->basic.create_widgets = _basic_create;
89
90    if (!(con_num == -1 && zone_num == -1 && desk_x == -1 && desk_y == -1))
91      cw->specific_config = 1;
92    else
93      {
94         v->advanced.apply_cfdata   = _adv_apply;
95         v->advanced.create_widgets = _adv_create;
96      }
97
98    v->override_auto_apply = 1;
99
100    cw->con_num = con_num;
101    cw->zone_num = zone_num;
102    cw->desk_x = desk_x;
103    cw->desk_y = desk_y;
104
105    cfd = e_config_dialog_new(con, _("Wallpaper Settings"), "E", 
106                              "appearance/wallpaper",
107                              "preferences-desktop-wallpaper", 0, v, cw);
108    return cfd;
109 }
110
111 void
112 e_int_config_wallpaper_update(E_Config_Dialog *dia, char *file)
113 {
114    E_Config_Dialog_Data *cfdata;
115    char path[PATH_MAX];
116
117    cfdata = dia->cfdata;
118    cfdata->fmdir = 1;
119    e_widget_radio_toggle_set(cfdata->o_personal, 1);
120    e_user_dir_concat_static(path, "backgrounds");
121    E_FREE(cfdata->bg);
122    cfdata->bg = strdup(file);
123    cfdata->use_theme_bg = 0;
124    if (cfdata->o_theme_bg)
125      e_widget_check_checked_set(cfdata->o_theme_bg, cfdata->use_theme_bg);
126    if (cfdata->o_fm) e_widget_flist_path_set(cfdata->o_fm, path, "/");
127    if (cfdata->o_preview)
128      e_widget_preview_edje_set(cfdata->o_preview, cfdata->bg, 
129                                "e/desktop/background");
130    if (cfdata->o_fm) e_widget_change(cfdata->o_fm);
131 }
132
133 void
134 e_int_config_wallpaper_import_done(E_Config_Dialog *dia)
135 {
136    E_Config_Dialog_Data *cfdata;
137
138    cfdata = dia->cfdata;
139    cfdata->win_import = NULL;
140 }
141
142 #ifdef HAVE_EXCHANGE
143 void
144 e_int_config_wallpaper_web_done(E_Config_Dialog *dia)
145 {
146    E_Config_Dialog_Data *cfdata;
147
148    cfdata = dia->cfdata;
149    cfdata->dia_web = NULL;
150 }
151 #endif
152
153 static void
154 _cb_button_up(void *data1, void *data2 __UNUSED__)
155 {
156    E_Config_Dialog_Data *cfdata;
157
158    cfdata = data1;
159    if (cfdata->o_fm) e_widget_flist_parent_go(cfdata->o_fm);
160 }
161
162 static void
163 _cb_files_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
164 {
165    E_Config_Dialog_Data *cfdata;
166
167    if (!(cfdata = data)) return;
168    if (!cfdata->o_fm) return;
169    if (cfdata->o_up_button) 
170      e_widget_disabled_set(cfdata->o_up_button, 
171                            !e_widget_flist_has_parent_get(cfdata->o_fm));
172 }
173
174 static void
175 _cb_files_selection_change(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
176 {
177    E_Config_Dialog_Data *cfdata;
178    Eina_List *selected;
179    E_Fm2_Icon_Info *ici;
180    const char *realpath;
181    char buf[PATH_MAX];
182
183    cfdata = data;
184    if (!cfdata->o_fm) return;
185    if (!(selected = e_widget_flist_selected_list_get(cfdata->o_fm))) return;
186    ici = selected->data;
187    realpath = e_widget_flist_real_path_get(cfdata->o_fm);
188    if (!strcmp(realpath, "/"))
189      snprintf(buf, sizeof(buf), "/%s", ici->file);
190    else
191      snprintf(buf, sizeof(buf), "%s/%s", realpath, ici->file);
192    eina_list_free(selected);
193    if (ecore_file_is_dir(buf)) return;
194
195    E_FREE(cfdata->bg);
196
197    cfdata->bg = strdup(buf);
198    if (cfdata->o_preview)
199      e_widget_preview_edje_set(cfdata->o_preview, buf, "e/desktop/background");
200    if (cfdata->o_theme_bg)
201      e_widget_check_checked_set(cfdata->o_theme_bg, 0);
202    cfdata->use_theme_bg = 0;
203    e_widget_change(cfdata->o_fm);
204 }
205
206 static void
207 _cb_files_files_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
208 {
209    E_Config_Dialog_Data *cfdata;
210    const char *p = NULL;
211    char buf[PATH_MAX];
212    size_t len;
213
214    cfdata = data;
215    if ((!cfdata->bg) || (!cfdata->o_fm)) return;
216    p = e_widget_flist_real_path_get(cfdata->o_fm);
217    if (p)
218      {
219         if (strncmp(p, cfdata->bg, strlen(p))) return;
220      }
221    else return;
222
223    len = e_user_dir_concat_static(buf, "backgrounds");
224    if (!strncmp(cfdata->bg, buf, len))
225      p = cfdata->bg + len + 1;
226    else
227      {
228         len = e_prefix_data_concat_static(buf, "data/backgrounds");
229         if (!strncmp(cfdata->bg, buf, len))
230           p = cfdata->bg + len + 1;
231         else
232           p = cfdata->bg;
233      }
234
235    e_widget_flist_select_set(cfdata->o_fm, p, 1);
236    e_widget_flist_file_show(cfdata->o_fm, p);
237 }
238
239 static void
240 _cb_files_files_deleted(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) 
241 {
242    E_Config_Dialog_Data *cfdata;
243    Eina_List *sel, *all, *n;
244    E_Fm2_Icon_Info *ici, *ic;
245
246    cfdata = data;
247    if ((!cfdata->bg) || (!cfdata->o_fm)) return;
248
249    if (!(all = e_widget_flist_all_list_get(cfdata->o_fm))) return;
250    if (!(sel = e_widget_flist_selected_list_get(cfdata->o_fm))) return;
251
252    ici = sel->data;
253    all = eina_list_data_find_list(all, ici);
254    n = eina_list_next(all);
255    if (!n) 
256      {
257         n = eina_list_prev(all);
258         if (!n) return;
259      }
260
261    if (!(ic = n->data)) return;
262
263    e_widget_flist_select_set(cfdata->o_fm, ic->file, 1);
264    e_widget_flist_file_show(cfdata->o_fm, ic->file);
265
266    eina_list_free(n);
267
268    evas_object_smart_callback_call(cfdata->o_fm, "selection_change", cfdata);
269 }
270
271 static void
272 _cb_theme_wallpaper(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
273 {
274    E_Config_Dialog_Data *cfdata;
275    const char *f;
276
277    cfdata = data;
278    if (cfdata->use_theme_bg)
279      {
280         f = e_theme_edje_file_get("base/theme/backgrounds", 
281                                   "e/desktop/background");
282         E_FREE(cfdata->bg);
283         cfdata->bg = strdup(f);
284         if (cfdata->o_preview)
285           e_widget_preview_edje_set(cfdata->o_preview, f, 
286                                     "e/desktop/background");
287      }
288    else
289      {
290         evas_object_smart_callback_call(cfdata->o_fm, "selection_change", 
291                                         cfdata);
292         if (cfdata->bg)
293           {
294              if (cfdata->o_preview)
295                e_widget_preview_edje_set(cfdata->o_preview, cfdata->bg, 
296                                          "e/desktop/background");
297           }
298      }
299 }
300
301 static void
302 _cb_dir(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
303 {
304    E_Config_Dialog_Data *cfdata;
305    char path[PATH_MAX];
306
307    cfdata = data;
308    if (cfdata->fmdir == 1)
309      e_prefix_data_concat_static(path, "data/backgrounds");
310    else
311      e_user_dir_concat_static(path, "backgrounds");
312    e_widget_flist_path_set(cfdata->o_fm, path, "/");
313 }
314
315 static void
316 _cb_import(void *data1, void *data2 __UNUSED__)
317 {
318    E_Config_Dialog_Data *cfdata;
319
320    cfdata = data1;
321    if (cfdata->win_import) 
322      e_win_raise(cfdata->win_import);
323    else 
324      cfdata->win_import = e_int_config_wallpaper_fsel(cfdata->cfd);
325 }
326
327 #ifdef HAVE_EXCHANGE
328 static void
329 _cb_web(void *data1, void *data2 __UNUSED__)
330 {
331    E_Config_Dialog_Data *cfdata;
332
333    cfdata = data1;
334    if (cfdata->dia_web)
335       e_win_raise(cfdata->dia_web->win);
336    else
337       cfdata->dia_web = e_int_config_wallpaper_web(cfdata->cfd);   
338 }
339 #endif   
340
341 static void
342 _fill_data(E_Config_Dialog_Data *cfdata)
343 {
344    E_Config_Wallpaper *cw;
345    const E_Config_Desktop_Background *cfbg;
346    char path[PATH_MAX];
347
348    cw = cfdata->cfd->data;
349    if (cw->specific_config)
350      {
351         const char *bg;
352
353         /* specific config passed in. set for that only */
354         bg = e_bg_file_get(cw->con_num, cw->zone_num, cw->desk_x, cw->desk_y);
355         if (bg) cfdata->bg = strdup(bg);
356      }
357    else
358      {
359         /* get current desk. advanced mode allows selecting all, screen or desk */
360         E_Container *c;
361         E_Zone *z;
362         E_Desk *d;
363
364         c = e_container_current_get(e_manager_current_get());
365         z = e_zone_current_get(c);
366         d = e_desk_current_get(z);
367
368         cfbg = e_bg_config_get(c->num, z->id, d->x, d->y);
369         /* if we have a config for this bg, use it. */
370         if (cfbg)
371           {
372              if (cfbg->container >= 0 && cfbg->zone >= 0)
373                {
374                   if (cfbg->desk_x >= 0 && cfbg->desk_y >= 0)
375                     cfdata->all_this_desk_screen = E_CONFIG_WALLPAPER_DESK;
376                   else
377                     cfdata->all_this_desk_screen = E_CONFIG_WALLPAPER_SCREEN;
378                }
379              E_FREE(cfdata->bg);
380              cfdata->bg = strdup(cfbg->file);
381           }
382      }
383
384    if ((!cfdata->bg) && (e_config->desktop_default_background)) 
385      cfdata->bg = strdup(e_config->desktop_default_background);
386
387    if (cfdata->bg)
388      {
389         const char *f;
390         size_t len;
391
392         f = e_theme_edje_file_get("base/theme/backgrounds", 
393                                   "e/desktop/background");
394         if (!strcmp(cfdata->bg, f)) cfdata->use_theme_bg = 1;
395         len = e_prefix_data_concat_static(path, "data/backgrounds");
396         if (!strncmp(cfdata->bg, path, len)) cfdata->fmdir = 1;
397      }
398    else
399      cfdata->use_theme_bg = 1;
400 }
401
402 static void *
403 _create_data(E_Config_Dialog *cfd)
404 {
405    E_Config_Dialog_Data *cfdata;
406
407    cfdata = E_NEW(E_Config_Dialog_Data, 1);
408    cfd->cfdata = cfdata;
409    cfdata->cfd = cfd;
410    _fill_data(cfdata);
411    return cfdata;
412 }
413
414 static void
415 _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
416 {
417    if (cfdata->win_import) 
418      e_int_config_wallpaper_fsel_del(cfdata->win_import);
419 #ifdef HAVE_EXCHANGE
420    if (cfdata->dia_web)
421      e_int_config_wallpaper_web_del(cfdata->dia_web);
422 #endif   
423    E_FREE(cfdata->bg);
424    E_FREE(cfd->data);
425    E_FREE(cfdata);
426 }
427
428 static Evas_Object *
429 _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
430 {
431    Evas_Object *o, *rt, *ot;
432    Evas_Object *ow, *oa;
433    E_Zone *zone = NULL;
434    E_Radio_Group *rg;
435    char path[PATH_MAX];
436    int mw, mh, online;
437    const char *f;
438
439    online = ecore_file_download_protocol_available("http://");
440
441    zone = e_zone_current_get(cfd->con);
442    o = e_widget_list_add(evas, 0, 1);
443
444    rg = e_widget_radio_group_new(&(cfdata->fmdir));
445    ot = e_widget_table_add(evas, 0);
446    rt = e_widget_table_add(evas, 1);
447
448    /* create dir radios */
449    ow = e_widget_radio_add(evas, _("Personal"), 0, rg);
450    cfdata->o_personal = ow;
451    evas_object_smart_callback_add(ow, "changed", _cb_dir, cfdata);
452    e_widget_table_object_append(rt, ow, 0, 0, 1, 1, 1, 1, 0, 0);
453    ow = e_widget_radio_add(evas, _("System"), 1, rg);
454    cfdata->o_system = ow;
455    evas_object_smart_callback_add(ow, "changed", _cb_dir, cfdata);
456    e_widget_table_object_append(rt, ow, 1, 0, 1, 1, 1, 1, 0, 0);
457    e_widget_table_object_append(ot, rt, 0, 0, 1, 1, 0, 0, 0, 0);
458
459    ow = e_widget_button_add(evas, _("Go up a Directory"), "go-up",
460                             _cb_button_up, cfdata, NULL);
461    cfdata->o_up_button = ow;
462    e_widget_table_object_append(ot, ow, 0, 1, 1, 1, 0, 0, 0, 0);
463
464    if (cfdata->fmdir == 1)
465      e_prefix_data_concat_static(path, "data/backgrounds");
466    else
467      e_user_dir_concat_static(path, "backgrounds");
468
469    ow = e_widget_flist_add(evas);
470    cfdata->o_fm = ow;
471    evas_object_smart_callback_add(ow, "dir_changed",
472                                   _cb_files_changed, cfdata);
473    evas_object_smart_callback_add(ow, "selection_change",
474                                   _cb_files_selection_change, cfdata);
475    evas_object_smart_callback_add(ow, "changed", 
476                                   _cb_files_files_changed, cfdata);
477    evas_object_smart_callback_add(ow, "files_deleted",
478                                   _cb_files_files_deleted, cfdata);
479    e_widget_flist_path_set(ow, path, "/");
480
481    e_widget_size_min_set(ow, 160, 160);
482    e_widget_table_object_append(ot, ow, 0, 2, 1, 1, 1, 1, 1, 1);
483    e_widget_list_object_append(o, ot, 1, 1, 0.0);
484
485    ot = e_widget_table_add(evas, 0);
486    ow = e_widget_check_add(evas, _("Use Theme Wallpaper"), 
487                            &cfdata->use_theme_bg);
488    cfdata->o_theme_bg = ow;
489    evas_object_smart_callback_add(ow, "changed", _cb_theme_wallpaper, cfdata);
490    e_widget_table_object_append(ot, ow, 0, 0, 2 + online, 1, 1, 0, 0, 0);
491    ow = e_widget_button_add(evas, _("Picture..."), "folder-image",
492                             _cb_import, cfdata, NULL);
493    e_widget_table_object_append(ot, ow, 0, 1, 1, 1, 1, 0, 0, 0);
494
495 #ifdef HAVE_EXCHANGE
496    if (online)
497      {
498         ow = e_widget_button_add(evas, _("Online..."), "network-website",
499                                  _cb_web, cfdata, NULL);
500         e_widget_table_object_append(ot, ow, 2, 1, 1, 1, 1, 0, 0, 0);
501      }
502 #endif
503    
504    mw = 320;
505    mh = (320 * zone->h) / zone->w;
506    oa = e_widget_aspect_add(evas, mw, mh);
507    ow = e_widget_preview_add(evas, mw, mh);
508    cfdata->o_preview = ow;
509    if (cfdata->bg)
510      f = cfdata->bg;
511    else
512      f = e_theme_edje_file_get("base/theme/backgrounds", "e/desktop/background");
513    e_widget_preview_edje_set(ow, f, "e/desktop/background");
514    e_widget_aspect_child_set(oa, ow);
515    evas_object_show(ow);
516    evas_object_show(oa);
517    e_widget_table_object_append(ot, oa, 0, 2, 2 + online, 1, 1, 1, 1, 1);
518    e_widget_list_object_append(o, ot, 1, 1, 0.5);
519    e_dialog_resizable_set(cfd->dia, 1);
520    return o;
521 }
522
523 static int
524 _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
525 {
526    E_Config_Wallpaper *cw;
527
528    cw = cfd->data;
529    if (cw->specific_config)
530      {
531         /* update a specific config */
532         e_bg_del(cw->con_num, cw->zone_num, cw->desk_x, cw->desk_y);
533         e_bg_add(cw->con_num, cw->zone_num, cw->desk_x, cw->desk_y, cfdata->bg);
534      }
535    else
536      {
537         /* set the default and nuke individual configs */
538         while (e_config->desktop_backgrounds)
539           {
540              E_Config_Desktop_Background *cfbg;
541
542              cfbg = e_config->desktop_backgrounds->data;
543              e_bg_del(cfbg->container, cfbg->zone, cfbg->desk_x, cfbg->desk_y);
544           }
545         if ((cfdata->use_theme_bg) || (!cfdata->bg))
546           e_bg_default_set(NULL);
547         else
548           e_bg_default_set(cfdata->bg);
549
550         cfdata->all_this_desk_screen = 0;
551      }
552
553    e_bg_update();
554    e_config_save_queue();
555    return 1;
556 }
557
558 static Evas_Object *
559 _adv_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
560 {
561    Evas_Object *o, *rt, *ot;
562    Evas_Object *ow, *of, *oa;
563    E_Zone *zone = NULL;
564    E_Radio_Group *rg;
565    char path[PATH_MAX];
566    int mw, mh, online;
567    const char *f;
568
569    online = ecore_file_download_protocol_available("http://");
570
571    zone = e_zone_current_get(cfd->con);
572    o = e_widget_list_add(evas, 0, 1);
573
574    rg = e_widget_radio_group_new(&(cfdata->fmdir));
575    ot = e_widget_table_add(evas, 0);
576    rt = e_widget_table_add(evas, 1);
577
578    /* create dir radios */
579    ow = e_widget_radio_add(evas, _("Personal"), 0, rg);
580    cfdata->o_personal = ow;
581    evas_object_smart_callback_add(ow, "changed", _cb_dir, cfdata);
582    e_widget_table_object_append(rt, ow, 0, 0, 1, 1, 1, 1, 0, 0);
583    ow = e_widget_radio_add(evas, _("System"), 1, rg);
584    cfdata->o_system = ow;
585    evas_object_smart_callback_add(ow, "changed", _cb_dir, cfdata);
586    e_widget_table_object_append(rt, ow, 1, 0, 1, 1, 1, 1, 0, 0);
587    e_widget_table_object_append(ot, rt, 0, 0, 1, 1, 0, 0, 0, 0);
588
589    ow = e_widget_button_add(evas, _("Go up a Directory"), "go-up",
590                             _cb_button_up, cfdata, NULL);
591    cfdata->o_up_button = ow;
592    e_widget_table_object_append(ot, ow, 0, 1, 1, 1, 0, 0, 0, 0);
593
594    if (cfdata->fmdir == 1)
595      e_prefix_data_concat_static(path, "data/backgrounds");
596    else
597      e_user_dir_concat_static(path, "backgrounds");
598
599    ow = e_widget_flist_add(evas);
600    cfdata->o_fm = ow;
601    evas_object_smart_callback_add(ow, "dir_changed",
602                                   _cb_files_changed, cfdata);
603    evas_object_smart_callback_add(ow, "selection_change",
604                                   _cb_files_selection_change, cfdata);
605    evas_object_smart_callback_add(ow, "changed", 
606                                   _cb_files_files_changed, cfdata);
607    e_widget_flist_path_set(ow, path, "/");
608
609    e_widget_size_min_set(ow, 160, 160);
610    e_widget_table_object_append(ot, ow, 0, 2, 1, 1, 1, 1, 1, 1);
611    e_widget_list_object_append(o, ot, 1, 1, 0.0);
612
613    ot = e_widget_table_add(evas, 0);
614    ow = e_widget_check_add(evas, _("Use Theme Wallpaper"), 
615                            &cfdata->use_theme_bg);
616    cfdata->o_theme_bg = ow;
617    evas_object_smart_callback_add(ow, "changed", _cb_theme_wallpaper, cfdata);
618    e_widget_table_object_append(ot, ow, 0, 0, 2 + online, 1, 1, 0, 0, 0);
619    ow = e_widget_button_add(evas, _("Picture..."), "folder-image",
620                             _cb_import, cfdata, NULL);
621    e_widget_table_object_append(ot, ow, 0, 1, 1, 1, 1, 0, 0, 0);
622
623 #ifdef HAVE_EXCHANGE
624    if (online)
625      {
626         ow = e_widget_button_add(evas, _("Online..."), "network-website",
627                                  _cb_web, cfdata, NULL);
628         e_widget_table_object_append(ot, ow, 2, 1, 1, 1, 1, 0, 0, 0);
629      }
630 #endif
631    
632    mw = 320;
633    mh = (320 * zone->h) / zone->w;
634    oa = e_widget_aspect_add(evas, mw, mh);
635    ow = e_widget_preview_add(evas, mw, mh);
636    cfdata->o_preview = ow;
637    if (cfdata->bg)
638      f = cfdata->bg;
639    else
640      f = e_theme_edje_file_get("base/theme/backgrounds", "e/desktop/background");
641    e_widget_preview_edje_set(ow, f, "e/desktop/background");
642    e_widget_aspect_child_set(oa, ow);
643    e_widget_table_object_append(ot, oa, 0, 2, 2 + online, 1, 1, 1, 1, 1);
644
645    rg = e_widget_radio_group_new(&(cfdata->all_this_desk_screen));
646    of = e_widget_frametable_add(evas, _("Where to place the Wallpaper"), 0);
647    ow = e_widget_radio_add(evas, _("All Desktops"), E_CONFIG_WALLPAPER_ALL, rg);
648    e_widget_frametable_object_append(of, ow, 0, 0, 1, 1, 1, 0, 1, 0);
649    ow = e_widget_radio_add(evas, _("This Desktop"), E_CONFIG_WALLPAPER_DESK, rg);
650    e_widget_frametable_object_append(of, ow, 0, 1, 1, 1, 1, 0, 1, 0);
651    ow = e_widget_radio_add(evas, _("This Screen"), E_CONFIG_WALLPAPER_SCREEN, rg);
652    if (!(e_util_container_zone_number_get(0, 1) ||
653          (e_util_container_zone_number_get(1, 0))))
654      e_widget_disabled_set(ow, 1);
655    e_widget_frametable_object_append(of, ow, 0, 2, 1, 1, 1, 0, 1, 0);
656    e_widget_table_object_append(ot, of, 0, 3, 2 + online, 1, 1, 1, 1, 0);
657
658    e_widget_list_object_append(o, ot, 1, 1, 0.5);
659    e_dialog_resizable_set(cfd->dia, 1);
660    return o;
661 }
662
663 static int
664 _adv_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
665 {
666    Eina_List *fl = NULL, *l;
667    E_Zone *z;
668    E_Desk *d;
669
670    if (!(z = e_zone_current_get(cfdata->cfd->con))) return 0;
671    if (!(d = e_desk_current_get(z))) return 0;
672    if (cfdata->use_theme_bg)
673      {
674         while (e_config->desktop_backgrounds)
675           {
676              E_Config_Desktop_Background *cfbg;
677
678              cfbg = e_config->desktop_backgrounds->data;
679              e_bg_del(cfbg->container, cfbg->zone, cfbg->desk_x, cfbg->desk_y);
680           }
681         e_bg_default_set(NULL);
682      }
683    else
684      {
685         if (cfdata->all_this_desk_screen == E_CONFIG_WALLPAPER_ALL)
686           {
687              while (e_config->desktop_backgrounds)
688                {
689                   E_Config_Desktop_Background *cfbg;
690
691                   cfbg = e_config->desktop_backgrounds->data;
692                   e_bg_del(cfbg->container, cfbg->zone, cfbg->desk_x, cfbg->desk_y);
693                }
694              e_bg_default_set(cfdata->bg);
695           }
696         else if (cfdata->all_this_desk_screen == E_CONFIG_WALLPAPER_DESK)
697           {
698              e_bg_del(z->container->num, z->id, d->x, d->y);
699              e_bg_del(z->container->num, -1, d->x, d->y);
700              e_bg_del(-1, z->id, d->x, d->y);
701              e_bg_del(-1, -1, d->x, d->y);
702              e_bg_add(z->container->num, z->id, d->x, d->y, cfdata->bg);
703           }
704         else if (cfdata->all_this_desk_screen == E_CONFIG_WALLPAPER_SCREEN)
705           {
706              for (l = e_config->desktop_backgrounds; l; l = l->next)
707                {
708                   E_Config_Desktop_Background *cfbg;
709
710                   cfbg = l->data;
711                   if ((cfbg->container == (int)z->container->num) &&
712                       (cfbg->zone == z->id))
713                     fl = eina_list_append(fl, cfbg);
714                }
715              while (fl)
716                {
717                   E_Config_Desktop_Background *cfbg;
718
719                   cfbg = fl->data;
720                   e_bg_del(cfbg->container, cfbg->zone, cfbg->desk_x, 
721                            cfbg->desk_y);
722                   fl = eina_list_remove_list(fl, fl);
723                }
724              e_bg_add(z->container->num, z->id, -1, -1, cfdata->bg);
725           }
726      }
727    e_bg_update();
728    e_config_save_queue();
729    return 1;
730 }