1 #include "ecore_xcb_private.h"
4 * @defgroup Ecore_X_ScreenSaver_Group X ScreenSaver extension
6 * These functions use the ScreenSaver extension of the X server
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 */
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. */
20 _ecore_x_screensaver_init(const xcb_query_extension_reply_t *reply)
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);
26 #endif /* ECORE_XCB_SCREENSAVER */
27 } /* _ecore_x_screensaver_init */
30 _ecore_x_screensaver_init_finalize(void)
32 #ifdef ECORE_XCB_SCREENSAVER
33 xcb_screensaver_query_version_reply_t *reply;
35 reply = xcb_screensaver_query_version_reply(_ecore_xcb_conn,
36 _ecore_xcb_screensaver_init_cookie, NULL);
40 if ((reply->server_major_version >= 1) &&
41 (reply->server_minor_version >= 1))
42 _screensaver_available = 1;
47 #endif /* ECORE_XCB_SCREENSAVER */
48 } /* _ecore_x_screensaver_init_finalize */
51 * Return whether the X server supports the ScreenSaver Extension.
52 * @return 1 if the X ScreenSaver Extension is available, 0 otherwise.
54 * Return 1 if the X server supports the ScreenSaver Extension version 1.0,
56 * @ingroup Ecore_X_ScreenSaver_Group
59 ecore_x_screensaver_event_available_get(void)
62 } /* ecore_x_screensaver_event_available_get */
65 * Sends the QueryInfo request.
66 * @ingroup Ecore_X_ScreenSaver_Group
69 ecore_x_screensaver_idle_time_prefetch(void)
71 #ifdef ECORE_XCB_SCREENSAVER
72 xcb_screensaver_query_info_cookie_t cookie;
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 */
80 * Gets the reply of the QueryInfo request sent by ecore_x_get_screensaver_prefetch().
81 * @ingroup Ecore_X_ScreenSaver_Group
84 ecore_x_screensaver_idle_time_fetch(void)
86 #ifdef ECORE_XCB_SCREENSAVER
87 xcb_screensaver_query_info_cookie_t cookie;
88 xcb_screensaver_query_info_reply_t *reply;
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 */
97 * Get the number of seconds since the last input was received.
98 * @return The number of seconds.
100 * Get the number of milliseconds since the last input was received
101 * from the user on any of the input devices.
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
109 ecore_x_screensaver_idle_time_get(void)
112 #ifdef ECORE_XCB_SCREENSAVER
113 xcb_screensaver_query_info_reply_t *reply;
115 reply = _ecore_xcb_reply_get();
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 */
125 } /* ecore_x_screensaver_idle_time_get */
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.
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
142 ecore_x_screensaver_set(int timeout,
147 xcb_set_screen_saver(_ecore_xcb_conn,
152 } /* ecore_x_screensaver_set */
155 * Sends the GetScreenSaver request.
156 * @ingroup Ecore_X_ScreenSaver_Group
159 ecore_x_get_screensaver_prefetch(void)
161 xcb_get_screen_saver_cookie_t cookie;
163 cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
164 _ecore_xcb_cookie_cache(cookie.sequence);
165 } /* ecore_x_get_screensaver_prefetch */
168 * Gets the reply of the GetScreenSaver request sent by ecore_x_get_screensaver_prefetch().
169 * @ingroup Ecore_X_ScreenSaver_Group
172 ecore_x_get_screensaver_fetch(void)
174 xcb_get_screen_saver_cookie_t cookie;
175 xcb_get_screen_saver_reply_t *reply;
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 */
183 * Set the timeout of the screen saver.
184 * @param timeout The timeout to set.
186 * Set the @p timeout, in seconds, until the screen saver turns on.
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
194 ecore_x_screensaver_timeout_set(int timeout)
196 xcb_get_screen_saver_reply_t *reply;
198 reply = _ecore_xcb_reply_get();
202 xcb_set_screen_saver(_ecore_xcb_conn,
205 reply->prefer_blanking,
206 reply->allow_exposures);
207 } /* ecore_x_screensaver_timeout_set */
210 * Get the timeout of the screen saver.
211 * @return The timeout.
213 * Get the @p timeout, in seconds, until the screen saver turns on.
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
221 ecore_x_screensaver_timeout_get(void)
223 xcb_get_screen_saver_reply_t *reply;
225 reply = _ecore_xcb_reply_get();
229 return (int)reply->timeout;
230 } /* ecore_x_screensaver_timeout_get */
233 * Set the interval of the screen saver.
234 * @param interval The interval to set.
236 * Set the @p interval, in seconds, between screen saver alterations.
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
244 ecore_x_screensaver_interval_set(int interval)
246 xcb_get_screen_saver_reply_t *reply;
248 reply = _ecore_xcb_reply_get();
252 xcb_set_screen_saver(_ecore_xcb_conn,
255 reply->prefer_blanking,
256 reply->allow_exposures);
257 } /* ecore_x_screensaver_interval_set */
260 * Get the interval of the screen saver.
261 * @return The interval.
263 * Get the @p interval, in seconds, between screen saver alterations.
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
271 ecore_x_screensaver_interval_get(void)
273 xcb_get_screen_saver_reply_t *reply;
275 reply = _ecore_xcb_reply_get();
279 return (int)reply->interval;
280 } /* ecore_x_screensaver_interval_get */
283 * Set the screen blanking.
284 * @param blank The blank to set.
286 * @p blank specifies how to enable screen blanking.
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
294 ecore_x_screensaver_blank_set(int blank)
296 xcb_get_screen_saver_reply_t *reply;
298 reply = _ecore_xcb_reply_get();
302 xcb_set_screen_saver(_ecore_xcb_conn,
306 reply->allow_exposures);
307 } /* ecore_x_screensaver_blank_set */
310 * Get the screen blanking.
311 * @return The blanking.
313 * Get the screen blanking.
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
321 ecore_x_screensaver_blank_get(void)
323 xcb_get_screen_saver_reply_t *reply;
325 reply = _ecore_xcb_reply_get();
329 return (int)reply->prefer_blanking;
330 } /* ecore_x_screensaver_blank_get */
333 * Set the screen save control values.
334 * @param expose The expose to set.
336 * Set the screen save control values.
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
344 ecore_x_screensaver_expose_set(int expose)
346 xcb_get_screen_saver_reply_t *reply;
348 reply = _ecore_xcb_reply_get();
352 xcb_set_screen_saver(_ecore_xcb_conn,
355 reply->prefer_blanking,
357 } /* ecore_x_screensaver_expose_set */
360 * Get the screen save control values.
361 * @return The expose.
363 * Get the screen save control values.
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
371 ecore_x_screensaver_expose_get(void)
373 xcb_get_screen_saver_reply_t *reply;
375 reply = _ecore_xcb_reply_get();
379 return (int)reply->allow_exposures;
380 } /* ecore_x_screensaver_expose_get */
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.
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
390 * @ingroup Ecore_X_ScreenSaver_Group
393 ecore_x_screensaver_event_listen_set(Eina_Bool on)
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 */