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