cb2f4577986c45038adcce0bdf5b755608c983c2
[framework/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    
19    Evas_Object *preview;
20    Ecore_Event_Handler *hdl;
21 };
22
23 E_Config_Dialog *
24 e_int_config_desk(E_Container *con, const char *params)
25 {
26    E_Config_Dialog *cfd;
27    E_Config_Dialog_View *v;
28    E_Config_Dialog_Data *cfdata;
29    int con_num, zone_num, dx, dy;
30
31    if (!params) return NULL;
32    con_num = zone_num = dx = dy = -1;
33    if (sscanf(params, "%i %i %i %i", &con_num, &zone_num, &dx, &dy) != 4)
34      return NULL;
35    
36    if (e_config_dialog_find("E", "internal/desk")) return NULL;
37
38    v = E_NEW(E_Config_Dialog_View, 1);
39    
40    cfdata = E_NEW(E_Config_Dialog_Data, 1);
41    cfdata->con_num = con_num;
42    cfdata->zone_num = zone_num;
43    cfdata->desk_x = dx;
44    cfdata->desk_y = dy;
45    
46    v->create_cfdata = _create_data;
47    v->free_cfdata = _free_data;
48    v->basic.apply_cfdata = _basic_apply;
49    v->basic.create_widgets = _basic_create;
50    v->override_auto_apply = 1;
51    
52    cfd = e_config_dialog_new(con, _("Desk Settings"), "E", "internal/desk",
53                              "preferences-desktop", 0, v, cfdata);
54    return cfd;
55 }
56
57 static void
58 _fill_data(E_Config_Dialog_Data *cfdata) 
59 {
60    Eina_List *l;
61    const char *bg;
62    char name[40];
63    int ok = 0;
64    
65    bg = e_bg_file_get(cfdata->con_num, cfdata->zone_num, cfdata->desk_x, cfdata->desk_y);
66    if (!bg)
67      bg = e_theme_edje_file_get("base/theme/backgrounds", "e/desktop/background");
68    cfdata->bg = strdup(bg);
69    
70    for (l = e_config->desktop_names; l; l = l->next) 
71      {
72         E_Config_Desktop_Name *dn;
73         
74         dn = l->data;
75         if (!dn) continue;
76         if (dn->container != cfdata->con_num) continue;
77         if (dn->zone != cfdata->zone_num) continue;
78         if ((dn->desk_x != cfdata->desk_x) || (dn->desk_y != cfdata->desk_y)) 
79           continue;
80         
81         if (dn->name)
82           cfdata->name = strdup(dn->name);
83         ok = 1;
84         break;
85      }
86    if (!ok)
87      {     
88         snprintf(name, sizeof(name), _(e_config->desktop_default_name), cfdata->desk_x, cfdata->desk_y);
89         cfdata->name = strdup(name);
90      }
91 }
92
93 static void *
94 _create_data(E_Config_Dialog *cfd) 
95 {
96    E_Config_Dialog_Data *cfdata;
97    
98    cfdata = cfd->data;
99    if (!cfdata) return NULL;
100    _fill_data(cfdata);
101    return cfdata;
102 }
103
104 static void
105 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) 
106 {
107    if (cfdata->hdl)
108      ecore_event_handler_del(cfdata->hdl);
109    if (cfdata->bg)
110      E_FREE(cfdata->bg);
111    if (cfdata->name)
112      E_FREE(cfdata->name);
113    E_FREE(cfdata);
114 }
115
116 static int
117 _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) 
118 {
119    char name[40];
120    
121    if (!cfdata->name[0]) 
122      {
123         snprintf(name, sizeof(name), _(e_config->desktop_default_name), 
124                  cfdata->desk_x, cfdata->desk_y);
125         cfdata->name = strdup(name);
126      }
127
128    e_desk_name_del(cfdata->con_num, cfdata->zone_num, 
129                    cfdata->desk_x, cfdata->desk_y);
130    e_desk_name_add(cfdata->con_num, cfdata->zone_num, 
131                    cfdata->desk_x, cfdata->desk_y, cfdata->name);
132    e_desk_name_update();
133    
134    e_bg_del(cfdata->con_num, cfdata->zone_num, cfdata->desk_x, cfdata->desk_y);
135    e_bg_add(cfdata->con_num, cfdata->zone_num, 
136             cfdata->desk_x, cfdata->desk_y, cfdata->bg);
137    e_bg_update();
138
139    e_config_save_queue();
140    return 1;
141 }
142
143 static Evas_Object *
144 _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) 
145 {
146    Evas_Object *o, *of, *ob;
147    E_Zone *zone;
148    
149    zone = e_zone_current_get(cfd->con);
150    
151    o = e_widget_list_add(evas, 0, 0);
152
153    of = e_widget_frametable_add(evas, _("Desktop Name"), 0);
154    ob = e_widget_label_add(evas, _("Name:"));
155    e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 0);
156    ob = e_widget_entry_add(evas, &(cfdata->name), NULL, NULL, NULL);
157    e_widget_frametable_object_append(of, ob, 1, 0, 2, 1, 1, 1, 1, 0);
158    e_widget_list_object_append(o, of, 1, 1, 0.5);
159    
160    of = e_widget_frametable_add(evas, _("Desktop Wallpaper"), 0);
161    ob = e_widget_preview_add(evas, 240, (240 * zone->h) / zone->w);
162    cfdata->preview = ob;
163    if (cfdata->bg)
164      e_widget_preview_edje_set(ob, cfdata->bg, "e/desktop/background");
165    e_widget_frametable_object_append(of, ob, 0, 0, 3, 1, 1, 1, 1, 0);
166    ob = e_widget_button_add(evas, _("Set"), "configure", 
167                             _cb_config, cfdata, NULL);
168    e_widget_frametable_object_append(of, ob, 1, 1, 1, 1, 1, 1, 1, 0);
169    e_widget_list_object_append(o, of, 1, 1, 0.5);
170
171    if (cfdata->hdl)
172      ecore_event_handler_del(cfdata->hdl);
173    cfdata->hdl = ecore_event_handler_add(E_EVENT_BG_UPDATE, _cb_bg_change, cfdata);
174    
175    return o;
176 }
177
178 static void 
179 _cb_config(void *data, void *data2 __UNUSED__) 
180 {
181    E_Config_Dialog_Data *cfdata;
182    char buf[256];
183    
184    cfdata = data;
185    if (!cfdata) return;
186    snprintf(buf, sizeof(buf), "%i %i %i %i", 
187             cfdata->con_num, cfdata->zone_num, cfdata->desk_x, cfdata->desk_y);
188    e_configure_registry_call("internal/wallpaper_desk", 
189                              e_container_current_get(e_manager_current_get()), 
190                              buf);
191 }
192
193 static Eina_Bool
194 _cb_bg_change(void *data, int type, void *event)
195 {
196    E_Event_Bg_Update *ev;
197    E_Config_Dialog_Data *cfdata;
198    const char *file;
199    
200    if (type != E_EVENT_BG_UPDATE) return ECORE_CALLBACK_PASS_ON;
201    
202    cfdata = data;
203    ev = event;
204    if (ev->container != cfdata->con_num) return ECORE_CALLBACK_PASS_ON;
205    if (ev->zone != cfdata->zone_num) return ECORE_CALLBACK_PASS_ON;
206    if (ev->desk_x != cfdata->desk_x) return ECORE_CALLBACK_PASS_ON;
207    if (ev->desk_y != cfdata->desk_y) return ECORE_CALLBACK_PASS_ON;
208    
209    file = e_bg_file_get(cfdata->con_num, cfdata->zone_num, 
210                         cfdata->desk_x, cfdata->desk_y);
211    E_FREE(cfdata->bg);
212    cfdata->bg = strdup(file);
213    e_widget_preview_edje_set(cfdata->preview, cfdata->bg, 
214                              "e/desktop/background");
215
216    return ECORE_CALLBACK_PASS_ON;
217 }