[ecore] merged svn latest code (svn54830)
[profile/ivi/ecore.git] / src / lib / ecore_x / xcb / ecore_xcb_damage.c
1 #include "ecore_xcb_private.h"
2
3 /**
4  * @defgroup Ecore_X_Damage_Group X Damage Extension Functions
5  *
6  * Functions related to the X Damage extension.
7  */
8
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 */
13
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. */
18
19 void
20 _ecore_x_damage_init(const xcb_query_extension_reply_t *reply)
21 {
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);
25
26 #endif /* ECORE_XCB_DAMAGE */
27 } /* _ecore_x_damage_init */
28
29 void
30 _ecore_x_damage_init_finalize(void)
31 {
32 #ifdef ECORE_XCB_DAMAGE
33    xcb_damage_query_version_reply_t *reply;
34
35    reply = xcb_damage_query_version_reply(_ecore_xcb_conn,
36                                           _ecore_xcb_damage_init_cookie,
37                                           NULL);
38    if (reply)
39      {
40         if (reply->major_version >= 1)
41            _damage_available = 1;
42
43         free(reply);
44      }
45
46 #endif /* ECORE_XCB_DAMAGE */
47 } /* _ecore_x_damage_init_finalize */
48
49 /**
50  * Return whether the Damage Extension is available.
51  * @return 1 if the Damage Extension is available, 0 if not.
52  *
53  * Return 1 if the X server supports the Damage Extension version 1.0,
54  * 0 otherwise.
55  * @ingroup Ecore_X_Damage_Group
56  */
57 EAPI Eina_Bool
58 ecore_x_damage_query(void)
59 {
60 #ifdef ECORE_XCB_DAMAGE
61    return _damage_available;
62 #else /* ifdef ECORE_XCB_DAMAGE */
63    return 0;
64 #endif /* ECORE_XCB_DAMAGE */
65 } /* ecore_x_damage_query */
66
67 /**
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.
72  *
73  * Creates a damage object to monitor changes to @p drawable, with the
74  * level @p level.
75  * @ingroup Ecore_X_Damage_Group
76  */
77 EAPI Ecore_X_Damage
78 ecore_x_damage_new(Ecore_X_Drawable            drawable,
79                    Ecore_X_Damage_Report_Level level)
80 {
81    Ecore_X_Damage damage = 0;
82
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 */
87
88    return damage;
89 } /* ecore_x_damage_new */
90
91 /**
92  * Destroys a damage object.
93  * @param damage The damage object to destroy.
94  *
95  * Destroys the damage object @p damage.
96  * @ingroup Ecore_X_Damage_Group
97  */
98 EAPI void
99 ecore_x_damage_free(Ecore_X_Damage damage)
100 {
101 #ifdef ECORE_XCB_DAMAGE
102    xcb_damage_destroy(_ecore_xcb_conn, damage);
103 #endif /* ECORE_XCB_DAMAGE */
104 } /* ecore_x_damage_free */
105
106 /**
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.
111  *
112  * Synchronously modifies the regions in the following manner:
113  * If @p repair is @c XCB_NONE:
114  *   1) parts = damage
115  *   2) damage = <empty>
116  * Otherwise:
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
121  */
122 EAPI void
123 ecore_x_damage_subtract(Ecore_X_Damage damage,
124                         Ecore_X_Region repair,
125                         Ecore_X_Region parts)
126 {
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 */
131