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
58 * Functions related to the X Damage Extension.
62 ecore_x_damage_query(void)
68 * Create a damage object
70 * @param drawable The drawable to monitor
71 * @param level The level of the damage report
72 * @return The damage object
74 * Creates a damage object to monitor changes to @p drawable,
75 * with the level @p level.
77 * @ingroup Ecore_X_Damage_Group
80 ecore_x_damage_new(Ecore_X_Drawable drawable,
81 Ecore_X_Damage_Report_Level level)
83 Ecore_X_Damage damage = 0;
85 LOGFN(__FILE__, __LINE__, __FUNCTION__);
88 if (!_damage_avail) return 0;
90 #ifdef ECORE_XCB_DAMAGE
91 damage = xcb_generate_id(_ecore_xcb_conn);
92 xcb_damage_create(_ecore_xcb_conn, damage, drawable, level);
100 * Destroy a damage object
102 * @param damage The damage object to destroy
104 * Destroys the damage object @p damage
106 * @ingroup Ecore_X_Damage_Group
109 ecore_x_damage_free(Ecore_X_Damage damage)
111 LOGFN(__FILE__, __LINE__, __FUNCTION__);
114 if (!_damage_avail) return;
116 #ifdef ECORE_XCB_DAMAGE
117 xcb_damage_destroy(_ecore_xcb_conn, damage);
123 * Synchronously modifies the region
125 * @param damage The damage object to destroy
126 * @param repair The repair region
127 * @param parts The parts region
129 * Synchronously modifies the regions in the following manner:
130 * If @p repair is @c XCB_NONE:
132 * 2) damage = \<empty\>
134 * 1) parts = damage INTERSECT repair
135 * 2) damage = damage - parts
136 * 3) Generate DamageNotify for remaining damage areas
138 * @ingroup Ecore_X_Damage_Group
141 ecore_x_damage_subtract(Ecore_X_Damage damage,
142 Ecore_X_Region repair,
143 Ecore_X_Region parts)
145 LOGFN(__FILE__, __LINE__, __FUNCTION__);
148 if (!_damage_avail) return;
150 #ifdef ECORE_XCB_DAMAGE
151 xcb_damage_subtract(_ecore_xcb_conn, damage, repair, parts);