update for beta release
[framework/uifw/e17.git] / src / modules / conf_display / e_int_config_dpms.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  _advanced_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
6 static int  _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
7 static Evas_Object  *_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas,
8                                               E_Config_Dialog_Data *cfdata);
9 static void _cb_standby_slider_change(void *data, Evas_Object *obj);
10 static void _cb_suspend_slider_change(void *data, Evas_Object *obj);
11 static void _cb_off_slider_change(void *data, Evas_Object *obj);
12
13 static int _e_int_config_dpms_available(void);
14 static int _e_int_config_dpms_capable(void);
15
16 static void _cb_disable_changed(void *data, Evas_Object *obj);
17
18 struct _E_Config_Dialog_Data
19 {
20    E_Config_Dialog *cfd;
21
22    Evas_Object *standby_slider;
23    Evas_Object *suspend_slider;
24    Evas_Object *off_slider;
25
26    int enable_dpms;
27    int enable_standby;
28    int enable_suspend;
29    int enable_off;
30
31    /*
32     * The following timeouts are represented as minutes
33     * while the underlying e_config variables are in seconds
34     */
35    double standby_timeout;
36    double suspend_timeout;
37    double off_timeout;
38    Eina_List *dpms_list;
39    
40    double backlight_normal;
41    double backlight_dim;
42    double backlight_transition;
43 };
44
45 /* static E_Dialog *dpms_dialog = NULL; */
46
47 /* always allow as dmps now has backlight too
48 static void
49 _cb_dpms_dialog_ok(void *data __UNUSED__, E_Dialog *dia __UNUSED__)
50 {
51    e_object_del(E_OBJECT(dpms_dialog));
52    dpms_dialog = NULL;
53 }
54 */
55
56 static int
57 _e_int_config_dpms_capable(void)
58 {
59    return 1;
60 /* always allow as dmps now has backlight too 
61  * this all needs to merge with screensaver too into a simple screen blank+
62  * dim+brightness etc. config
63    if (ecore_x_dpms_capable_get()) return 1;
64
65    if (dpms_dialog) e_object_del(E_OBJECT(dpms_dialog));
66    dpms_dialog = e_dialog_new(e_container_current_get(e_manager_current_get()),
67                               "E", "_dpms_capable_dialog");
68    if (!dpms_dialog) return 0;
69
70    e_dialog_title_set(dpms_dialog, _("Display Power Management Signaling"));
71    e_dialog_text_set(dpms_dialog, _("The current display server is not <br>"
72                                     "DPMS capable."));
73    e_dialog_icon_set(dpms_dialog, "preferences-system-power-management", 64);
74    e_dialog_button_add(dpms_dialog, _("OK"), NULL, _cb_dpms_dialog_ok, NULL);
75    e_dialog_button_focus_num(dpms_dialog, 1);
76    e_win_centered_set(dpms_dialog->win, 1);
77    e_dialog_show(dpms_dialog);
78  */
79    return 0;
80 }
81
82 static int
83 _e_int_config_dpms_available(void)
84 {
85    return 1;
86 /* always allow as dmps now has backlight too
87    if (ecore_x_dpms_query()) return 1;
88
89    if (dpms_dialog) e_object_del(E_OBJECT(dpms_dialog));
90    dpms_dialog = e_dialog_new(e_container_current_get(e_manager_current_get()),
91                               "E", "_dpms_available_dialog");
92    if (!dpms_dialog) return 0;
93
94    e_dialog_title_set(dpms_dialog, _("Display Power Management Signaling"));
95    e_dialog_text_set(dpms_dialog, _("The current display server does not <br>"
96                                     "have the DPMS extension."));
97    e_dialog_icon_set(dpms_dialog, "preferences-system-power-management", 64);
98    e_dialog_button_add(dpms_dialog, _("OK"), NULL, _cb_dpms_dialog_ok, NULL);
99    e_dialog_button_focus_num(dpms_dialog, 1);
100    e_win_centered_set(dpms_dialog->win, 1);
101    e_dialog_show(dpms_dialog);
102    return 0;
103  */
104 }
105
106 E_Config_Dialog *
107 e_int_config_dpms(E_Container *con, const char *params __UNUSED__)
108 {
109    E_Config_Dialog *cfd;
110    E_Config_Dialog_View *v;
111
112    if ((e_config_dialog_find("E", "screen/power_management")) ||
113        (!_e_int_config_dpms_available()) ||
114        (!_e_int_config_dpms_capable()))
115      return NULL;
116
117    v = E_NEW(E_Config_Dialog_View, 1);
118
119    v->create_cfdata = _create_data;
120    v->free_cfdata = _free_data;
121    v->basic.apply_cfdata = _advanced_apply_data;
122    v->basic.create_widgets = _advanced_create_widgets;
123    v->basic.check_changed = _advanced_check_changed;
124    v->override_auto_apply = 1;
125
126    cfd = e_config_dialog_new(con, _("Display Power Management Settings"), "E",
127                              "screen/power_management", "preferences-system-power-management",
128                              0, v, NULL);
129    return cfd;
130 }
131
132 static void
133 _fill_data(E_Config_Dialog_Data *cfdata)
134 {
135    cfdata->enable_dpms = e_config->dpms_enable;
136    cfdata->enable_standby = e_config->dpms_standby_enable;
137    cfdata->standby_timeout = e_config->dpms_standby_timeout / 60;
138    cfdata->enable_suspend = e_config->dpms_suspend_enable;
139    cfdata->suspend_timeout = e_config->dpms_suspend_timeout / 60;
140    cfdata->enable_off = e_config->dpms_off_enable;
141    cfdata->off_timeout = e_config->dpms_off_timeout / 60;
142    cfdata->backlight_normal = e_config->backlight.normal * 100.0;
143    cfdata->backlight_dim = e_config->backlight.dim * 100.0;
144    cfdata->backlight_transition = e_config->backlight.transition;
145 }
146
147 static void
148 _list_disabled_state_apply(Eina_List *list, Eina_Bool disabled)
149 {
150    Eina_List *l;
151    Evas_Object *o;
152
153    EINA_LIST_FOREACH(list, l, o)
154       e_widget_disabled_set(o, disabled);
155 }
156
157 static void *
158 _create_data(E_Config_Dialog *cfd)
159 {
160    E_Config_Dialog_Data *cfdata;
161
162    cfdata = E_NEW(E_Config_Dialog_Data, 1);
163    cfdata->cfd = cfd;
164
165    cfdata->standby_slider = NULL;
166    cfdata->suspend_slider = NULL;
167    cfdata->off_slider = NULL;
168
169    _fill_data(cfdata);
170    return cfdata;
171 }
172
173 static void
174 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
175 {
176    eina_list_free(cfdata->dpms_list);
177    E_FREE(cfdata);
178 }
179
180 static int
181 _apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
182 {
183    e_config->dpms_enable = cfdata->enable_dpms;
184    e_config->dpms_standby_enable = cfdata->enable_standby;
185    e_config->dpms_suspend_enable = cfdata->enable_suspend;
186    e_config->dpms_off_enable = cfdata->enable_off;
187
188    e_config->dpms_standby_timeout = cfdata->standby_timeout * 60;
189    e_config->dpms_suspend_timeout = cfdata->suspend_timeout * 60;
190    e_config->dpms_off_timeout = cfdata->off_timeout * 60;
191    
192    e_config->backlight.normal = cfdata->backlight_normal / 100.0;
193    e_config->backlight.dim = cfdata->backlight_dim / 100.0;
194    e_config->backlight.transition = cfdata->backlight_transition;
195
196    e_backlight_mode_set(NULL, E_BACKLIGHT_MODE_NORMAL);
197    e_backlight_level_set(NULL, e_config->backlight.normal, -1.0);
198    
199    e_config_save_queue();
200    e_dpms_update();
201    return 1;
202 }
203
204 /* advanced window */
205 static int
206 _advanced_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
207 {
208    return (e_config->dpms_enable != cfdata->enable_dpms) ||
209           (e_config->dpms_standby_enable != cfdata->enable_standby) ||
210           (e_config->dpms_suspend_enable != cfdata->enable_suspend) ||
211           (e_config->dpms_off_enable != cfdata->enable_off) ||
212           (e_config->dpms_standby_timeout / 60 != cfdata->standby_timeout) ||
213           (e_config->dpms_suspend_timeout / 60 != cfdata->suspend_timeout) ||
214           (e_config->dpms_off_timeout / 60 != cfdata->off_timeout) ||
215           (e_config->backlight.normal * 100.0 != cfdata->backlight_normal) ||
216           (e_config->backlight.dim * 100.0 != cfdata->backlight_dim) ||
217           (e_config->backlight.transition != cfdata->backlight_transition);
218 }
219
220 static int
221 _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
222 {
223    _apply_data(cfd, cfdata);
224    return 1;
225 }
226
227 static Evas_Object *
228 _advanced_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
229 {
230    Evas_Object *o, *of, *ob, *otb;
231    Evas_Object *dpms_check;
232
233    otb = e_widget_toolbook_add(evas, (24 * e_scale), (24 * e_scale));
234    
235    /* dpms */
236    o = e_widget_list_add(evas, 0, 0);
237
238    dpms_check = e_widget_check_add(evas, _("Enable Display Power Management"),
239                            &(cfdata->enable_dpms));
240    e_widget_list_object_append(o, dpms_check, 1, 1, 0);
241
242    of = e_widget_framelist_add(evas, _("Timers"), 0);
243
244    ob = e_widget_check_add(evas, _("Standby time"), &(cfdata->enable_standby));
245    e_widget_framelist_object_append(of, ob);
246    cfdata->dpms_list = eina_list_append(cfdata->dpms_list, ob);
247    e_widget_disabled_set(ob, !cfdata->enable_standby); // set state from saved config
248    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), 1.0, 90.0, 1.0, 0,
249                             &(cfdata->standby_timeout), NULL, 100);
250    e_widget_on_change_hook_set(ob, _cb_standby_slider_change, cfdata);
251    cfdata->standby_slider = ob;
252    cfdata->dpms_list = eina_list_append(cfdata->dpms_list, ob);
253    e_widget_disabled_set(ob, !cfdata->enable_standby); // set state from saved config
254    e_widget_framelist_object_append(of, ob);
255
256    ob = e_widget_check_add(evas, _("Suspend time"), &(cfdata->enable_suspend));
257    e_widget_framelist_object_append(of, ob);
258    cfdata->dpms_list = eina_list_append(cfdata->dpms_list, ob);
259    e_widget_disabled_set(ob, !cfdata->enable_standby); // set state from saved config
260    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), 1.0, 90.0, 1.0, 0,
261                             &(cfdata->suspend_timeout), NULL, 100);
262    e_widget_on_change_hook_set(ob, _cb_suspend_slider_change, cfdata);
263    cfdata->suspend_slider = ob;
264    cfdata->dpms_list = eina_list_append(cfdata->dpms_list, ob);
265    e_widget_disabled_set(ob, !cfdata->enable_standby); // set state from saved config
266    e_widget_framelist_object_append(of, ob);
267
268    ob = e_widget_check_add(evas, _("Off time"), &(cfdata->enable_off));
269    e_widget_framelist_object_append(of, ob);
270    cfdata->dpms_list = eina_list_append(cfdata->dpms_list, ob);
271    e_widget_disabled_set(ob, !cfdata->enable_standby); // set state from saved config
272    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), 1.0, 90.0, 1.0, 0,
273                             &(cfdata->off_timeout), NULL, 100);
274    e_widget_on_change_hook_set(ob, _cb_off_slider_change, cfdata);
275    cfdata->off_slider = ob;
276    cfdata->dpms_list = eina_list_append(cfdata->dpms_list, ob);
277    e_widget_disabled_set(ob, !cfdata->enable_standby); // set state from saved config
278    e_widget_framelist_object_append(of, ob);
279
280    // handler for enable/disable widget array
281    e_widget_on_change_hook_set(dpms_check, _cb_disable_changed, cfdata->dpms_list);
282    // setting initial state
283    _list_disabled_state_apply(cfdata->dpms_list, !cfdata->enable_dpms);
284
285    e_widget_list_object_append(o, of, 1, 1, 0.5);
286    
287    e_widget_toolbook_page_append(otb, NULL, _("DPMS"), o,
288                                  1, 0, 1, 0, 0.5, 0.0);
289
290    o = e_widget_list_add(evas, 0, 0);
291
292    ob = e_widget_label_add(evas, _("Normal Backlight"));
293    e_widget_list_object_append(o, ob, 1, 1, 0.5);
294    ob = e_widget_slider_add(evas, 1, 0, _("%3.0f"), 0.0, 100.0, 1.0, 0,
295                             &(cfdata->backlight_normal), NULL, 100);
296    e_widget_list_object_append(o, ob, 1, 1, 0.5);
297    
298    ob = e_widget_label_add(evas, _("Dim Backlight"));
299    e_widget_list_object_append(o, ob, 1, 1, 0.5);
300    ob = e_widget_slider_add(evas, 1, 0, _("%3.0f"), 0.0, 100.0, 1.0, 0,
301                             &(cfdata->backlight_dim), NULL, 100);
302    e_widget_list_object_append(o, ob, 1, 1, 0.5);
303    
304    ob = e_widget_label_add(evas, _("Fade Time"));
305    e_widget_list_object_append(o, ob, 1, 1, 0.5);
306    ob = e_widget_slider_add(evas, 1, 0, _("%1.1f sec"), 0.0, 5.0, 0.1, 0,
307                             &(cfdata->backlight_transition), NULL, 100);
308    e_widget_list_object_append(o, ob, 1, 1, 0.5);
309    
310    e_widget_toolbook_page_append(otb, NULL, _("Backlight"), o,
311                                  1, 0, 1, 0, 0.5, 0.0);
312    
313    e_widget_toolbook_page_show(otb, 0);
314    
315    return otb;
316 }
317
318 /* general functionality/callbacks */
319 static void
320 _cb_standby_slider_change(void *data, Evas_Object *obj __UNUSED__)
321 {
322    E_Config_Dialog_Data *cfdata = data;
323
324    /* standby-slider */
325    if (cfdata->standby_timeout > cfdata->suspend_timeout)
326      {
327         cfdata->suspend_timeout = cfdata->standby_timeout;
328         if (cfdata->suspend_slider)
329           e_widget_slider_value_double_set(cfdata->suspend_slider,
330                                            cfdata->suspend_timeout);
331
332         if (cfdata->suspend_timeout > cfdata->off_timeout)
333           {
334              cfdata->off_timeout = cfdata->suspend_timeout;
335              if (cfdata->off_slider)
336                e_widget_slider_value_double_set(cfdata->off_slider,
337                                                 cfdata->off_timeout);
338           }
339      }
340 }
341
342 static void
343 _cb_suspend_slider_change(void *data, Evas_Object *obj __UNUSED__)
344 {
345    E_Config_Dialog_Data *cfdata = data;
346
347    /* suspend-slider */
348    if (cfdata->suspend_timeout > cfdata->off_timeout)
349      {
350         cfdata->off_timeout = cfdata->suspend_timeout;
351         if (cfdata->off_slider)
352           e_widget_slider_value_double_set(cfdata->off_slider,
353                                            cfdata->off_timeout);
354      }
355    if (cfdata->suspend_timeout < cfdata->standby_timeout)
356      {
357         cfdata->standby_timeout = cfdata->suspend_timeout;
358         if (cfdata->standby_slider)
359           e_widget_slider_value_double_set(cfdata->standby_slider,
360                                            cfdata->standby_timeout);
361      }
362 }
363
364 static void
365 _cb_off_slider_change(void *data, Evas_Object *obj __UNUSED__)
366 {
367    E_Config_Dialog_Data *cfdata = data;
368
369    /* off-slider */
370    if (cfdata->off_timeout < cfdata->suspend_timeout)
371      {
372         cfdata->suspend_timeout = cfdata->off_timeout;
373         if (cfdata->suspend_slider)
374           e_widget_slider_value_double_set(cfdata->suspend_slider,
375                                            cfdata->suspend_timeout);
376
377         if (cfdata->suspend_timeout < cfdata->standby_timeout)
378           {
379              cfdata->standby_timeout = cfdata->suspend_timeout;
380              if (cfdata->standby_slider)
381                e_widget_slider_value_double_set(cfdata->standby_slider,
382                                                 cfdata->standby_timeout);
383           }
384      }
385 }
386
387 /*!
388  * @param data A Eina_List of Evas_Object to chain widgets together with the checkbox
389  * @param obj A Evas_Object checkbox created with e_widget_check_add()
390  */
391 static void
392 _cb_disable_changed(void *data, Evas_Object *obj)
393 {
394    _list_disabled_state_apply(data, !e_widget_check_checked_get(obj));
395 }