b83e5a1fffdcdf0ce67207e0d874c4de4e9ede11
[framework/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 E_Dialog *_e_screensaver_ask_presentation_dia = NULL;
13 static int _e_screensaver_ask_presentation_count = 0;
14
15 static int _e_screensaver_timeout = 0;
16 static int _e_screensaver_interval = 0;
17 static int _e_screensaver_blanking = 0;
18 static int _e_screensaver_expose = 0;
19
20 EAPI void
21 e_screensaver_update(void)
22 {
23    int timeout = 0, interval = 0, blanking = 0, expose = 0;
24    int count = (1 + _e_screensaver_ask_presentation_count);
25    Eina_Bool changed = EINA_FALSE;
26
27    if ((e_config->screensaver_enable) && (!e_config->mode.presentation) &&
28        (!e_util_fullscreen_curreny_any()))
29      timeout = e_config->screensaver_timeout * count;
30
31    interval = e_config->screensaver_interval;
32    blanking = e_config->screensaver_blanking;
33    expose = e_config->screensaver_expose;
34
35    if (_e_screensaver_timeout != timeout)
36      {
37         _e_screensaver_timeout = timeout;
38         changed = EINA_TRUE;
39      }
40    if (_e_screensaver_interval != interval)
41      {
42         _e_screensaver_interval = interval;
43         changed = EINA_TRUE;
44      }
45    if (_e_screensaver_blanking != blanking)
46      {
47         _e_screensaver_blanking = blanking;
48         changed = EINA_TRUE;
49      }
50    if (_e_screensaver_expose != expose)
51      {
52         _e_screensaver_expose = expose;
53         changed = EINA_TRUE;
54      }
55
56    if (changed) ecore_x_screensaver_set(timeout, interval, blanking, expose);
57 }
58
59 static Eina_Bool
60 _e_screensaver_handler_config_mode_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
61 {
62    e_screensaver_update();
63    return ECORE_CALLBACK_PASS_ON;
64 }
65
66 static void
67 _e_screensaver_ask_presentation_del(void *data)
68 {
69    if (_e_screensaver_ask_presentation_dia == data)
70      _e_screensaver_ask_presentation_dia = NULL;
71 }
72
73 static void
74 _e_screensaver_ask_presentation_yes(void *data __UNUSED__, E_Dialog *dia)
75 {
76    e_config->mode.presentation = 1;
77    e_config_mode_changed();
78    e_config_save_queue();
79    e_object_del(E_OBJECT(dia));
80    _e_screensaver_ask_presentation_count = 0;
81 }
82
83 static void
84 _e_screensaver_ask_presentation_no(void *data __UNUSED__, E_Dialog *dia)
85 {
86    e_object_del(E_OBJECT(dia));
87    _e_screensaver_ask_presentation_count = 0;
88 }
89
90 static void
91 _e_screensaver_ask_presentation_no_increase(void *data __UNUSED__, E_Dialog *dia)
92 {
93    _e_screensaver_ask_presentation_count++;
94    e_screensaver_update();
95    e_object_del(E_OBJECT(dia));
96 }
97
98 static void
99 _e_screensaver_ask_presentation_no_forever(void *data __UNUSED__, E_Dialog *dia)
100 {
101    e_config->screensaver_ask_presentation = 0;
102    e_config_save_queue();
103    e_object_del(E_OBJECT(dia));
104    _e_screensaver_ask_presentation_count = 0;
105 }
106
107 static void
108 _e_screensaver_ask_presentation_key_down(void *data, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event)
109 {
110    Evas_Event_Key_Down *ev = event;
111    E_Dialog *dia = data;
112
113    if (strcmp(ev->keyname, "Return") == 0)
114      _e_screensaver_ask_presentation_yes(NULL, dia);
115    else if (strcmp(ev->keyname, "Escape") == 0)
116      _e_screensaver_ask_presentation_no(NULL, dia);
117 }
118
119 static void
120 _e_screensaver_ask_presentation_mode(void)
121 {
122    E_Manager *man;
123    E_Container *con;
124    E_Dialog *dia;
125
126    if (_e_screensaver_ask_presentation_dia) return;
127
128    if (!(man = e_manager_current_get())) return;
129    if (!(con = e_container_current_get(man))) return;
130    if (!(dia = e_dialog_new(con, "E", "_screensaver_ask_presentation"))) return;
131
132    e_dialog_title_set(dia, _("Activate Presentation Mode?"));
133    e_dialog_icon_set(dia, "dialog-ask", 64);
134    e_dialog_text_set(dia,
135                      _("You disabled screensaver too fast.<br><br>"
136                        "Would you like to enable <b>presentation</b> mode and "
137                        "temporarily disable screen saver, lock and power saving?"));
138
139    e_object_del_attach_func_set(E_OBJECT(dia), 
140                                 _e_screensaver_ask_presentation_del);
141    e_dialog_button_add(dia, _("Yes"), NULL, 
142                        _e_screensaver_ask_presentation_yes, NULL);
143    e_dialog_button_add(dia, _("No"), NULL, 
144                        _e_screensaver_ask_presentation_no, NULL);
145    e_dialog_button_add(dia, _("No, but increase timeout"), NULL,
146                        _e_screensaver_ask_presentation_no_increase, NULL);
147    e_dialog_button_add(dia, _("No, and stop asking"), NULL,
148                        _e_screensaver_ask_presentation_no_forever, NULL);
149
150    e_dialog_button_focus_num(dia, 0);
151    e_widget_list_homogeneous_set(dia->box_object, 0);
152    e_win_centered_set(dia->win, 1);
153    e_dialog_show(dia);
154
155    evas_object_event_callback_add(dia->bg_object, EVAS_CALLBACK_KEY_DOWN,
156                                   _e_screensaver_ask_presentation_key_down, dia);
157
158    _e_screensaver_ask_presentation_dia = dia;
159 }
160
161 static Eina_Bool
162 _e_screensaver_handler_screensaver_notify_cb(void *data __UNUSED__, int type __UNUSED__, void *event)
163 {
164    Ecore_X_Event_Screensaver_Notify *e = event;
165    static double last_start = 0.0;
166
167    if (e->on)
168      {
169         last_start = ecore_loop_time_get();
170         _e_screensaver_ask_presentation_count = 0;
171      }
172    else if ((last_start > 0.0) && (e_config->screensaver_ask_presentation))
173      {
174         double current = ecore_loop_time_get();
175
176         if (last_start + e_config->screensaver_ask_presentation_timeout >= current)
177           _e_screensaver_ask_presentation_mode();
178         last_start = 0.0;
179      }
180    else if (_e_screensaver_ask_presentation_count)
181      _e_screensaver_ask_presentation_count = 0;
182
183    return ECORE_CALLBACK_PASS_ON;
184 }
185
186 static Eina_Bool
187 _e_screensaver_handler_border_fullscreen_check_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
188 {
189    e_screensaver_update();
190    return ECORE_CALLBACK_PASS_ON;
191 }
192
193 static Eina_Bool
194 _e_screensaver_handler_border_desk_set_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
195 {
196    e_screensaver_update();
197    return ECORE_CALLBACK_PASS_ON;
198 }
199
200 static Eina_Bool
201 _e_screensaver_handler_desk_show_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
202 {
203    e_screensaver_update();
204    return ECORE_CALLBACK_PASS_ON;
205 }
206
207 EINTERN int
208 e_screensaver_init(void)
209 {
210    _e_screensaver_handler_config_mode = ecore_event_handler_add
211      (E_EVENT_CONFIG_MODE_CHANGED, _e_screensaver_handler_config_mode_cb, NULL);
212
213    _e_screensaver_handler_screensaver_notify = ecore_event_handler_add
214      (ECORE_X_EVENT_SCREENSAVER_NOTIFY, _e_screensaver_handler_screensaver_notify_cb, NULL);
215
216    _e_screensaver_handler_border_fullscreen = ecore_event_handler_add
217      (E_EVENT_BORDER_FULLSCREEN, _e_screensaver_handler_border_fullscreen_check_cb, NULL);
218
219    _e_screensaver_handler_border_unfullscreen = ecore_event_handler_add
220      (E_EVENT_BORDER_UNFULLSCREEN, _e_screensaver_handler_border_fullscreen_check_cb, NULL);
221
222    _e_screensaver_handler_border_remove = ecore_event_handler_add
223      (E_EVENT_BORDER_REMOVE, _e_screensaver_handler_border_fullscreen_check_cb, NULL);
224
225    _e_screensaver_handler_border_iconify = ecore_event_handler_add
226      (E_EVENT_BORDER_ICONIFY, _e_screensaver_handler_border_fullscreen_check_cb, NULL);
227
228    _e_screensaver_handler_border_uniconify = ecore_event_handler_add
229      (E_EVENT_BORDER_UNICONIFY, _e_screensaver_handler_border_fullscreen_check_cb, NULL);
230
231    _e_screensaver_handler_border_desk_set = ecore_event_handler_add
232      (E_EVENT_BORDER_DESK_SET, _e_screensaver_handler_border_desk_set_cb, NULL);
233
234    _e_screensaver_handler_desk_show = ecore_event_handler_add
235      (E_EVENT_DESK_SHOW, _e_screensaver_handler_desk_show_cb, NULL);
236
237    _e_screensaver_timeout = ecore_x_screensaver_timeout_get();
238    _e_screensaver_interval = ecore_x_screensaver_interval_get();
239    _e_screensaver_blanking = ecore_x_screensaver_blank_get();
240    _e_screensaver_expose = ecore_x_screensaver_expose_get();
241
242    e_screensaver_update();
243
244    return 1;
245 }
246
247 EINTERN int
248 e_screensaver_shutdown(void)
249 {
250    if (_e_screensaver_handler_config_mode)
251      {
252         ecore_event_handler_del(_e_screensaver_handler_config_mode);
253         _e_screensaver_handler_config_mode = NULL;
254      }
255
256    if (_e_screensaver_handler_screensaver_notify)
257      {
258         ecore_event_handler_del(_e_screensaver_handler_screensaver_notify);
259         _e_screensaver_handler_screensaver_notify = NULL;
260      }
261
262    if (_e_screensaver_handler_border_fullscreen)
263      {
264         ecore_event_handler_del(_e_screensaver_handler_border_fullscreen);
265         _e_screensaver_handler_border_fullscreen = NULL;
266      }
267
268    if (_e_screensaver_handler_border_unfullscreen)
269      {
270         ecore_event_handler_del(_e_screensaver_handler_border_unfullscreen);
271         _e_screensaver_handler_border_unfullscreen = NULL;
272      }
273
274    if (_e_screensaver_handler_border_remove)
275      {
276         ecore_event_handler_del(_e_screensaver_handler_border_remove);
277         _e_screensaver_handler_border_remove = NULL;
278      }
279
280    if (_e_screensaver_handler_border_iconify)
281      {
282         ecore_event_handler_del(_e_screensaver_handler_border_iconify);
283         _e_screensaver_handler_border_iconify = NULL;
284      }
285
286    if (_e_screensaver_handler_border_uniconify)
287      {
288         ecore_event_handler_del(_e_screensaver_handler_border_uniconify);
289         _e_screensaver_handler_border_uniconify = NULL;
290      }
291
292    if (_e_screensaver_handler_border_desk_set)
293      {
294         ecore_event_handler_del(_e_screensaver_handler_border_desk_set);
295         _e_screensaver_handler_border_desk_set = NULL;
296      }
297
298    if (_e_screensaver_handler_desk_show)
299      {
300         ecore_event_handler_del(_e_screensaver_handler_desk_show);
301         _e_screensaver_handler_desk_show = NULL;
302      }
303
304    return 1;
305 }