Tizen 2.1 release
[platform/core/uifw/e17.git] / src / modules / conf_window_manipulation / e_int_config_window_geometry.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(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
7 static int _basic_check_changed(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 void _cb_disable_check_list(void *data, Evas_Object *obj);
10
11 /* Actual config data we will be playing with whil the dialog is active */
12 struct _E_Config_Dialog_Data
13 {
14    int use_resist;
15    int desk_resist;
16    int window_resist;
17    int gadget_resist;
18    int geometry_auto_resize_limit;
19    int geometry_auto_move;
20    struct
21      {
22         double timeout;
23         struct
24           {
25              int dx;
26           } move;
27         struct
28           {
29              int dx;
30           } resize;
31      } border_keyboard;
32    struct {
33       int    move;
34       int    resize;
35       int    raise;
36       int    lower;
37       int    layer;
38       int    desktop;
39       int    iconify;
40    } transient;
41    int maximize_policy;
42    int maximize_direction;
43    int maximized_allow_manip;
44    int border_fix_on_shelf_toggle;
45    
46    Eina_List *resistance_list;
47 };
48
49 E_Config_Dialog *
50 e_int_config_window_geometry(E_Container *con, const char *params __UNUSED__)
51 {
52    E_Config_Dialog *cfd;
53    E_Config_Dialog_View *v;
54
55    if (e_config_dialog_find("E", "windows/window_geometry")) return NULL;
56    v = E_NEW(E_Config_Dialog_View, 1);
57
58    /* methods */
59    v->create_cfdata = _create_data;
60    v->free_cfdata = _free_data;
61    v->basic.apply_cfdata = _basic_apply;
62    v->basic.create_widgets = _basic_create;
63    v->basic.check_changed = _basic_check_changed;
64
65    /* create config diaolg for NULL object/data */
66    cfd = e_config_dialog_new(con, _("Window Geometry"),
67                              "E", "windows/window_geometry",
68                              "preferences-window-geometry", 0, v, NULL);
69    return cfd;
70 }
71
72 static void *
73 _create_data(E_Config_Dialog *cfd __UNUSED__)
74 {
75    E_Config_Dialog_Data *cfdata = E_NEW(E_Config_Dialog_Data, 1);
76    if (!cfdata) return NULL;
77    cfdata->use_resist = e_config->use_resist;
78    cfdata->desk_resist = e_config->desk_resist;
79    cfdata->window_resist = e_config->window_resist;
80    cfdata->gadget_resist = e_config->gadget_resist;
81    cfdata->geometry_auto_resize_limit = e_config->geometry_auto_resize_limit;
82    cfdata->geometry_auto_move = e_config->geometry_auto_move;
83    cfdata->border_keyboard.timeout = e_config->border_keyboard.timeout;
84    cfdata->border_keyboard.move.dx = e_config->border_keyboard.move.dx;
85    cfdata->border_keyboard.resize.dx = e_config->border_keyboard.resize.dx;
86    cfdata->transient.move = e_config->transient.move;
87    cfdata->transient.resize = e_config->transient.resize;
88    cfdata->transient.raise = e_config->transient.raise;
89    cfdata->transient.lower = e_config->transient.lower;
90    cfdata->transient.layer = e_config->transient.layer;
91    cfdata->transient.desktop = e_config->transient.desktop;
92    cfdata->transient.iconify = e_config->transient.iconify;
93    cfdata->maximize_policy = (e_config->maximize_policy & E_MAXIMIZE_TYPE);
94    if (cfdata->maximize_policy == E_MAXIMIZE_NONE)
95      cfdata->maximize_policy = E_MAXIMIZE_FULLSCREEN;
96    cfdata->maximize_direction = 
97      (e_config->maximize_policy & E_MAXIMIZE_DIRECTION);
98    if (!cfdata->maximize_direction)
99      cfdata->maximize_direction = E_MAXIMIZE_BOTH;
100    cfdata->maximized_allow_manip = e_config->allow_manip;
101    cfdata->border_fix_on_shelf_toggle = e_config->border_fix_on_shelf_toggle;
102    return cfdata;
103 }
104
105 static void
106 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
107 {
108    eina_list_free(cfdata->resistance_list);
109    E_FREE(cfdata);
110 }
111
112 static int
113 _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
114 {
115    e_config->use_resist = cfdata->use_resist;
116    e_config->desk_resist = cfdata->desk_resist;
117    e_config->window_resist = cfdata->window_resist;
118    e_config->gadget_resist = cfdata->gadget_resist;
119    e_config->geometry_auto_resize_limit = cfdata->geometry_auto_resize_limit;
120    e_config->geometry_auto_move = cfdata->geometry_auto_move;  
121    e_config->border_keyboard.timeout = cfdata->border_keyboard.timeout;
122    e_config->border_keyboard.move.dx = cfdata->border_keyboard.move.dx;
123    e_config->border_keyboard.move.dy = cfdata->border_keyboard.move.dx;
124    e_config->border_keyboard.resize.dx = cfdata->border_keyboard.resize.dx;
125    e_config->border_keyboard.resize.dy = cfdata->border_keyboard.resize.dx;
126    e_config->transient.move = cfdata->transient.move;
127    e_config->transient.resize = cfdata->transient.resize;
128    e_config->transient.raise = cfdata->transient.raise;
129    e_config->transient.lower = cfdata->transient.lower;
130    e_config->transient.layer = cfdata->transient.layer;
131    e_config->transient.desktop = cfdata->transient.desktop;
132    e_config->transient.iconify = cfdata->transient.iconify;
133    e_config->maximize_policy =
134      (cfdata->maximize_policy | cfdata->maximize_direction);
135    e_config->allow_manip = cfdata->maximized_allow_manip;
136    e_config->border_fix_on_shelf_toggle = cfdata->border_fix_on_shelf_toggle;
137    e_config_save_queue();
138    return 1; /* Apply was OK */
139 }
140
141 static int
142 _basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
143 {
144    return ((e_config->use_resist != cfdata->use_resist) ||
145            (e_config->desk_resist != cfdata->desk_resist) ||
146            (e_config->window_resist != cfdata->window_resist) ||
147            (e_config->gadget_resist != cfdata->gadget_resist) ||
148            (e_config->geometry_auto_resize_limit != cfdata->geometry_auto_resize_limit) ||
149            (e_config->geometry_auto_move != cfdata->geometry_auto_move) ||
150            (e_config->border_keyboard.timeout != cfdata->border_keyboard.timeout) ||
151            (e_config->border_keyboard.move.dx != cfdata->border_keyboard.move.dx) ||
152            (e_config->border_keyboard.move.dy != cfdata->border_keyboard.move.dx) ||
153            (e_config->border_keyboard.resize.dx != cfdata->border_keyboard.resize.dx) ||
154            (e_config->border_keyboard.resize.dy != cfdata->border_keyboard.resize.dx) ||
155            (e_config->transient.move != cfdata->transient.move) ||
156            (e_config->transient.resize != cfdata->transient.resize) ||
157            (e_config->transient.raise != cfdata->transient.raise) ||
158            (e_config->transient.lower != cfdata->transient.lower) ||
159            (e_config->transient.layer != cfdata->transient.layer) ||
160            (e_config->transient.desktop != cfdata->transient.desktop) ||
161            (e_config->transient.iconify != cfdata->transient.iconify) ||
162            (e_config->maximize_policy != (cfdata->maximize_policy | cfdata->maximize_direction)) ||
163            (e_config->allow_manip != cfdata->maximized_allow_manip) ||
164            (e_config->border_fix_on_shelf_toggle != cfdata->border_fix_on_shelf_toggle));
165 }
166
167 static Evas_Object *
168 _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
169 {
170    Evas_Object *otb, *ol, *of, *ow, *oc;
171    E_Radio_Group *rg;
172
173    otb = e_widget_toolbook_add(evas, (24 * e_scale), (24 * e_scale));
174
175    /* Resistance */
176    ol = e_widget_list_add(evas, 0, 0);
177    oc = e_widget_check_add(evas, _("Resist obstacles"), &(cfdata->use_resist));
178    e_widget_list_object_append(ol, oc, 1, 0, 0.5);
179    ow = e_widget_label_add(evas, _("Other windows"));
180    e_widget_disabled_set(ow, !cfdata->use_resist);
181    cfdata->resistance_list = eina_list_append (cfdata->resistance_list, ow);
182    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
183    ow = e_widget_slider_add(evas, 1, 0, _("%2.0f pixels"), 0, 64.0, 1.0, 0, 
184                             NULL, &(cfdata->window_resist), 100);
185    cfdata->resistance_list = eina_list_append (cfdata->resistance_list, ow);
186    e_widget_disabled_set(ow, !cfdata->use_resist);
187    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
188    ow = e_widget_label_add(evas, _("Edge of the screen"));
189    cfdata->resistance_list = eina_list_append (cfdata->resistance_list, ow);
190    e_widget_disabled_set(ow, !cfdata->use_resist);
191    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
192    ow = e_widget_slider_add(evas, 1, 0, _("%2.0f pixels"), 0, 64.0, 1.0, 0, 
193                             NULL, &(cfdata->desk_resist), 100);
194    cfdata->resistance_list = eina_list_append (cfdata->resistance_list, ow);
195    e_widget_disabled_set(ow, !cfdata->use_resist);
196    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
197    ow = e_widget_label_add(evas, _("Desktop gadgets"));
198    cfdata->resistance_list = eina_list_append (cfdata->resistance_list, ow);
199    e_widget_disabled_set(ow, !cfdata->use_resist);
200    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
201    ow = e_widget_slider_add(evas, 1, 0, _("%2.0f pixels"), 0, 64.0, 1.0, 0, 
202                             NULL, &(cfdata->gadget_resist), 100);
203    cfdata->resistance_list = eina_list_append (cfdata->resistance_list, ow);
204    e_widget_disabled_set(ow, !cfdata->use_resist);
205    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
206    e_widget_on_change_hook_set(oc, _cb_disable_check_list, 
207                                cfdata->resistance_list);
208    e_widget_toolbook_page_append(otb, NULL, _("Resistance"), ol, 
209                                  1, 0, 1, 0, 0.5, 0.0);
210
211    /* Maximization */
212    ol = e_widget_list_add(evas, 0, 0);
213    of = e_widget_framelist_add(evas, _("Policy"), 0);
214    rg = e_widget_radio_group_new(&(cfdata->maximize_policy));
215    ow = e_widget_radio_add(evas, _("Fullscreen"), E_MAXIMIZE_FULLSCREEN, rg);
216    e_widget_framelist_object_append(of, ow);
217    /* FIXME smart is nothing else than expand - dont confuse users */
218    ow = e_widget_radio_add(evas, _("Smart expansion"), E_MAXIMIZE_SMART, rg);
219    e_widget_framelist_object_append(of, ow);
220    /* ob = e_widget_radio_add(evas, _("Expand the window"), E_MAXIMIZE_EXPAND, rg);
221     * e_widget_list_object_append(o, ob, 1, 1, 0.5); */
222    ow = e_widget_radio_add(evas, _("Fill available space"), E_MAXIMIZE_FILL, rg);
223    e_widget_framelist_object_append(of, ow);
224    e_widget_list_object_append(ol, of, 1, 0, 0.5);
225    of = e_widget_framelist_add(evas, _("Direction"), 0);
226    rg = e_widget_radio_group_new(&(cfdata->maximize_direction));
227    ow = e_widget_radio_add(evas, _("Horizontal"), E_MAXIMIZE_HORIZONTAL, rg);
228    e_widget_framelist_object_append(of, ow);
229    ow = e_widget_radio_add(evas, _("Vertical"), E_MAXIMIZE_VERTICAL, rg);
230    e_widget_framelist_object_append(of, ow);
231    ow = e_widget_radio_add(evas, _("Both"), E_MAXIMIZE_BOTH, rg);
232    e_widget_framelist_object_append(of, ow);
233    e_widget_list_object_append(ol, of, 1, 0, 0.5);
234    ow = e_widget_check_add(evas, _("Allow manipulation of maximized windows"), 
235                            &(cfdata->maximized_allow_manip));
236    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
237    e_widget_toolbook_page_append(otb, NULL, _("Maximization"), ol, 
238                                  1, 0, 1, 0, 0.5, 0.0);
239
240    /* Keyboard Move and resize */
241    ol = e_widget_list_add(evas, 0, 0);
242    ow = e_widget_label_add(evas, _("Automatically accept changes after:"));
243    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
244    ow = e_widget_slider_add(evas, 1, 0, _("%1.1f s"), 0.0, 9.9, 0.1, 0, 
245                             &(cfdata->border_keyboard.timeout), NULL, 100);
246    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
247    ow = e_widget_label_add(evas, _("Move by"));
248    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
249    ow = e_widget_slider_add(evas, 1, 0, _("%2.0f pixels"), 1, 255, 1, 0, NULL, 
250                             &(cfdata->border_keyboard.move.dx), 100);
251    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
252    ow = e_widget_label_add(evas, _("Resize by"));
253    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
254    ow = e_widget_slider_add(evas, 1, 0, _("%2.0f pixels"), 1, 255, 1, 0, NULL, 
255                             &(cfdata->border_keyboard.resize.dx), 100);
256    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
257    e_widget_toolbook_page_append(otb, NULL, _("Keyboard"), ol, 
258                                  1, 0, 1, 0, 0.5, 0.0);
259
260
261    /* Automatic Move and resize */
262    ol = e_widget_list_add(evas, 0, 0);
263    ow = e_widget_check_add(evas, _("Limit resize to useful geometry"), 
264                            &(cfdata->geometry_auto_resize_limit));
265    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
266    ow = e_widget_check_add(evas, _("Move after resize"), 
267                            &(cfdata->geometry_auto_move));
268    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
269    ow = e_widget_check_add(evas, _("Adjust windows on shelf hide"), 
270                            &(cfdata->border_fix_on_shelf_toggle));
271    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
272    e_widget_toolbook_page_append(otb, NULL, _("Automatic"), ol, 
273                                  1, 0, 1, 0, 0.5, 0.0);
274
275    /* Transient  */
276    ol = e_widget_list_add(evas, 0, 0);
277    ow = e_widget_check_add(evas, _("Follow Move"),
278                            &(cfdata->transient.move));
279    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
280    ow = e_widget_check_add(evas, _("Follow Resize"), 
281                            &(cfdata->transient.resize));
282    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
283    ow = e_widget_check_add(evas, _("Follow Raise"), 
284                            &(cfdata->transient.raise));
285    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
286    ow = e_widget_check_add(evas, _("Follow Lower"), 
287                            &(cfdata->transient.lower));
288    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
289    ow = e_widget_check_add(evas, _("Follow Layer"), 
290                            &(cfdata->transient.layer));
291    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
292    ow = e_widget_check_add(evas, _("Follow Desktop"), 
293                            &(cfdata->transient.desktop));
294    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
295    ow = e_widget_check_add(evas, _("Follow Iconify"), 
296                            &(cfdata->transient.iconify));
297    e_widget_list_object_append(ol, ow, 1, 0, 0.5);
298    
299    e_widget_toolbook_page_append(otb, NULL, _("Transients"), ol,
300                                  1, 0, 1, 0, 0.5, 0.0);
301
302    e_widget_toolbook_page_show(otb, 0);
303    return otb;
304 }
305
306 static void
307 _cb_disable_check_list(void *data, Evas_Object *obj)
308 {
309    const Eina_List *list = data;
310    const Eina_List *l;
311    Evas_Object *o;
312    Eina_Bool disable = !e_widget_check_checked_get(obj);
313
314    EINA_LIST_FOREACH(list, l, o)
315      e_widget_disabled_set(o, disable);
316 }