a395c04db9aac9b66fa77ab82a80e8df4827b7d5
[profile/ivi/ecore.git] / src / lib / ecore_x / xcb / ecore_xcb_screensaver.c
1 #include "ecore_xcb_private.h"
2
3 /**
4  * @defgroup Ecore_X_ScreenSaver_Group X ScreenSaver extension
5  *
6  * These functions use the ScreenSaver extension of the X server
7  */
8
9 #ifdef ECORE_XCB_SCREENSAVER
10 static int _screensaver_available = 0;
11 static xcb_screensaver_query_version_cookie_t _ecore_xcb_screensaver_init_cookie;
12 #endif /* ECORE_XCB_SCREENSAVER */
13
14 /* To avoid round trips, the initialization is separated in 2
15    functions: _ecore_xcb_screensaver_init and
16    _ecore_xcb_screensaver_init_finalize. The first one gets the cookies and
17    the second one gets the replies and set the atoms. */
18
19 void
20 _ecore_x_screensaver_init(const xcb_query_extension_reply_t *reply)
21 {
22 #ifdef ECORE_XCB_SCREENSAVER
23    if (reply && (reply->present))
24       _ecore_xcb_screensaver_init_cookie = xcb_screensaver_query_version_unchecked(_ecore_xcb_conn, 1, 1);
25
26 #endif /* ECORE_XCB_SCREENSAVER */
27 } /* _ecore_x_screensaver_init */
28
29 void
30 _ecore_x_screensaver_init_finalize(void)
31 {
32 #ifdef ECORE_XCB_SCREENSAVER
33    xcb_screensaver_query_version_reply_t *reply;
34
35    reply = xcb_screensaver_query_version_reply(_ecore_xcb_conn,
36                                                _ecore_xcb_screensaver_init_cookie, NULL);
37
38    if (reply)
39      {
40         if ((reply->server_major_version >= 1) &&
41             (reply->server_minor_version >= 1))
42            _screensaver_available = 1;
43
44         free(reply);
45      }
46
47 #endif /* ECORE_XCB_SCREENSAVER */
48 } /* _ecore_x_screensaver_init_finalize */
49
50 /**
51  * Return whether the X server supports the ScreenSaver Extension.
52  * @return 1 if the X ScreenSaver Extension is available, 0 otherwise.
53  *
54  * Return 1 if the X server supports the ScreenSaver Extension version 1.0,
55  * 0 otherwise.
56  * @ingroup Ecore_X_ScreenSaver_Group
57  */
58 EAPI int
59 ecore_x_screensaver_event_available_get(void)
60 {
61    return 1;
62 } /* ecore_x_screensaver_event_available_get */
63
64 /**
65  * Sends the QueryInfo request.
66  * @ingroup Ecore_X_ScreenSaver_Group
67  */
68 EAPI void
69 ecore_x_screensaver_idle_time_prefetch(void)
70 {
71 #ifdef ECORE_XCB_SCREENSAVER
72    xcb_screensaver_query_info_cookie_t cookie;
73
74    cookie = xcb_screensaver_query_info_unchecked(_ecore_xcb_conn, ((xcb_screen_t *)_ecore_xcb_screen)->root);
75    _ecore_xcb_cookie_cache(cookie.sequence);
76 #endif /* ECORE_XCB_SCREENSAVER */
77 } /* ecore_x_screensaver_idle_time_prefetch */
78
79 /**
80  * Gets the reply of the QueryInfo request sent by ecore_x_get_screensaver_prefetch().
81  * @ingroup Ecore_X_ScreenSaver_Group
82  */
83 EAPI void
84 ecore_x_screensaver_idle_time_fetch(void)
85 {
86 #ifdef ECORE_XCB_SCREENSAVER
87    xcb_screensaver_query_info_cookie_t cookie;
88    xcb_screensaver_query_info_reply_t *reply;
89
90    cookie.sequence = _ecore_xcb_cookie_get();
91    reply = xcb_screensaver_query_info_reply(_ecore_xcb_conn, cookie, NULL);
92    _ecore_xcb_reply_cache(reply);
93 #endif /* ECORE_XCB_SCREENSAVER */
94 } /* ecore_x_screensaver_idle_time_fetch */
95
96 /**
97  * Get the number of seconds since the last input was received.
98  * @return The number of seconds.
99  *
100  * Get the number of milliseconds since the last input was received
101  * from the user on any of the input devices.
102  *
103  * To use this function, you must call before, and in order,
104  * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
105  * then ecore_x_get_screensaver_fetch(), which gets the reply.
106  * @ingroup Ecore_X_ScreenSaver_Group
107  */
108 EAPI int
109 ecore_x_screensaver_idle_time_get(void)
110 {
111    int idle = 0;
112 #ifdef ECORE_XCB_SCREENSAVER
113    xcb_screensaver_query_info_reply_t *reply;
114
115    reply = _ecore_xcb_reply_get();
116
117    if (!reply)
118       return 0;
119
120    /* FIXME: check if it is ms_since_user_input or ms_until_server */
121    idle = reply->ms_since_user_input / 1000;
122 #endif /* ECORE_XCB_SCREENSAVER */
123
124    return idle;
125 } /* ecore_x_screensaver_idle_time_get */
126
127 /**
128  * Set the parameters of the screen saver.
129  * @param timeout  The timeout, in second.
130  * @param interval The interval, in seconds.
131  * @param blank    0 to disable screen blanking, otherwise enable it.
132  * @param expose   Allow Expose generation event or not.
133  *
134  * Set the parameters of the screen saver. @p timeout is the timeout,
135  * in seconds, until the screen saver turns on. @p interval is the
136  * interval, in seconds, between screen saver alterations. @p blank
137  * specifies how to enable screen blanking. @p expose specifies the
138  * screen save control values.
139  * @ingroup Ecore_X_ScreenSaver_Group
140  */
141 EAPI void
142 ecore_x_screensaver_set(int timeout,
143                         int interval,
144                         int blank,
145                         int expose)
146 {
147    xcb_set_screen_saver(_ecore_xcb_conn,
148                         (int16_t)timeout,
149                         (int16_t)interval,
150                         (uint8_t)blank,
151                         (uint8_t)expose);
152 } /* ecore_x_screensaver_set */
153
154 /**
155  * Sends the GetScreenSaver request.
156  * @ingroup Ecore_X_ScreenSaver_Group
157  */
158 EAPI void
159 ecore_x_get_screensaver_prefetch(void)
160 {
161    xcb_get_screen_saver_cookie_t cookie;
162
163    cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
164    _ecore_xcb_cookie_cache(cookie.sequence);
165 } /* ecore_x_get_screensaver_prefetch */
166
167 /**
168  * Gets the reply of the GetScreenSaver request sent by ecore_x_get_screensaver_prefetch().
169  * @ingroup Ecore_X_ScreenSaver_Group
170  */
171 EAPI void
172 ecore_x_get_screensaver_fetch(void)
173 {
174    xcb_get_screen_saver_cookie_t cookie;
175    xcb_get_screen_saver_reply_t *reply;
176
177    cookie.sequence = _ecore_xcb_cookie_get();
178    reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
179    _ecore_xcb_reply_cache(reply);
180 } /* ecore_x_get_screensaver_fetch */
181
182 /**
183  * Set the timeout of the screen saver.
184  * @param  timeout The timeout to set.
185  *
186  * Set the @p timeout, in seconds, until the screen saver turns on.
187  *
188  * To use this function, you must call before, and in order,
189  * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
190  * then ecore_x_get_screensaver_fetch(), which gets the reply.
191  * @ingroup Ecore_X_ScreenSaver_Group
192  */
193 EAPI void
194 ecore_x_screensaver_timeout_set(int timeout)
195 {
196    xcb_get_screen_saver_reply_t *reply;
197
198    reply = _ecore_xcb_reply_get();
199    if (!reply)
200       return;
201
202    xcb_set_screen_saver(_ecore_xcb_conn,
203                         (int16_t)timeout,
204                         reply->interval,
205                         reply->prefer_blanking,
206                         reply->allow_exposures);
207 } /* ecore_x_screensaver_timeout_set */
208
209 /**
210  * Get the timeout of the screen saver.
211  * @return The timeout.
212  *
213  * Get the @p timeout, in seconds, until the screen saver turns on.
214  *
215  * To use this function, you must call before, and in order,
216  * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
217  * then ecore_x_get_screensaver_fetch(), which gets the reply.
218  * @ingroup Ecore_X_ScreenSaver_Group
219  */
220 EAPI int
221 ecore_x_screensaver_timeout_get(void)
222 {
223    xcb_get_screen_saver_reply_t *reply;
224
225    reply = _ecore_xcb_reply_get();
226    if (!reply)
227       return 0.0;
228
229    return (int)reply->timeout;
230 } /* ecore_x_screensaver_timeout_get */
231
232 /**
233  * Set the interval of the screen saver.
234  * @param  interval The interval to set.
235  *
236  * Set the @p interval, in seconds, between screen saver alterations.
237  *
238  * To use this function, you must call before, and in order,
239  * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
240  * then ecore_x_get_screensaver_fetch(), which gets the reply.
241  * @ingroup Ecore_X_ScreenSaver_Group
242  */
243 EAPI void
244 ecore_x_screensaver_interval_set(int interval)
245 {
246    xcb_get_screen_saver_reply_t *reply;
247
248    reply = _ecore_xcb_reply_get();
249    if (!reply)
250       return;
251
252    xcb_set_screen_saver(_ecore_xcb_conn,
253                         reply->timeout,
254                         (int16_t)interval,
255                         reply->prefer_blanking,
256                         reply->allow_exposures);
257 } /* ecore_x_screensaver_interval_set */
258
259 /**
260  * Get the interval of the screen saver.
261  * @return The interval.
262  *
263  * Get the @p interval, in seconds, between screen saver alterations.
264  *
265  * To use this function, you must call before, and in order,
266  * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
267  * then ecore_x_get_screensaver_fetch(), which gets the reply.
268  * @ingroup Ecore_X_ScreenSaver_Group
269  */
270 EAPI int
271 ecore_x_screensaver_interval_get(void)
272 {
273    xcb_get_screen_saver_reply_t *reply;
274
275    reply = _ecore_xcb_reply_get();
276    if (!reply)
277       return 0.0;
278
279    return (int)reply->interval;
280 } /* ecore_x_screensaver_interval_get */
281
282 /**
283  * Set the screen blanking.
284  * @param  blank The blank to set.
285  *
286  * @p blank specifies how to enable screen blanking.
287  *
288  * To use this function, you must call before, and in order,
289  * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
290  * then ecore_x_get_screensaver_fetch(), which gets the reply.
291  * @ingroup Ecore_X_ScreenSaver_Group
292  */
293 EAPI void
294 ecore_x_screensaver_blank_set(int blank)
295 {
296    xcb_get_screen_saver_reply_t *reply;
297
298    reply = _ecore_xcb_reply_get();
299    if (!reply)
300       return;
301
302    xcb_set_screen_saver(_ecore_xcb_conn,
303                         reply->timeout,
304                         reply->interval,
305                         (uint8_t)blank,
306                         reply->allow_exposures);
307 } /* ecore_x_screensaver_blank_set */
308
309 /**
310  * Get the screen blanking.
311  * @return The blanking.
312  *
313  * Get the screen blanking.
314  *
315  * To use this function, you must call before, and in order,
316  * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
317  * then ecore_x_get_screensaver_fetch(), which gets the reply.
318  * @ingroup Ecore_X_ScreenSaver_Group
319  */
320 EAPI int
321 ecore_x_screensaver_blank_get(void)
322 {
323    xcb_get_screen_saver_reply_t *reply;
324
325    reply = _ecore_xcb_reply_get();
326    if (!reply)
327       return 0.0;
328
329    return (int)reply->prefer_blanking;
330 } /* ecore_x_screensaver_blank_get */
331
332 /**
333  * Set the screen save control values.
334  * @param  expose The expose to set.
335  *
336  * Set the screen save control values.
337  *
338  * To use this function, you must call before, and in order,
339  * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
340  * then ecore_x_get_screensaver_fetch(), which gets the reply.
341  * @ingroup Ecore_X_ScreenSaver_Group
342  */
343 EAPI void
344 ecore_x_screensaver_expose_set(int expose)
345 {
346    xcb_get_screen_saver_reply_t *reply;
347
348    reply = _ecore_xcb_reply_get();
349    if (!reply)
350       return;
351
352    xcb_set_screen_saver(_ecore_xcb_conn,
353                         reply->timeout,
354                         reply->interval,
355                         reply->prefer_blanking,
356                         (uint8_t)expose);
357 } /* ecore_x_screensaver_expose_set */
358
359 /**
360  * Get the screen save control values.
361  * @return The expose.
362  *
363  * Get the screen save control values.
364  *
365  * To use this function, you must call before, and in order,
366  * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
367  * then ecore_x_get_screensaver_fetch(), which gets the reply.
368  * @ingroup Ecore_X_ScreenSaver_Group
369  */
370 EAPI int
371 ecore_x_screensaver_expose_get(void)
372 {
373    xcb_get_screen_saver_reply_t *reply;
374
375    reply = _ecore_xcb_reply_get();
376    if (!reply)
377       return 0.0;
378
379    return (int)reply->allow_exposures;
380 } /* ecore_x_screensaver_expose_get */
381
382 /**
383  * Specifies if the Screen Saver NotifyMask event should be generated.
384  * @param on 0 to disable the generation of the event, otherwise enable it.
385  *
386  * Specifies if the Screen Saver NotifyMask event on the screen
387  * associated with drawable should be generated for this client. If
388  * @p on is set to @c 0, the generation is disabled, otherwise, it is
389  * enabled.
390  * @ingroup Ecore_X_ScreenSaver_Group
391  */
392 EAPI void
393 ecore_x_screensaver_event_listen_set(int on)
394 {
395 #ifdef ECORE_XCB_SCREENSAVER
396    xcb_screensaver_select_input(_ecore_xcb_conn,
397                                 ((xcb_screen_t *)_ecore_xcb_screen)->root,
398                                 on ? XCB_SCREENSAVER_EVENT_NOTIFY_MASK : 0);
399 #endif /* ECORE_XCB_SCREENSAVER */
400 } /* ecore_x_screensaver_event_listen_set */
401