1 #include "ecore_xcb_private.h"
2 # ifdef ECORE_XCB_DAMAGE
3 # include <xcb/damage.h>
7 static Eina_Bool _damage_avail = EINA_FALSE;
9 /* external variables */
10 int _ecore_xcb_event_damage = -1;
13 _ecore_xcb_damage_init(void)
15 LOGFN(__FILE__, __LINE__, __FUNCTION__);
17 #ifdef ECORE_XCB_DAMAGE
18 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_damage_id);
23 _ecore_xcb_damage_finalize(void)
25 #ifdef ECORE_XCB_DAMAGE
26 const xcb_query_extension_reply_t *ext_reply;
29 LOGFN(__FILE__, __LINE__, __FUNCTION__);
31 #ifdef ECORE_XCB_DAMAGE
32 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_damage_id);
33 if ((ext_reply) && (ext_reply->present))
35 xcb_damage_query_version_cookie_t cookie;
36 xcb_damage_query_version_reply_t *reply;
39 xcb_damage_query_version_unchecked(_ecore_xcb_conn,
40 XCB_DAMAGE_MAJOR_VERSION,
41 XCB_DAMAGE_MINOR_VERSION);
42 reply = xcb_damage_query_version_reply(_ecore_xcb_conn, cookie, NULL);
45 _damage_avail = EINA_TRUE;
50 _ecore_xcb_event_damage = ext_reply->first_event;
56 * @defgroup Ecore_X_Damage_Group X Damage Extension Functions
57 * @ingroup Ecore_X_Group
59 * Functions related to the X Damage Extension.
63 ecore_x_damage_query(void)
69 * Create a damage object
71 * @param drawable The drawable to monitor
72 * @param level The level of the damage report
73 * @return The damage object
75 * Creates a damage object to monitor changes to @p drawable,
76 * with the level @p level.
78 * @ingroup Ecore_X_Damage_Group
81 ecore_x_damage_new(Ecore_X_Drawable drawable,
82 Ecore_X_Damage_Report_Level level)
84 Ecore_X_Damage damage = 0;
86 LOGFN(__FILE__, __LINE__, __FUNCTION__);
89 if (!_damage_avail) return 0;
91 #ifdef ECORE_XCB_DAMAGE
92 damage = xcb_generate_id(_ecore_xcb_conn);
93 xcb_damage_create(_ecore_xcb_conn, damage, drawable, level);
101 * Destroy a damage object
103 * @param damage The damage object to destroy
105 * Destroys the damage object @p damage
107 * @ingroup Ecore_X_Damage_Group
110 ecore_x_damage_free(Ecore_X_Damage damage)
112 LOGFN(__FILE__, __LINE__, __FUNCTION__);
115 if (!_damage_avail) return;
117 #ifdef ECORE_XCB_DAMAGE
118 xcb_damage_destroy(_ecore_xcb_conn, damage);
124 * Synchronously modifies the region
126 * @param damage The damage object to destroy
127 * @param repair The repair region
128 * @param parts The parts region
130 * Synchronously modifies the regions in the following manner:
131 * If @p repair is @c XCB_NONE:
133 * 2) damage = \<empty\>
135 * 1) parts = damage INTERSECT repair
136 * 2) damage = damage - parts
137 * 3) Generate DamageNotify for remaining damage areas
139 * @ingroup Ecore_X_Damage_Group
142 ecore_x_damage_subtract(Ecore_X_Damage damage,
143 Ecore_X_Region repair,
144 Ecore_X_Region parts)
146 LOGFN(__FILE__, __LINE__, __FUNCTION__);
149 if (!_damage_avail) return;
151 #ifdef ECORE_XCB_DAMAGE
152 xcb_damage_subtract(_ecore_xcb_conn, damage, repair, parts);