Add a task to copy configuration files to user's HOME dir from data dir for multi...
[platform/core/uifw/e17.git] / src / modules / conf_display / e_int_config_desk.c
1 #include "e.h"
2
3 static void *_create_data(E_Config_Dialog *cfd);
4 static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
5 static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
6 static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
7 static void _cb_config(void *data, void *data2);
8 static Eina_Bool _cb_bg_change(void *data, int type, void *event);
9
10 struct _E_Config_Dialog_Data 
11 {
12    int con_num;
13    int zone_num;
14    int desk_x;
15    int desk_y;
16    char *bg;
17    char *name;
18 #ifdef _F_USE_DESK_WINDOW_PROFILE_
19    char *profile;
20 #endif
21
22    Evas_Object *preview;
23    Ecore_Event_Handler *hdl;
24 };
25
26 E_Config_Dialog *
27 e_int_config_desk(E_Container *con, const char *params)
28 {
29    E_Config_Dialog *cfd;
30    E_Config_Dialog_View *v;
31    E_Config_Dialog_Data *cfdata;
32    int con_num, zone_num, dx, dy;
33
34    if (!params) return NULL;
35    con_num = zone_num = dx = dy = -1;
36    if (sscanf(params, "%i %i %i %i", &con_num, &zone_num, &dx, &dy) != 4)
37      return NULL;
38    
39    if (e_config_dialog_find("E", "internal/desk")) return NULL;
40
41    v = E_NEW(E_Config_Dialog_View, 1);
42    
43    cfdata = E_NEW(E_Config_Dialog_Data, 1);
44    cfdata->con_num = con_num;
45    cfdata->zone_num = zone_num;
46    cfdata->desk_x = dx;
47    cfdata->desk_y = dy;
48    
49    v->create_cfdata = _create_data;
50    v->free_cfdata = _free_data;
51    v->basic.apply_cfdata = _basic_apply;
52    v->basic.create_widgets = _basic_create;
53    v->override_auto_apply = 1;
54    
55    cfd = e_config_dialog_new(con, _("Desk Settings"), "E", "internal/desk",
56                              "preferences-desktop", 0, v, cfdata);
57    return cfd;
58 }
59
60 static void
61 _fill_data(E_Config_Dialog_Data *cfdata) 
62 {
63    Eina_List *l;
64    const char *bg;
65    char name[40];
66    int ok = 0;
67 #ifdef _F_USE_DESK_WINDOW_PROFILE_
68    E_Config_Desktop_Window_Profile *prof;
69 #endif
70
71    bg = e_bg_file_get(cfdata->con_num, cfdata->zone_num, cfdata->desk_x, cfdata->desk_y);
72    if (!bg)
73      bg = e_theme_edje_file_get("base/theme/backgrounds", "e/desktop/background");
74    cfdata->bg = strdup(bg);
75    
76    for (l = e_config->desktop_names; l; l = l->next) 
77      {
78         E_Config_Desktop_Name *dn;
79         
80         dn = l->data;
81         if (!dn) continue;
82         if (dn->container != cfdata->con_num) continue;
83         if (dn->zone != cfdata->zone_num) continue;
84         if ((dn->desk_x != cfdata->desk_x) || (dn->desk_y != cfdata->desk_y)) 
85           continue;
86         
87         if (dn->name)
88           cfdata->name = strdup(dn->name);
89         ok = 1;
90         break;
91      }
92    if (!ok)
93      {     
94         snprintf(name, sizeof(name), _(e_config->desktop_default_name), cfdata->desk_x, cfdata->desk_y);
95         cfdata->name = strdup(name);
96      }
97
98 #ifdef _F_USE_DESK_WINDOW_PROFILE_
99    EINA_LIST_FOREACH(e_config->desktop_window_profiles, l, prof)
100      {
101         if (!((prof->container == cfdata->con_num) &&
102               (prof->zone == cfdata->zone_num) &&
103               (prof->desk_x == cfdata->desk_x) &&
104               (prof->desk_y == cfdata->desk_y)))
105           continue;
106
107         if (prof->profile)
108           cfdata->profile = strdup(prof->profile);
109         ok = 1;
110         break;
111      }
112
113    if (!ok)
114      cfdata->profile = strdup(e_config->desktop_default_window_profile);
115 #endif
116 }
117
118 static void *
119 _create_data(E_Config_Dialog *cfd) 
120 {
121    E_Config_Dialog_Data *cfdata;
122    
123    cfdata = cfd->data;
124    if (!cfdata) return NULL;
125    _fill_data(cfdata);
126    return cfdata;
127 }
128
129 static void
130 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) 
131 {
132    if (cfdata->hdl)
133      ecore_event_handler_del(cfdata->hdl);
134    if (cfdata->bg)
135      E_FREE(cfdata->bg);
136    if (cfdata->name)
137      E_FREE(cfdata->name);
138 #ifdef _F_USE_DESK_WINDOW_PROFILE_
139    if (cfdata->profile)
140      E_FREE(cfdata->profile);
141 #endif
142    E_FREE(cfdata);
143 }
144
145 static int
146 _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) 
147 {
148    char name[40];
149    
150    if (!cfdata->name[0]) 
151      {
152         snprintf(name, sizeof(name), _(e_config->desktop_default_name), 
153                  cfdata->desk_x, cfdata->desk_y);
154         cfdata->name = strdup(name);
155      }
156
157 #ifdef _F_USE_DESK_WINDOW_PROFILE_
158    if (!cfdata->profile[0]) 
159      cfdata->profile = strdup(e_config->desktop_default_window_profile); 
160 #endif
161
162    e_desk_name_del(cfdata->con_num, cfdata->zone_num, 
163                    cfdata->desk_x, cfdata->desk_y);
164    e_desk_name_add(cfdata->con_num, cfdata->zone_num, 
165                    cfdata->desk_x, cfdata->desk_y, cfdata->name);
166    e_desk_name_update();
167
168 #ifdef _F_USE_DESK_WINDOW_PROFILE_
169    e_desk_window_profile_del(cfdata->con_num, cfdata->zone_num, 
170                              cfdata->desk_x, cfdata->desk_y);
171    e_desk_window_profile_add(cfdata->con_num, cfdata->zone_num, 
172                              cfdata->desk_x, cfdata->desk_y, cfdata->profile);
173    e_desk_window_profile_update();
174 #endif
175
176    e_bg_del(cfdata->con_num, cfdata->zone_num, cfdata->desk_x, cfdata->desk_y);
177    e_bg_add(cfdata->con_num, cfdata->zone_num, 
178             cfdata->desk_x, cfdata->desk_y, cfdata->bg);
179    e_bg_update();
180
181    e_config_save_queue();
182    return 1;
183 }
184
185 static Evas_Object *
186 _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) 
187 {
188    Evas_Object *o, *of, *ob;
189    E_Zone *zone;
190    
191    zone = e_zone_current_get(cfd->con);
192    
193    o = e_widget_list_add(evas, 0, 0);
194
195    of = e_widget_frametable_add(evas, _("Desktop Name"), 0);
196    ob = e_widget_label_add(evas, _("Name:"));
197    e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 0);
198    ob = e_widget_entry_add(evas, &(cfdata->name), NULL, NULL, NULL);
199    e_widget_frametable_object_append(of, ob, 1, 0, 2, 1, 1, 1, 1, 0);
200    e_widget_list_object_append(o, of, 1, 1, 0.5);
201
202 #ifdef _F_USE_DESK_WINDOW_PROFILE_
203    of = e_widget_frametable_add(evas, _("Desktop Window Profile"), 0);
204    ob = e_widget_label_add(evas, _("Profile Name:"));
205    e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 0);
206    ob = e_widget_entry_add(evas, &(cfdata->profile), NULL, NULL, NULL);
207    e_widget_frametable_object_append(of, ob, 1, 0, 2, 1, 1, 1, 1, 0);
208    e_widget_list_object_append(o, of, 1, 1, 0.5);
209 #endif
210    
211    of = e_widget_frametable_add(evas, _("Desktop Wallpaper"), 0);
212    ob = e_widget_preview_add(evas, 240, (240 * zone->h) / zone->w);
213    cfdata->preview = ob;
214    if (cfdata->bg)
215      e_widget_preview_edje_set(ob, cfdata->bg, "e/desktop/background");
216    e_widget_frametable_object_append(of, ob, 0, 0, 3, 1, 1, 1, 1, 0);
217    ob = e_widget_button_add(evas, _("Set"), "configure", 
218                             _cb_config, cfdata, NULL);
219    e_widget_frametable_object_append(of, ob, 1, 1, 1, 1, 1, 1, 1, 0);
220    e_widget_list_object_append(o, of, 1, 1, 0.5);
221
222    if (cfdata->hdl)
223      ecore_event_handler_del(cfdata->hdl);
224    cfdata->hdl = ecore_event_handler_add(E_EVENT_BG_UPDATE, _cb_bg_change, cfdata);
225    
226    return o;
227 }
228
229 static void 
230 _cb_config(void *data, void *data2 __UNUSED__) 
231 {
232    E_Config_Dialog_Data *cfdata;
233    char buf[256];
234    
235    cfdata = data;
236    if (!cfdata) return;
237    snprintf(buf, sizeof(buf), "%i %i %i %i", 
238             cfdata->con_num, cfdata->zone_num, cfdata->desk_x, cfdata->desk_y);
239    e_configure_registry_call("internal/wallpaper_desk", 
240                              e_container_current_get(e_manager_current_get()), 
241                              buf);
242 }
243
244 static Eina_Bool
245 _cb_bg_change(void *data, int type, void *event)
246 {
247    E_Event_Bg_Update *ev;
248    E_Config_Dialog_Data *cfdata;
249    const char *file;
250    
251    if (type != E_EVENT_BG_UPDATE) return ECORE_CALLBACK_PASS_ON;
252    
253    cfdata = data;
254    ev = event;
255    if (ev->container != cfdata->con_num) return ECORE_CALLBACK_PASS_ON;
256    if (ev->zone != cfdata->zone_num) return ECORE_CALLBACK_PASS_ON;
257    if (ev->desk_x != cfdata->desk_x) return ECORE_CALLBACK_PASS_ON;
258    if (ev->desk_y != cfdata->desk_y) return ECORE_CALLBACK_PASS_ON;
259    
260    file = e_bg_file_get(cfdata->con_num, cfdata->zone_num, 
261                         cfdata->desk_x, cfdata->desk_y);
262    E_FREE(cfdata->bg);
263    cfdata->bg = strdup(file);
264    e_widget_preview_edje_set(cfdata->preview, cfdata->bg, 
265                              "e/desktop/background");
266
267    return ECORE_CALLBACK_PASS_ON;
268 }