efl/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_damage.c

139 lines
3.3 KiB
C

/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "ecore_xcb_private.h"
/**
* @defgroup Ecore_X_Damage_Group X Damage Extension Functions
*
* Functions related to the X Damage extension.
*/
#ifdef ECORE_XCB_DAMAGE
static uint8_t _damage_available = 0;
static xcb_damage_query_version_cookie_t _ecore_xcb_damage_init_cookie;
#endif /* ECORE_XCB_DAMAGE */
/* To avoid round trips, the initialization is separated in 2
functions: _ecore_xcb_damage_init and
_ecore_xcb_damage_init_finalize. The first one gets the cookies and
the second one gets the replies. */
void
_ecore_x_damage_init(const xcb_query_extension_reply_t *reply)
{
#ifdef ECORE_XCB_DAMAGE
if (reply && (reply->present))
_ecore_xcb_damage_init_cookie = xcb_damage_query_version_unchecked(_ecore_xcb_conn, 1, 1);
#endif /* ECORE_XCB_DAMAGE */
}
void
_ecore_x_damage_init_finalize(void)
{
#ifdef ECORE_XCB_DAMAGE
xcb_damage_query_version_reply_t *reply;
reply = xcb_damage_query_version_reply(_ecore_xcb_conn,
_ecore_xcb_damage_init_cookie,
NULL);
if (reply)
{
if (reply->major_version >= 1)
_damage_available = 1;
free(reply);
}
#endif /* ECORE_XCB_DAMAGE */
}
/**
* Return whether the Damage Extension is available.
* @return 1 if the Damage Extension is available, 0 if not.
*
* Return 1 if the X server supports the Damage Extension version 1.0,
* 0 otherwise.
* @ingroup Ecore_X_Damage_Group
*/
EAPI int
ecore_x_damage_query(void)
{
#ifdef ECORE_XCB_DAMAGE
return _damage_available;
#else
return 0;
#endif /* ECORE_XCB_DAMAGE */
}
/**
* Creates a damage object.
* @param drawable The drawable to monotor.
* @param level The level of the damage report.
* @return The damage object.
*
* Creates a damage object to monitor changes to @p drawable, with the
* level @p level.
* @ingroup Ecore_X_Damage_Group
*/
EAPI Ecore_X_Damage
ecore_x_damage_new(Ecore_X_Drawable drawable,
Ecore_X_Damage_Report_Level level)
{
Ecore_X_Damage damage = 0;
#ifdef ECORE_XCB_DAMAGE
damage = xcb_generate_id(_ecore_xcb_conn);
xcb_damage_create(_ecore_xcb_conn, damage, drawable, level);
#endif /* ECORE_XCB_DAMAGE */
return damage;
}
/**
* Destroys a damage object.
* @param damage The damage object to destroy.
*
* Destroys the damage object @p damage.
* @ingroup Ecore_X_Damage_Group
*/
EAPI void
ecore_x_damage_del(Ecore_X_Damage damage)
{
#ifdef ECORE_XCB_DAMAGE
xcb_damage_destroy(_ecore_xcb_conn, damage);
#endif /* ECORE_XCB_DAMAGE */
}
/**
* Synchronously modifies the region.
* @param damage The damage object to destroy.
* @param repair The repair region.
* @param parts The parts region.
*
* Synchronously modifies the regions in the following manner:
* If @p repair is @c XCB_NONE:
* 1) parts = damage
* 2) damage = <empty>
* Otherwise:
* 1) parts = damage INTERSECT repair
* 2) damage = damage - parts
* 3) Generate DamageNotify for remaining damage areas
* @ingroup Ecore_X_Damage_Group
*/
EAPI void
ecore_x_damage_subtract(Ecore_X_Damage damage,
Ecore_X_Region repair,
Ecore_X_Region parts)
{
#ifdef ECORE_XCB_DAMAGE
xcb_damage_subtract(_ecore_xcb_conn, damage, repair, parts);
#endif /* ECORE_XCB_DAMAGE */
}