efl/src/lib/ecore_x/xcb/ecore_xcb_screensaver.c

371 lines
8.9 KiB
C

#include "ecore_xcb_private.h"
# ifdef ECORE_XCB_SCREENSAVER
# include <xcb/screensaver.h>
# 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 |
XCB_SCREENSAVER_EVENT_CYCLE_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;
}
EAPI Eina_Bool
ecore_x_screensaver_custom_blanking_enable(void)
{
#ifdef ECORE_XCB_SCREENSAVER
uint32_t mask_list[9];
xcb_screensaver_set_attributes_checked
(_ecore_xcb_conn,
((xcb_screen_t *)_ecore_xcb_screen)->root,
-9999, -9999, 1, 1, 0,
XCB_WINDOW_CLASS_INPUT_ONLY,
XCB_COPY_FROM_PARENT, XCB_COPY_FROM_PARENT,
0, mask_list);
return EINA_TRUE;
#else
return EINA_FALSE;
#endif
}
EAPI Eina_Bool
ecore_x_screensaver_custom_blanking_disable(void)
{
#ifdef ECORE_XCB_SCREENSAVER
xcb_screensaver_unset_attributes_checked
(_ecore_xcb_conn,
((xcb_screen_t *)_ecore_xcb_screen)->root);
return EINA_TRUE;
#else
return EINA_FALSE;
#endif
}