#include "ecore_xcb_private.h" # ifdef ECORE_XCB_SCREENSAVER # include # endif /* local variables */ static Eina_Bool _screensaver_avail = EINA_FALSE; /* external variables */ int _ecore_xcb_event_screensaver = -1; void _ecore_xcb_screensaver_init(void) { LOGFN(__FILE__, __LINE__, __FUNCTION__); #ifdef ECORE_XCB_SCREENSAVER xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_screensaver_id); #endif } void _ecore_xcb_screensaver_finalize(void) { #ifdef ECORE_XCB_SCREENSAVER const xcb_query_extension_reply_t *ext_reply; #endif LOGFN(__FILE__, __LINE__, __FUNCTION__); #ifdef ECORE_XCB_SCREENSAVER ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_screensaver_id); if ((ext_reply) && (ext_reply->present)) { xcb_screensaver_query_version_cookie_t cookie; xcb_screensaver_query_version_reply_t *reply; cookie = xcb_screensaver_query_version_unchecked(_ecore_xcb_conn, XCB_SCREENSAVER_MAJOR_VERSION, XCB_SCREENSAVER_MINOR_VERSION); reply = xcb_screensaver_query_version_reply(_ecore_xcb_conn, cookie, NULL); if (reply) { if ((reply->server_major_version >= XCB_SCREENSAVER_MAJOR_VERSION) && (reply->server_minor_version >= XCB_SCREENSAVER_MINOR_VERSION)) _screensaver_avail = EINA_TRUE; free(reply); } if (_screensaver_avail) _ecore_xcb_event_screensaver = ext_reply->first_event; } #endif } EAPI int ecore_x_screensaver_idle_time_get(void) { int ret = 0; #ifdef ECORE_XCB_SCREENSAVER xcb_screensaver_query_info_cookie_t cookie; xcb_screensaver_query_info_reply_t *reply; Ecore_X_Window root; #endif LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; if (!_screensaver_avail) return 0; #ifdef ECORE_XCB_SCREENSAVER root = ((xcb_screen_t *)_ecore_xcb_screen)->root; cookie = xcb_screensaver_query_info_unchecked(_ecore_xcb_conn, root); reply = xcb_screensaver_query_info_reply(_ecore_xcb_conn, cookie, NULL); if (!reply) return 0; ret = (reply->ms_until_server / 1000); free(reply); #endif return ret; } EAPI void ecore_x_screensaver_set(int timeout, int interval, int prefer_blanking, int allow_exposures) { LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; if (!_screensaver_avail) return; #ifdef ECORE_XCB_SCREENSAVER xcb_set_screen_saver(_ecore_xcb_conn, timeout, interval, prefer_blanking, allow_exposures); #endif } EAPI void ecore_x_screensaver_timeout_set(int timeout) { #ifdef ECORE_XCB_SCREENSAVER xcb_get_screen_saver_cookie_t cookie; xcb_get_screen_saver_reply_t *reply; uint16_t pint; uint8_t pblank, pexpo; #endif LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; if (!_screensaver_avail) return; #ifdef ECORE_XCB_SCREENSAVER cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn); reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL); if (!reply) return; pint = reply->interval; pblank = reply->prefer_blanking; pexpo = reply->allow_exposures; free(reply); xcb_set_screen_saver(_ecore_xcb_conn, timeout, pint, pblank, pexpo); #endif } EAPI int ecore_x_screensaver_timeout_get(void) { int timeout = 0; #ifdef ECORE_XCB_SCREENSAVER xcb_get_screen_saver_cookie_t cookie; xcb_get_screen_saver_reply_t *reply; #endif LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; if (!_screensaver_avail) return 0; #ifdef ECORE_XCB_SCREENSAVER cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn); reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL); if (!reply) return 0; timeout = reply->timeout; free(reply); #endif return timeout; } EAPI void ecore_x_screensaver_blank_set(int blank) { #ifdef ECORE_XCB_SCREENSAVER xcb_get_screen_saver_cookie_t cookie; xcb_get_screen_saver_reply_t *reply; uint16_t pint, pto; uint8_t pexpo; #endif LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; if (!_screensaver_avail) return; #ifdef ECORE_XCB_SCREENSAVER cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn); reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL); if (!reply) return; pto = reply->timeout; pint = reply->interval; pexpo = reply->allow_exposures; free(reply); xcb_set_screen_saver(_ecore_xcb_conn, pto, pint, blank, pexpo); #endif } EAPI int ecore_x_screensaver_blank_get(void) { int blank = 0; #ifdef ECORE_XCB_SCREENSAVER xcb_get_screen_saver_cookie_t cookie; xcb_get_screen_saver_reply_t *reply; #endif LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; if (!_screensaver_avail) return 0; #ifdef ECORE_XCB_SCREENSAVER cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn); reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL); if (!reply) return 0; blank = reply->prefer_blanking; free(reply); #endif return blank; } EAPI void ecore_x_screensaver_expose_set(int expose) { #ifdef ECORE_XCB_SCREENSAVER xcb_get_screen_saver_cookie_t cookie; xcb_get_screen_saver_reply_t *reply; uint16_t pint, pto; uint8_t pblank; #endif LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; if (!_screensaver_avail) return; #ifdef ECORE_XCB_SCREENSAVER cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn); reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL); if (!reply) return; pto = reply->timeout; pint = reply->interval; pblank = reply->prefer_blanking; free(reply); xcb_set_screen_saver(_ecore_xcb_conn, pto, pint, pblank, expose); #endif } EAPI int ecore_x_screensaver_expose_get(void) { int expose = 0; #ifdef ECORE_XCB_SCREENSAVER xcb_get_screen_saver_cookie_t cookie; xcb_get_screen_saver_reply_t *reply; #endif LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; if (!_screensaver_avail) return 0; #ifdef ECORE_XCB_SCREENSAVER cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn); reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL); if (!reply) return 0; expose = reply->allow_exposures; free(reply); #endif return expose; } EAPI void ecore_x_screensaver_interval_set(int interval) { #ifdef ECORE_XCB_SCREENSAVER xcb_get_screen_saver_cookie_t cookie; xcb_get_screen_saver_reply_t *reply; uint16_t pto; uint8_t pblank, pexpose; #endif LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; if (!_screensaver_avail) return; #ifdef ECORE_XCB_SCREENSAVER cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn); reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL); if (!reply) return; pto = reply->timeout; pblank = reply->prefer_blanking; pexpose = reply->allow_exposures; free(reply); xcb_set_screen_saver(_ecore_xcb_conn, pto, interval, pblank, pexpose); #endif } EAPI int ecore_x_screensaver_interval_get(void) { int interval = 0; #ifdef ECORE_XCB_SCREENSAVER xcb_get_screen_saver_cookie_t cookie; xcb_get_screen_saver_reply_t *reply; #endif LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; if (!_screensaver_avail) return 0; #ifdef ECORE_XCB_SCREENSAVER cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn); reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL); if (!reply) return 0; interval = reply->interval; free(reply); #endif return interval; } EAPI void ecore_x_screensaver_event_listen_set(Eina_Bool on) { #ifdef ECORE_XCB_SCREENSAVER Ecore_X_Window root; #endif LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; if (!_screensaver_avail) return; #ifdef ECORE_XCB_SCREENSAVER root = ((xcb_screen_t *)_ecore_xcb_screen)->root; if (on) xcb_screensaver_select_input(_ecore_xcb_conn, root, XCB_SCREENSAVER_EVENT_NOTIFY_MASK); else xcb_screensaver_select_input(_ecore_xcb_conn, root, 0); #endif } EAPI Eina_Bool ecore_x_screensaver_event_available_get(void) { return _screensaver_avail; }