1 #include "ecore_xcb_private.h"
4 * @defgroup Ecore_X_Damage_Group X Damage Extension Functions
6 * Functions related to the X Damage extension.
9 #ifdef ECORE_XCB_DAMAGE
10 static uint8_t _damage_available = 0;
11 static xcb_damage_query_version_cookie_t _ecore_xcb_damage_init_cookie;
12 #endif /* ECORE_XCB_DAMAGE */
14 /* To avoid round trips, the initialization is separated in 2
15 functions: _ecore_xcb_damage_init and
16 _ecore_xcb_damage_init_finalize. The first one gets the cookies and
17 the second one gets the replies. */
20 _ecore_x_damage_init(const xcb_query_extension_reply_t *reply)
22 #ifdef ECORE_XCB_DAMAGE
23 if (reply && (reply->present))
24 _ecore_xcb_damage_init_cookie = xcb_damage_query_version_unchecked(_ecore_xcb_conn, 1, 1);
26 #endif /* ECORE_XCB_DAMAGE */
27 } /* _ecore_x_damage_init */
30 _ecore_x_damage_init_finalize(void)
32 #ifdef ECORE_XCB_DAMAGE
33 xcb_damage_query_version_reply_t *reply;
35 reply = xcb_damage_query_version_reply(_ecore_xcb_conn,
36 _ecore_xcb_damage_init_cookie,
40 if (reply->major_version >= 1)
41 _damage_available = 1;
46 #endif /* ECORE_XCB_DAMAGE */
47 } /* _ecore_x_damage_init_finalize */
50 * Return whether the Damage Extension is available.
51 * @return 1 if the Damage Extension is available, 0 if not.
53 * Return 1 if the X server supports the Damage Extension version 1.0,
55 * @ingroup Ecore_X_Damage_Group
58 ecore_x_damage_query(void)
60 #ifdef ECORE_XCB_DAMAGE
61 return _damage_available;
62 #else /* ifdef ECORE_XCB_DAMAGE */
64 #endif /* ECORE_XCB_DAMAGE */
65 } /* ecore_x_damage_query */
68 * Creates a damage object.
69 * @param drawable The drawable to monotor.
70 * @param level The level of the damage report.
71 * @return The damage object.
73 * Creates a damage object to monitor changes to @p drawable, with the
75 * @ingroup Ecore_X_Damage_Group
78 ecore_x_damage_new(Ecore_X_Drawable drawable,
79 Ecore_X_Damage_Report_Level level)
81 Ecore_X_Damage damage = 0;
83 #ifdef ECORE_XCB_DAMAGE
84 damage = xcb_generate_id(_ecore_xcb_conn);
85 xcb_damage_create(_ecore_xcb_conn, damage, drawable, level);
86 #endif /* ECORE_XCB_DAMAGE */
89 } /* ecore_x_damage_new */
92 * Destroys a damage object.
93 * @param damage The damage object to destroy.
95 * Destroys the damage object @p damage.
96 * @ingroup Ecore_X_Damage_Group
99 ecore_x_damage_free(Ecore_X_Damage damage)
101 #ifdef ECORE_XCB_DAMAGE
102 xcb_damage_destroy(_ecore_xcb_conn, damage);
103 #endif /* ECORE_XCB_DAMAGE */
104 } /* ecore_x_damage_free */
107 * Synchronously modifies the region.
108 * @param damage The damage object to destroy.
109 * @param repair The repair region.
110 * @param parts The parts region.
112 * Synchronously modifies the regions in the following manner:
113 * If @p repair is @c XCB_NONE:
115 * 2) damage = <empty>
117 * 1) parts = damage INTERSECT repair
118 * 2) damage = damage - parts
119 * 3) Generate DamageNotify for remaining damage areas
120 * @ingroup Ecore_X_Damage_Group
123 ecore_x_damage_subtract(Ecore_X_Damage damage,
124 Ecore_X_Region repair,
125 Ecore_X_Region parts)
127 #ifdef ECORE_XCB_DAMAGE
128 xcb_damage_subtract(_ecore_xcb_conn, damage, repair, parts);
129 #endif /* ECORE_XCB_DAMAGE */
130 } /* ecore_x_damage_subtract */