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

292 lines
6.8 KiB
C

#include "ecore_xcb_private.h"
#ifdef ECORE_XCB_COMPOSITE
# include <xcb/composite.h>
#endif
/* local variables */
static Eina_Bool _composite_avail = EINA_FALSE;
void
_ecore_xcb_composite_init(void)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
#ifdef ECORE_XCB_COMPOSITE
xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_composite_id);
#endif
}
void
_ecore_xcb_composite_finalize(void)
{
#ifdef ECORE_XCB_COMPOSITE
const xcb_query_extension_reply_t *ext_reply;
#endif
LOGFN(__FILE__, __LINE__, __FUNCTION__);
#ifdef ECORE_XCB_COMPOSITE
ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_composite_id);
if ((ext_reply) && (ext_reply->present))
{
xcb_composite_query_version_cookie_t cookie;
xcb_composite_query_version_reply_t *reply;
cookie =
xcb_composite_query_version_unchecked(_ecore_xcb_conn,
XCB_COMPOSITE_MAJOR_VERSION,
XCB_COMPOSITE_MINOR_VERSION);
reply =
xcb_composite_query_version_reply(_ecore_xcb_conn, cookie, NULL);
if (reply)
{
// if ((reply->major_version >= XCB_COMPOSITE_MAJOR_VERSION) &&
if (reply->minor_version >= XCB_COMPOSITE_MINOR_VERSION)
{
# ifdef ECORE_XCB_RENDER
if (_ecore_xcb_render_avail_get())
{
# ifdef ECORE_XCB_XFIXES
if (_ecore_xcb_xfixes_avail_get())
_composite_avail = EINA_TRUE;
# endif
}
# endif
}
free(reply);
}
}
#endif
}
/**
* @defgroup Ecore_X_Composite_Group X Composite Extension Functions
* @ingroup Ecore_X_Group
*
* Functions related to the X Composite Extension
*/
/**
* Return whether the Composite Extension is available
*
* @return @c EINA_TRUE is the Composite Extension is available, @c EINA_FALSE
* if not.
*
* @ingroup Ecore_X_Composite_Group
*/
EAPI Eina_Bool
ecore_x_composite_query(void)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
return _composite_avail;
}
EAPI void
ecore_x_composite_redirect_window(Ecore_X_Window win,
Ecore_X_Composite_Update_Type type)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
CHECK_XCB_CONN;
if (!_composite_avail) return;
#ifdef ECORE_XCB_COMPOSITE
uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
switch (type)
{
case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
break;
case ECORE_X_COMPOSITE_UPDATE_MANUAL:
update = XCB_COMPOSITE_REDIRECT_MANUAL;
break;
}
xcb_composite_redirect_window(_ecore_xcb_conn, win, update);
// ecore_x_flush();
#endif
}
EAPI void
ecore_x_composite_redirect_subwindows(Ecore_X_Window win,
Ecore_X_Composite_Update_Type type)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
CHECK_XCB_CONN;
if (!_composite_avail) return;
#ifdef ECORE_XCB_COMPOSITE
uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
switch (type)
{
case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
break;
case ECORE_X_COMPOSITE_UPDATE_MANUAL:
update = XCB_COMPOSITE_REDIRECT_MANUAL;
break;
}
xcb_composite_redirect_subwindows(_ecore_xcb_conn, win, update);
// ecore_x_flush();
#endif
}
EAPI void
ecore_x_composite_unredirect_window(Ecore_X_Window win,
Ecore_X_Composite_Update_Type type)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
CHECK_XCB_CONN;
if (!_composite_avail) return;
#ifdef ECORE_XCB_COMPOSITE
uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
switch (type)
{
case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
break;
case ECORE_X_COMPOSITE_UPDATE_MANUAL:
update = XCB_COMPOSITE_REDIRECT_MANUAL;
break;
}
xcb_composite_unredirect_window(_ecore_xcb_conn, win, update);
// ecore_x_flush();
#endif
}
EAPI void
ecore_x_composite_unredirect_subwindows(Ecore_X_Window win,
Ecore_X_Composite_Update_Type type)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
CHECK_XCB_CONN;
if (!_composite_avail) return;
#ifdef ECORE_XCB_COMPOSITE
uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
switch (type)
{
case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
break;
case ECORE_X_COMPOSITE_UPDATE_MANUAL:
update = XCB_COMPOSITE_REDIRECT_MANUAL;
break;
}
xcb_composite_unredirect_subwindows(_ecore_xcb_conn, win, update);
// ecore_x_flush();
#endif
}
EAPI Ecore_X_Pixmap
ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
{
#ifdef ECORE_XCB_COMPOSITE
Ecore_X_Pixmap pmap = XCB_NONE;
#endif
LOGFN(__FILE__, __LINE__, __FUNCTION__);
CHECK_XCB_CONN;
if (!_composite_avail) return XCB_NONE;
#ifdef ECORE_XCB_COMPOSITE
pmap = xcb_generate_id(_ecore_xcb_conn);
xcb_composite_name_window_pixmap(_ecore_xcb_conn, win, pmap);
// ecore_x_flush();
#endif
return pmap;
}
EAPI void
ecore_x_composite_window_events_disable(Ecore_X_Window win)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
CHECK_XCB_CONN;
if (!_composite_avail) return;
#ifdef ECORE_XCB_SHAPE
ecore_x_window_shape_input_rectangle_set(win, -1, -1, 1, 1);
// ecore_x_flush();
#else
return;
win = 0;
#endif
}
EAPI void
ecore_x_composite_window_events_enable(Ecore_X_Window win)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
CHECK_XCB_CONN;
if (!_composite_avail) return;
#ifdef ECORE_XCB_SHAPE
ecore_x_window_shape_input_rectangle_set(win, 0, 0, 65535, 65535);
// ecore_x_flush();
#else
return;
win = 0;
#endif
}
EAPI Ecore_X_Window
ecore_x_composite_render_window_enable(Ecore_X_Window root)
{
Ecore_X_Window win = 0;
#ifdef ECORE_XCB_COMPOSITE
xcb_composite_get_overlay_window_cookie_t cookie;
xcb_composite_get_overlay_window_reply_t *reply;
#endif
LOGFN(__FILE__, __LINE__, __FUNCTION__);
CHECK_XCB_CONN;
if (!_composite_avail) return 0;
#ifdef ECORE_XCB_COMPOSITE
cookie = xcb_composite_get_overlay_window_unchecked(_ecore_xcb_conn, root);
reply =
xcb_composite_get_overlay_window_reply(_ecore_xcb_conn, cookie, NULL);
if (!reply) return win;
win = reply->overlay_win;
free(reply);
ecore_x_composite_window_events_disable(win);
// ecore_x_flush();
#endif
return win;
}
EAPI void
ecore_x_composite_render_window_disable(Ecore_X_Window win)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
CHECK_XCB_CONN;
if (!_composite_avail) return;
#ifdef ECORE_XCB_COMPOSITE
xcb_composite_release_overlay_window(_ecore_xcb_conn, win);
// ecore_x_flush();
#endif
}