efl/legacy/ecore/src/lib/ecore_x/ecore_xcb_xinerama.c

198 lines
5.3 KiB
C

/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "ecore_xcb_private.h"
/**
* @defgroup Ecore_X_Xinerama_Group X Xinerama Extension Functions
*
* Functions related to the X Xinerama extension.
*/
#ifdef ECORE_XCB_XINERAMA
static int _xinerama_available = 0;
static xcb_xinerama_query_version_cookie_t _ecore_xcb_xinerama_init_cookie;
#endif /* ECORE_XCB_XINERAMA */
/* To avoid round trips, the initialization is separated in 2
functions: _ecore_xcb_xinerama_init and
_ecore_xcb_xinerama_init_finalize. The first one gets the cookies and
the second one gets the replies. */
void
_ecore_x_xinerama_init(const xcb_query_extension_reply_t *reply)
{
#ifdef ECORE_XCB_XINERAMA
if (reply && (reply->present))
_ecore_xcb_xinerama_init_cookie = xcb_xinerama_query_version_unchecked(_ecore_xcb_conn, 1, 2);
#endif /* ECORE_XCB_XINERAMA */
}
void
_ecore_x_xinerama_init_finalize(void)
{
#ifdef ECORE_XCB_XINERAMA
xcb_xinerama_query_version_reply_t *reply;
reply = xcb_xinerama_query_version_reply(_ecore_xcb_conn,
_ecore_xcb_xinerama_init_cookie, NULL);
if (reply)
{
if ((reply->major >= 1) &&
(reply->minor >= 1))
_xinerama_available = 1;
free(reply);
}
#endif /* ECORE_XCB_XINERAMA */
}
/**
* Return whether the X server supports the Xinerama Extension.
* @return 1 if the X Xinerama Extension is available, 0 otherwise.
*
* Return 1 if the X server supports the Fixes Xinerama version 1.1,
* 0 otherwise.
* @ingroup Ecore_X_Xinerama_Group
*/
EAPI int
ecore_x_xinerama_query(void)
{
#ifdef ECORE_XCB_XINERAMA
return _xinerama_available;
#else
return 0;
#endif /* ECORE_XCB_XINERAMA */
}
/**
* Sends the XineramaQueryScreens request.
* @ingroup Ecore_X_Xinerama_Group
*/
EAPI void
ecore_x_xinerama_query_screens_prefetch(void)
{
#ifdef ECORE_XCB_XINERAMA
xcb_xinerama_query_screens_cookie_t cookie;
cookie = xcb_xinerama_query_screens_unchecked(_ecore_xcb_conn);
_ecore_xcb_cookie_cache(cookie.sequence);
#endif /* ECORE_XCB_XINERAMA */
}
/**
* Gets the reply of the XineramaQueryScreens request sent by ecore_x_xinerama_query_screens_prefetch().
* @ingroup Ecore_X_Xinerama_Group
*/
EAPI void
ecore_x_xinerama_query_screens_fetch(void)
{
#ifdef ECORE_XCB_XINERAMA
xcb_xinerama_query_screens_cookie_t cookie;
xcb_xinerama_query_screens_reply_t *reply;
cookie.sequence = _ecore_xcb_cookie_get();
reply = xcb_xinerama_query_screens_reply(_ecore_xcb_conn, cookie, NULL);
_ecore_xcb_reply_cache(reply);
#endif /* ECORE_XCB_XINERAMA */
}
/**
* Return the number of screens.
* @return The screen count.
*
* Return the number of screens.
*
* To use this function, you must call before, and in order,
* ecore_x_xinerama_query_screens_prefetch(), which sends the XineramaQueryScreens request,
* then ecore_x_xinerama_query_screens_fetch(), which gets the reply.
* @ingroup Ecore_X_Xinerama_Group
*/
EAPI int
ecore_x_xinerama_screen_count_get(void)
{
int screen_count = 0;
#ifdef ECORE_XCB_XINERAMA
xcb_xinerama_screen_info_iterator_t iter;
xcb_xinerama_query_screens_reply_t *reply;
reply = _ecore_xcb_reply_get();
if (!reply) return 0;
iter = xcb_xinerama_query_screens_screen_info_iterator(reply);
screen_count = iter.rem;
#endif /* ECORE_XCB_XINERAMA */
return screen_count;
}
/**
* Get the geometry of the screen.
* @param screen The screen (Unused).
* @param x The X coordinate of the screen.
* @param y The Y coordinate of the screen
* @param width The width of the screen
* @param height The height of the screen
* @return 1 on success, 0 otherwise.
*
* Get the geometry of the screen whose number is @p screen. The
* returned values are stored in @p x, @p y, @p width and @p height.
*
* To use this function, you must call before, and in order,
* ecore_x_xinerama_query_screens_prefetch(), which sends the XineramaQueryScreens request,
* then ecore_x_xinerama_query_screens_fetch(), which gets the reply.
* @ingroup Ecore_X_Xinerama_Group
*/
EAPI int
ecore_x_xinerama_screen_geometry_get(int screen,
int *x,
int *y,
int *width,
int *height)
{
#ifdef ECORE_XCB_XINERAMA
xcb_xinerama_screen_info_iterator_t iter;
xcb_xinerama_query_screens_reply_t *reply;
reply = _ecore_xcb_reply_get();
if (!reply)
{
if (x) *x = 0;
if (y) *y = 0;
if (width) *width = ((xcb_screen_t *)_ecore_xcb_screen)->width_in_pixels;
if (height) *height = ((xcb_screen_t *)_ecore_xcb_screen)->height_in_pixels;
return 0;
}
iter = xcb_xinerama_query_screens_screen_info_iterator(reply);
for (; iter.rem; screen--, xcb_xinerama_screen_info_next(&iter))
{
if (screen == 0)
{
if (x) *x = iter.data->x_org;
if (y) *y = iter.data->y_org;
if (width) *width = iter.data->width;
if (height) *height = iter.data->height;
return 1;
}
}
#endif /* ECORE_XCB_XINERAMA */
if (x) *x = 0;
if (y) *y = 0;
if (width) *width = ((xcb_screen_t *)_ecore_xcb_screen)->width_in_pixels;
if (height) *height = ((xcb_screen_t *)_ecore_xcb_screen)->height_in_pixels;
return 0;
}