bebf01767ae1059773dca998cd598385cf18541b
[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
41 static E_Dialog *dpms_dialog = NULL;
42
43 static void
44 _cb_dpms_dialog_ok(void *data __UNUSED__, E_Dialog *dia __UNUSED__)
45 {
46    e_object_del(E_OBJECT(dpms_dialog));
47    dpms_dialog = NULL;
48 }
49
50 static int
51 _e_int_config_dpms_capable(void)
52 {
53    if (ecore_x_dpms_capable_get()) return 1;
54
55    if (dpms_dialog) e_object_del(E_OBJECT(dpms_dialog));
56    dpms_dialog = e_dialog_new(e_container_current_get(e_manager_current_get()),
57                               "E", "_dpms_capable_dialog");
58    if (!dpms_dialog) return 0;
59
60    e_dialog_title_set(dpms_dialog, _("Display Power Management Signaling"));
61    e_dialog_text_set(dpms_dialog, _("The current display server is not <br>"
62                                     "DPMS capable."));
63    e_dialog_icon_set(dpms_dialog, "preferences-system-power-management", 64);
64    e_dialog_button_add(dpms_dialog, _("OK"), NULL, _cb_dpms_dialog_ok, NULL);
65    e_dialog_button_focus_num(dpms_dialog, 1);
66    e_win_centered_set(dpms_dialog->win, 1);
67    e_dialog_show(dpms_dialog);
68    return 0;
69 }
70
71 static int
72 _e_int_config_dpms_available(void)
73 {
74    if (ecore_x_dpms_query()) return 1;
75
76    if (dpms_dialog) e_object_del(E_OBJECT(dpms_dialog));
77    dpms_dialog = e_dialog_new(e_container_current_get(e_manager_current_get()),
78                               "E", "_dpms_available_dialog");
79    if (!dpms_dialog) return 0;
80
81    e_dialog_title_set(dpms_dialog, _("Display Power Management Signaling"));
82    e_dialog_text_set(dpms_dialog, _("The current display server does not <br>"
83                                     "have the DPMS extension."));
84    e_dialog_icon_set(dpms_dialog, "preferences-system-power-management", 64);
85    e_dialog_button_add(dpms_dialog, _("OK"), NULL, _cb_dpms_dialog_ok, NULL);
86    e_dialog_button_focus_num(dpms_dialog, 1);
87    e_win_centered_set(dpms_dialog->win, 1);
88    e_dialog_show(dpms_dialog);
89    return 0;
90 }
91
92 E_Config_Dialog *
93 e_int_config_dpms(E_Container *con, const char *params __UNUSED__)
94 {
95    E_Config_Dialog *cfd;
96    E_Config_Dialog_View *v;
97
98    if ((e_config_dialog_find("E", "screen/power_management")) ||
99        (!_e_int_config_dpms_available()) ||
100        (!_e_int_config_dpms_capable()))
101      return NULL;
102
103    v = E_NEW(E_Config_Dialog_View, 1);
104
105    v->create_cfdata = _create_data;
106    v->free_cfdata = _free_data;
107    v->basic.apply_cfdata = _advanced_apply_data;
108    v->basic.create_widgets = _advanced_create_widgets;
109    v->basic.check_changed = _advanced_check_changed;
110    v->override_auto_apply = 1;
111
112    cfd = e_config_dialog_new(con, _("Display Power Management Settings"), "E",
113                              "screen/power_management", "preferences-system-power-management",
114                              0, v, NULL);
115    return cfd;
116 }
117
118 static void
119 _fill_data(E_Config_Dialog_Data *cfdata)
120 {
121    cfdata->enable_dpms = e_config->dpms_enable;
122    cfdata->enable_standby = e_config->dpms_standby_enable;
123    cfdata->standby_timeout = e_config->dpms_standby_timeout / 60;
124    cfdata->enable_suspend = e_config->dpms_suspend_enable;
125    cfdata->suspend_timeout = e_config->dpms_suspend_timeout / 60;
126    cfdata->enable_off = e_config->dpms_off_enable;
127    cfdata->off_timeout = e_config->dpms_off_timeout / 60;
128 }
129
130 static void
131 _list_disabled_state_apply(Eina_List *list, Eina_Bool disabled)
132 {
133    Eina_List *l;
134    Evas_Object *o;
135
136    EINA_LIST_FOREACH(list, l, o)
137       e_widget_disabled_set(o, disabled);
138 }
139
140 static void *
141 _create_data(E_Config_Dialog *cfd)
142 {
143    E_Config_Dialog_Data *cfdata;
144
145    cfdata = E_NEW(E_Config_Dialog_Data, 1);
146    cfdata->cfd = cfd;
147
148    cfdata->standby_slider = NULL;
149    cfdata->suspend_slider = NULL;
150    cfdata->off_slider = NULL;
151
152    _fill_data(cfdata);
153    return cfdata;
154 }
155
156 static void
157 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
158 {
159   eina_list_free(cfdata->dpms_list);
160   E_FREE(cfdata);
161 }
162
163 static int
164 _apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
165 {
166    e_config->dpms_enable = cfdata->enable_dpms;
167    e_config->dpms_standby_enable = cfdata->enable_standby;
168    e_config->dpms_suspend_enable = cfdata->enable_suspend;
169    e_config->dpms_off_enable = cfdata->enable_off;
170
171    e_config->dpms_standby_timeout = cfdata->standby_timeout * 60;
172    e_config->dpms_suspend_timeout = cfdata->suspend_timeout * 60;
173    e_config->dpms_off_timeout = cfdata->off_timeout * 60;
174
175    e_config_save_queue();
176    e_dpms_update();
177    return 1;
178 }
179
180 /* advanced window */
181 static int
182 _advanced_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
183 {
184    return (e_config->dpms_enable != cfdata->enable_dpms) ||
185           (e_config->dpms_standby_enable != cfdata->enable_standby) ||
186           (e_config->dpms_suspend_enable != cfdata->enable_suspend) ||
187           (e_config->dpms_off_enable != cfdata->enable_off) ||
188           (e_config->dpms_standby_timeout / 60 != cfdata->standby_timeout) ||
189           (e_config->dpms_suspend_timeout / 60 != cfdata->suspend_timeout) ||
190           (e_config->dpms_off_timeout / 60 != cfdata->off_timeout);
191 }
192
193 static int
194 _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
195 {
196    _apply_data(cfd, cfdata);
197    return 1;
198 }
199
200 static Evas_Object *
201 _advanced_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
202 {
203    Evas_Object *o, *of, *ob;
204    Evas_Object *dpms_check;
205
206    o = e_widget_list_add(evas, 0, 0);
207
208    dpms_check = e_widget_check_add(evas, _("Enable Display Power Management"),
209                            &(cfdata->enable_dpms));
210    e_widget_list_object_append(o, dpms_check, 1, 1, 0);
211
212    of = e_widget_framelist_add(evas, _("Timers"), 0);
213
214    ob = e_widget_check_add(evas, _("Standby time"), &(cfdata->enable_standby));
215    e_widget_framelist_object_append(of, ob);
216    cfdata->dpms_list = eina_list_append(cfdata->dpms_list, ob);
217    e_widget_disabled_set(ob, !cfdata->enable_standby); // set state from saved config
218    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), 1.0, 90.0, 1.0, 0,
219                             &(cfdata->standby_timeout), NULL, 100);
220    e_widget_on_change_hook_set(ob, _cb_standby_slider_change, cfdata);
221    cfdata->standby_slider = ob;
222    cfdata->dpms_list = eina_list_append(cfdata->dpms_list, ob);
223    e_widget_disabled_set(ob, !cfdata->enable_standby); // set state from saved config
224    e_widget_framelist_object_append(of, ob);
225
226    ob = e_widget_check_add(evas, _("Suspend time"), &(cfdata->enable_suspend));
227    e_widget_framelist_object_append(of, ob);
228    cfdata->dpms_list = eina_list_append(cfdata->dpms_list, ob);
229    e_widget_disabled_set(ob, !cfdata->enable_standby); // set state from saved config
230    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), 1.0, 90.0, 1.0, 0,
231                             &(cfdata->suspend_timeout), NULL, 100);
232    e_widget_on_change_hook_set(ob, _cb_suspend_slider_change, cfdata);
233    cfdata->suspend_slider = ob;
234    cfdata->dpms_list = eina_list_append(cfdata->dpms_list, ob);
235    e_widget_disabled_set(ob, !cfdata->enable_standby); // set state from saved config
236    e_widget_framelist_object_append(of, ob);
237
238    ob = e_widget_check_add(evas, _("Off time"), &(cfdata->enable_off));
239    e_widget_framelist_object_append(of, ob);
240    cfdata->dpms_list = eina_list_append(cfdata->dpms_list, ob);
241    e_widget_disabled_set(ob, !cfdata->enable_standby); // set state from saved config
242    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), 1.0, 90.0, 1.0, 0,
243                             &(cfdata->off_timeout), NULL, 100);
244    e_widget_on_change_hook_set(ob, _cb_off_slider_change, cfdata);
245    cfdata->off_slider = 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    e_widget_framelist_object_append(of, ob);
249
250    // handler for enable/disable widget array
251    e_widget_on_change_hook_set(dpms_check, _cb_disable_changed, cfdata->dpms_list);
252    // setting initial state
253    _list_disabled_state_apply(cfdata->dpms_list, !cfdata->enable_dpms);
254
255    e_widget_list_object_append(o, of, 1, 1, 0.5);
256    return o;
257 }
258
259 /* general functionality/callbacks */
260 static void
261 _cb_standby_slider_change(void *data, Evas_Object *obj __UNUSED__)
262 {
263    E_Config_Dialog_Data *cfdata = data;
264
265    /* standby-slider */
266    if (cfdata->standby_timeout > cfdata->suspend_timeout)
267      {
268         cfdata->suspend_timeout = cfdata->standby_timeout;
269         if (cfdata->suspend_slider)
270           e_widget_slider_value_double_set(cfdata->suspend_slider,
271                                            cfdata->suspend_timeout);
272
273         if (cfdata->suspend_timeout > cfdata->off_timeout)
274           {
275              cfdata->off_timeout = cfdata->suspend_timeout;
276              if (cfdata->off_slider)
277                e_widget_slider_value_double_set(cfdata->off_slider,
278                                                 cfdata->off_timeout);
279           }
280      }
281 }
282
283 static void
284 _cb_suspend_slider_change(void *data, Evas_Object *obj __UNUSED__)
285 {
286    E_Config_Dialog_Data *cfdata = data;
287
288    /* suspend-slider */
289    if (cfdata->suspend_timeout > cfdata->off_timeout)
290      {
291         cfdata->off_timeout = cfdata->suspend_timeout;
292         if (cfdata->off_slider)
293           e_widget_slider_value_double_set(cfdata->off_slider,
294                                            cfdata->off_timeout);
295      }
296    if (cfdata->suspend_timeout < cfdata->standby_timeout)
297      {
298         cfdata->standby_timeout = cfdata->suspend_timeout;
299         if (cfdata->standby_slider)
300           e_widget_slider_value_double_set(cfdata->standby_slider,
301                                            cfdata->standby_timeout);
302      }
303 }
304
305 static void
306 _cb_off_slider_change(void *data, Evas_Object *obj __UNUSED__)
307 {
308    E_Config_Dialog_Data *cfdata = data;
309
310    /* off-slider */
311    if (cfdata->off_timeout < cfdata->suspend_timeout)
312      {
313         cfdata->suspend_timeout = cfdata->off_timeout;
314         if (cfdata->suspend_slider)
315           e_widget_slider_value_double_set(cfdata->suspend_slider,
316                                            cfdata->suspend_timeout);
317
318         if (cfdata->suspend_timeout < cfdata->standby_timeout)
319           {
320              cfdata->standby_timeout = cfdata->suspend_timeout;
321              if (cfdata->standby_slider)
322                e_widget_slider_value_double_set(cfdata->standby_slider,
323                                                 cfdata->standby_timeout);
324           }
325      }
326 }
327
328 /*!
329  * @param data A Eina_List of Evas_Object to chain widgets together with the checkbox
330  * @param obj A Evas_Object checkbox created with e_widget_check_add()
331  */
332 static void
333 _cb_disable_changed(void *data, Evas_Object *obj)
334 {
335    _list_disabled_state_apply(data, !e_widget_check_checked_get(obj));
336 }