To support such as quickpanel to rotate based Window manager,
[platform/core/uifw/e17.git] / src / bin / e_screensaver.c
1 #include "e.h"
2
3 static Ecore_Event_Handler *_e_screensaver_handler_config_mode = NULL;
4 static Ecore_Event_Handler *_e_screensaver_handler_screensaver_notify = NULL;
5 static Ecore_Event_Handler *_e_screensaver_handler_border_fullscreen = NULL;
6 static Ecore_Event_Handler *_e_screensaver_handler_border_unfullscreen = NULL;
7 static Ecore_Event_Handler *_e_screensaver_handler_border_remove = NULL;
8 static Ecore_Event_Handler *_e_screensaver_handler_border_iconify = NULL;
9 static Ecore_Event_Handler *_e_screensaver_handler_border_uniconify = NULL;
10 static Ecore_Event_Handler *_e_screensaver_handler_border_desk_set = NULL;
11 static Ecore_Event_Handler *_e_screensaver_handler_desk_show = NULL;
12 static Ecore_Event_Handler *_e_screensaver_handler_powersave = NULL;
13 static E_Dialog *_e_screensaver_ask_presentation_dia = NULL;
14 static int _e_screensaver_ask_presentation_count = 0;
15
16 static int _e_screensaver_timeout = 0;
17 static int _e_screensaver_interval = 0;
18 static int _e_screensaver_blanking = 0;
19 static int _e_screensaver_expose = 0;
20
21 static Ecore_Timer *_e_screensaver_suspend_timer = NULL;
22 static Eina_Bool _e_screensaver_on = EINA_FALSE;
23
24 EAPI void
25 e_screensaver_update(void)
26 {
27    int timeout = 0, interval = 0, blanking = 0, expose = 0;
28    int count = (1 + _e_screensaver_ask_presentation_count);
29    Eina_Bool changed = EINA_FALSE;
30
31    if ((e_config->screensaver_enable) && (!e_config->mode.presentation) &&
32        (!e_util_fullscreen_curreny_any()))
33      timeout = e_config->screensaver_timeout * count;
34
35    interval = e_config->screensaver_interval;
36    blanking = e_config->screensaver_blanking;
37    expose = e_config->screensaver_expose;
38
39    if (_e_screensaver_timeout != timeout)
40      {
41         _e_screensaver_timeout = timeout;
42         changed = EINA_TRUE;
43      }
44    if (_e_screensaver_interval != interval)
45      {
46         _e_screensaver_interval = interval;
47         changed = EINA_TRUE;
48      }
49    if (_e_screensaver_blanking != blanking)
50      {
51         _e_screensaver_blanking = blanking;
52         changed = EINA_TRUE;
53      }
54    if (_e_screensaver_expose != expose)
55      {
56         _e_screensaver_expose = expose;
57         changed = EINA_TRUE;
58      }
59
60    if (changed) ecore_x_screensaver_set(timeout, interval, blanking, expose);
61 }
62
63 EAPI void
64 e_screensaver_force_update(void)
65 {
66    int timeout = 0, count = (1 + _e_screensaver_ask_presentation_count);
67
68    if ((e_config->screensaver_enable) && (!e_config->mode.presentation) &&
69        (!e_util_fullscreen_curreny_any()))
70      timeout = e_config->screensaver_timeout * count;
71    ecore_x_screensaver_set(timeout + 10,
72                            e_config->screensaver_interval + 10,
73                            !e_config->screensaver_blanking,
74                            !e_config->screensaver_expose);
75    ecore_x_screensaver_set(timeout,
76                            e_config->screensaver_interval,
77                            e_config->screensaver_blanking,
78                            e_config->screensaver_expose);
79 }
80
81 static Eina_Bool
82 _e_screensaver_handler_config_mode_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
83 {
84    e_screensaver_update();
85    return ECORE_CALLBACK_PASS_ON;
86 }
87
88 static void
89 _e_screensaver_ask_presentation_del(void *data)
90 {
91    if (_e_screensaver_ask_presentation_dia == data)
92      _e_screensaver_ask_presentation_dia = NULL;
93 }
94
95 static void
96 _e_screensaver_ask_presentation_yes(void *data __UNUSED__, E_Dialog *dia)
97 {
98    e_config->mode.presentation = 1;
99    e_config_mode_changed();
100    e_config_save_queue();
101    e_object_del(E_OBJECT(dia));
102    _e_screensaver_ask_presentation_count = 0;
103 }
104
105 static void
106 _e_screensaver_ask_presentation_no(void *data __UNUSED__, E_Dialog *dia)
107 {
108    e_object_del(E_OBJECT(dia));
109    _e_screensaver_ask_presentation_count = 0;
110 }
111
112 static void
113 _e_screensaver_ask_presentation_no_increase(void *data __UNUSED__, E_Dialog *dia)
114 {
115    _e_screensaver_ask_presentation_count++;
116    e_screensaver_update();
117    e_object_del(E_OBJECT(dia));
118 }
119
120 static void
121 _e_screensaver_ask_presentation_no_forever(void *data __UNUSED__, E_Dialog *dia)
122 {
123    e_config->screensaver_ask_presentation = 0;
124    e_config_save_queue();
125    e_object_del(E_OBJECT(dia));
126    _e_screensaver_ask_presentation_count = 0;
127 }
128
129 static void
130 _e_screensaver_ask_presentation_key_down(void *data, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event)
131 {
132    Evas_Event_Key_Down *ev = event;
133    E_Dialog *dia = data;
134
135    if (strcmp(ev->keyname, "Return") == 0)
136      _e_screensaver_ask_presentation_yes(NULL, dia);
137    else if (strcmp(ev->keyname, "Escape") == 0)
138      _e_screensaver_ask_presentation_no(NULL, dia);
139 }
140
141 static void
142 _e_screensaver_ask_presentation_mode(void)
143 {
144    E_Manager *man;
145    E_Container *con;
146    E_Dialog *dia;
147
148    if (_e_screensaver_ask_presentation_dia) return;
149
150    if (!(man = e_manager_current_get())) return;
151    if (!(con = e_container_current_get(man))) return;
152    if (!(dia = e_dialog_new(con, "E", "_screensaver_ask_presentation"))) return;
153
154    e_dialog_title_set(dia, _("Activate Presentation Mode?"));
155    e_dialog_icon_set(dia, "dialog-ask", 64);
156    e_dialog_text_set(dia,
157                      _("You disabled screensaver too fast.<br><br>"
158                        "Would you like to enable <b>presentation</b> mode and "
159                        "temporarily disable screen saver, lock and power saving?"));
160
161    e_object_del_attach_func_set(E_OBJECT(dia),
162                                 _e_screensaver_ask_presentation_del);
163    e_dialog_button_add(dia, _("Yes"), NULL,
164                        _e_screensaver_ask_presentation_yes, NULL);
165    e_dialog_button_add(dia, _("No"), NULL,
166                        _e_screensaver_ask_presentation_no, NULL);
167    e_dialog_button_add(dia, _("No, but increase timeout"), NULL,
168                        _e_screensaver_ask_presentation_no_increase, NULL);
169    e_dialog_button_add(dia, _("No, and stop asking"), NULL,
170                        _e_screensaver_ask_presentation_no_forever, NULL);
171
172    e_dialog_button_focus_num(dia, 0);
173    e_widget_list_homogeneous_set(dia->box_object, 0);
174    e_win_centered_set(dia->win, 1);
175    e_dialog_show(dia);
176
177    evas_object_event_callback_add(dia->bg_object, EVAS_CALLBACK_KEY_DOWN,
178                                   _e_screensaver_ask_presentation_key_down, dia);
179
180    _e_screensaver_ask_presentation_dia = dia;
181 }
182
183 static Eina_Bool
184 _e_screensaver_suspend_cb(void *data __UNUSED__)
185 {
186    _e_screensaver_suspend_timer = NULL;
187    if (e_config->screensaver_suspend)
188      {
189         if ((e_config->screensaver_suspend_on_ac) ||
190             (e_powersave_mode_get() > E_POWERSAVE_MODE_LOW))
191            e_sys_action_do(E_SYS_SUSPEND, NULL);
192      }
193    return EINA_FALSE;
194 }
195
196 static Eina_Bool
197 _e_screensaver_handler_powersave_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
198 {
199    if ((e_config->screensaver_suspend) && (_e_screensaver_on))
200      {
201         if (_e_screensaver_suspend_timer)
202            ecore_timer_del(_e_screensaver_suspend_timer);
203         _e_screensaver_suspend_timer =
204            ecore_timer_add(e_config->screensaver_suspend_delay,
205                            _e_screensaver_suspend_cb, NULL);
206      }
207    return ECORE_CALLBACK_PASS_ON;
208 }
209
210 static Eina_Bool
211 _e_screensaver_handler_screensaver_notify_cb(void *data __UNUSED__, int type __UNUSED__, void *event)
212 {
213    Ecore_X_Event_Screensaver_Notify *e = event;
214    static double last_start = 0.0;
215
216    if (e->on)
217      {
218         _e_screensaver_on = EINA_TRUE;
219         if (_e_screensaver_suspend_timer)
220           {
221              ecore_timer_del(_e_screensaver_suspend_timer);
222              _e_screensaver_suspend_timer = NULL;
223           }
224         if (e_config->screensaver_suspend)
225            _e_screensaver_suspend_timer =
226            ecore_timer_add(e_config->screensaver_suspend_delay,
227                            _e_screensaver_suspend_cb, NULL);
228      }
229    else
230      {
231         e_screensaver_force_update();
232         e_dpms_force_update();
233         
234         _e_screensaver_on = EINA_FALSE;
235         if (_e_screensaver_suspend_timer)
236           {
237              ecore_timer_del(_e_screensaver_suspend_timer);
238              _e_screensaver_suspend_timer = NULL;
239           }
240      }
241
242    if (e->on)
243      {
244         last_start = ecore_loop_time_get();
245         _e_screensaver_ask_presentation_count = 0;
246      }
247    else if ((last_start > 0.0) && (e_config->screensaver_ask_presentation))
248      {
249         double current = ecore_loop_time_get();
250
251         if (last_start + e_config->screensaver_ask_presentation_timeout >= current)
252           _e_screensaver_ask_presentation_mode();
253         last_start = 0.0;
254      }
255    else if (_e_screensaver_ask_presentation_count)
256      _e_screensaver_ask_presentation_count = 0;
257
258    return ECORE_CALLBACK_PASS_ON;
259 }
260
261 static Eina_Bool
262 _e_screensaver_handler_border_fullscreen_check_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
263 {
264    e_screensaver_update();
265    return ECORE_CALLBACK_PASS_ON;
266 }
267
268 static Eina_Bool
269 _e_screensaver_handler_border_desk_set_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
270 {
271    e_screensaver_update();
272    return ECORE_CALLBACK_PASS_ON;
273 }
274
275 static Eina_Bool
276 _e_screensaver_handler_desk_show_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
277 {
278    e_screensaver_update();
279    return ECORE_CALLBACK_PASS_ON;
280 }
281
282 EINTERN int
283 e_screensaver_init(void)
284 {
285    _e_screensaver_handler_config_mode = ecore_event_handler_add
286      (E_EVENT_CONFIG_MODE_CHANGED, _e_screensaver_handler_config_mode_cb, NULL);
287
288    _e_screensaver_handler_screensaver_notify = ecore_event_handler_add
289      (ECORE_X_EVENT_SCREENSAVER_NOTIFY, _e_screensaver_handler_screensaver_notify_cb, NULL);
290
291    _e_screensaver_handler_border_fullscreen = ecore_event_handler_add
292      (E_EVENT_BORDER_FULLSCREEN, _e_screensaver_handler_border_fullscreen_check_cb, NULL);
293
294    _e_screensaver_handler_border_unfullscreen = ecore_event_handler_add
295      (E_EVENT_BORDER_UNFULLSCREEN, _e_screensaver_handler_border_fullscreen_check_cb, NULL);
296
297    _e_screensaver_handler_border_remove = ecore_event_handler_add
298      (E_EVENT_BORDER_REMOVE, _e_screensaver_handler_border_fullscreen_check_cb, NULL);
299
300    _e_screensaver_handler_border_iconify = ecore_event_handler_add
301      (E_EVENT_BORDER_ICONIFY, _e_screensaver_handler_border_fullscreen_check_cb, NULL);
302
303    _e_screensaver_handler_border_uniconify = ecore_event_handler_add
304      (E_EVENT_BORDER_UNICONIFY, _e_screensaver_handler_border_fullscreen_check_cb, NULL);
305
306    _e_screensaver_handler_border_desk_set = ecore_event_handler_add
307      (E_EVENT_BORDER_DESK_SET, _e_screensaver_handler_border_desk_set_cb, NULL);
308
309    _e_screensaver_handler_desk_show = ecore_event_handler_add
310      (E_EVENT_DESK_SHOW, _e_screensaver_handler_desk_show_cb, NULL);
311
312    _e_screensaver_handler_powersave = ecore_event_handler_add
313      (E_EVENT_POWERSAVE_UPDATE, _e_screensaver_handler_powersave_cb, NULL);
314
315    _e_screensaver_timeout = ecore_x_screensaver_timeout_get();
316    _e_screensaver_interval = ecore_x_screensaver_interval_get();
317    _e_screensaver_blanking = ecore_x_screensaver_blank_get();
318    _e_screensaver_expose = ecore_x_screensaver_expose_get();
319
320    e_screensaver_update();
321
322    return 1;
323 }
324
325 EINTERN int
326 e_screensaver_shutdown(void)
327 {
328    if (_e_screensaver_suspend_timer)
329      {
330         ecore_timer_del(_e_screensaver_suspend_timer);
331         _e_screensaver_suspend_timer = NULL;
332      }
333
334    if (_e_screensaver_handler_powersave)
335      {
336         ecore_event_handler_del(_e_screensaver_handler_powersave);
337         _e_screensaver_handler_powersave = NULL;
338      }
339
340    if (_e_screensaver_handler_config_mode)
341      {
342         ecore_event_handler_del(_e_screensaver_handler_config_mode);
343         _e_screensaver_handler_config_mode = NULL;
344      }
345
346    if (_e_screensaver_handler_screensaver_notify)
347      {
348         ecore_event_handler_del(_e_screensaver_handler_screensaver_notify);
349         _e_screensaver_handler_screensaver_notify = NULL;
350      }
351
352    if (_e_screensaver_handler_border_fullscreen)
353      {
354         ecore_event_handler_del(_e_screensaver_handler_border_fullscreen);
355         _e_screensaver_handler_border_fullscreen = NULL;
356      }
357
358    if (_e_screensaver_handler_border_unfullscreen)
359      {
360         ecore_event_handler_del(_e_screensaver_handler_border_unfullscreen);
361         _e_screensaver_handler_border_unfullscreen = NULL;
362      }
363
364    if (_e_screensaver_handler_border_remove)
365      {
366         ecore_event_handler_del(_e_screensaver_handler_border_remove);
367         _e_screensaver_handler_border_remove = NULL;
368      }
369
370    if (_e_screensaver_handler_border_iconify)
371      {
372         ecore_event_handler_del(_e_screensaver_handler_border_iconify);
373         _e_screensaver_handler_border_iconify = NULL;
374      }
375
376    if (_e_screensaver_handler_border_uniconify)
377      {
378         ecore_event_handler_del(_e_screensaver_handler_border_uniconify);
379         _e_screensaver_handler_border_uniconify = NULL;
380      }
381
382    if (_e_screensaver_handler_border_desk_set)
383      {
384         ecore_event_handler_del(_e_screensaver_handler_border_desk_set);
385         _e_screensaver_handler_border_desk_set = NULL;
386      }
387
388    if (_e_screensaver_handler_desk_show)
389      {
390         ecore_event_handler_del(_e_screensaver_handler_desk_show);
391         _e_screensaver_handler_desk_show = NULL;
392      }
393
394    return 1;
395 }