aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_sync.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_sync.c')
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_sync.c338
1 files changed, 0 insertions, 338 deletions
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_sync.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_sync.c
deleted file mode 100644
index 75f4e4f..0000000
--- a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_sync.c
+++ /dev/null
@@ -1,338 +0,0 @@
1#include "ecore_xcb_private.h"
2# ifdef ECORE_XCB_SYNC
3# include <xcb/sync.h>
4# endif
5
6/* local variables */
7static Eina_Bool _sync_avail = EINA_FALSE;
8
9/* external variables */
10int _ecore_xcb_event_sync = -1;
11
12void
13_ecore_xcb_sync_init(void)
14{
15 LOGFN(__FILE__, __LINE__, __FUNCTION__);
16
17#ifdef ECORE_XCB_SYNC
18 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_sync_id);
19#endif
20}
21
22void
23_ecore_xcb_sync_finalize(void)
24{
25#ifdef ECORE_XCB_SYNC
26 const xcb_query_extension_reply_t *ext_reply;
27#endif
28
29 LOGFN(__FILE__, __LINE__, __FUNCTION__);
30
31#ifdef ECORE_XCB_SYNC
32 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_sync_id);
33 if ((ext_reply) && (ext_reply->present))
34 {
35 xcb_sync_initialize_cookie_t cookie;
36 xcb_sync_initialize_reply_t *reply;
37
38 cookie =
39 xcb_sync_initialize_unchecked(_ecore_xcb_conn,
40 XCB_SYNC_MAJOR_VERSION,
41 XCB_SYNC_MINOR_VERSION);
42 reply = xcb_sync_initialize_reply(_ecore_xcb_conn, cookie, NULL);
43 if (reply)
44 {
45 if (reply->major_version >= 3) _sync_avail = EINA_TRUE;
46 free(reply);
47 }
48
49 if (_sync_avail)
50 _ecore_xcb_event_sync = ext_reply->first_event;
51 }
52#endif
53}
54
55void
56_ecore_xcb_sync_magic_send(int val,
57 Ecore_X_Window win)
58{
59 xcb_client_message_event_t ev;
60
61 LOGFN(__FILE__, __LINE__, __FUNCTION__);
62
63 memset(&ev, 0, sizeof(xcb_client_message_event_t));
64 ev.response_type = XCB_CLIENT_MESSAGE;
65 ev.format = 32;
66 ev.window = win;
67 ev.type = 27777;
68 ev.data.data32[0] = 0x7162534;
69 ev.data.data32[1] = (0x10000000 + val);
70 ev.data.data32[2] = win;
71
72 xcb_send_event(_ecore_xcb_conn, 0, win, XCB_EVENT_MASK_NO_EVENT,
73 (const char *)&ev);
74// ecore_x_flush();
75}
76
77/* public functions */
78EAPI Ecore_X_Sync_Alarm
79ecore_x_sync_alarm_new(Ecore_X_Sync_Counter counter)
80{
81#ifdef ECORE_XCB_SYNC
82 uint32_t list[6], mask;
83 xcb_sync_int64_t init;
84 Ecore_X_Sync_Alarm alarm;
85#endif
86
87 LOGFN(__FILE__, __LINE__, __FUNCTION__);
88 CHECK_XCB_CONN;
89
90 if ((!_sync_avail) || (!counter)) return 0;
91
92#ifdef ECORE_XCB_SYNC
93 init.lo = 0;
94 init.hi = 0;
95 xcb_sync_set_counter(_ecore_xcb_conn, counter, init);
96
97 mask = (XCB_SYNC_CA_COUNTER | XCB_SYNC_CA_VALUE_TYPE |
98 XCB_SYNC_CA_VALUE | XCB_SYNC_CA_TEST_TYPE |
99 XCB_SYNC_CA_DELTA | XCB_SYNC_CA_EVENTS);
100 list[0] = counter;
101 list[1] = XCB_SYNC_VALUETYPE_ABSOLUTE;
102 list[2] = 1;
103 list[3] = XCB_SYNC_TESTTYPE_POSITIVE_COMPARISON;
104 list[4] = 1;
105 list[5] = 1;
106 alarm = xcb_generate_id(_ecore_xcb_conn);
107
108 xcb_sync_create_alarm(_ecore_xcb_conn, alarm, mask, list);
109 ecore_x_sync(); // needed
110
111 return alarm;
112#endif
113 return 0;
114}
115
116EAPI Eina_Bool
117ecore_x_sync_alarm_free(Ecore_X_Sync_Alarm alarm)
118{
119 LOGFN(__FILE__, __LINE__, __FUNCTION__);
120 CHECK_XCB_CONN;
121
122 if ((!_sync_avail) || (!alarm)) return EINA_FALSE;
123
124#ifdef ECORE_XCB_SYNC
125 xcb_sync_destroy_alarm(_ecore_xcb_conn, alarm);
126// ecore_x_flush();
127 return EINA_TRUE;
128#endif
129
130 return EINA_FALSE;
131}
132
133EAPI Eina_Bool
134ecore_x_sync_counter_query(Ecore_X_Sync_Counter counter,
135 unsigned int *val)
136{
137#ifdef ECORE_XCB_SYNC
138 xcb_sync_query_counter_cookie_t cookie;
139 xcb_sync_query_counter_reply_t *reply;
140#endif
141
142 LOGFN(__FILE__, __LINE__, __FUNCTION__);
143 CHECK_XCB_CONN;
144
145 if ((!_sync_avail) || (!counter)) return EINA_FALSE;
146
147#ifdef ECORE_XCB_SYNC
148 cookie = xcb_sync_query_counter_unchecked(_ecore_xcb_conn, counter);
149 reply = xcb_sync_query_counter_reply(_ecore_xcb_conn, cookie, NULL);
150 if (reply)
151 {
152 if (val) *val = (unsigned int)reply->counter_value.lo;
153 free(reply);
154 return EINA_TRUE;
155 }
156#endif
157 return EINA_FALSE;
158}
159
160EAPI void
161ecore_x_sync_counter_inc(Ecore_X_Sync_Counter counter,
162 int by)
163{
164#ifdef ECORE_XCB_SYNC
165 xcb_sync_int64_t v;
166#endif
167
168 LOGFN(__FILE__, __LINE__, __FUNCTION__);
169 CHECK_XCB_CONN;
170
171 if ((!_sync_avail) || (!counter)) return;
172
173#ifdef ECORE_XCB_SYNC
174 v.hi = (by < 0) ? ~0 : 0;
175 v.lo = by;
176
177 xcb_sync_change_counter(_ecore_xcb_conn, counter, v);
178// ecore_x_flush();
179#endif
180}
181
182EAPI void
183ecore_x_sync_counter_val_wait(Ecore_X_Sync_Counter counter,
184 int val)
185{
186#ifdef ECORE_XCB_SYNC
187 xcb_sync_query_counter_cookie_t cookie;
188 xcb_sync_query_counter_reply_t *reply;
189 xcb_sync_int64_t v1, v2;
190 xcb_sync_waitcondition_t cond;
191#endif
192
193 LOGFN(__FILE__, __LINE__, __FUNCTION__);
194 CHECK_XCB_CONN;
195
196 if ((!_sync_avail) || (!counter)) return;
197
198#ifdef ECORE_XCB_SYNC
199 cookie = xcb_sync_query_counter_unchecked(_ecore_xcb_conn, counter);
200 reply = xcb_sync_query_counter_reply(_ecore_xcb_conn, cookie, NULL);
201 if (!reply) return;
202 v1 = reply->counter_value;
203 free(reply);
204
205 v1.hi = (val < 0) ? ~0 : 0;
206 v1.lo = val;
207 v2.hi = ((val + 1) < 0) ? ~0 : 0;
208 v2.lo = (val + 1);
209
210 cond.trigger.counter = counter;
211 cond.trigger.wait_type = XCB_SYNC_VALUETYPE_ABSOLUTE;
212 cond.trigger.wait_value = v1;
213 cond.trigger.test_type = XCB_SYNC_TESTTYPE_POSITIVE_COMPARISON;
214 cond.event_threshold = v2;
215
216 xcb_sync_await(_ecore_xcb_conn, 1, &cond);
217// ecore_x_flush();
218#endif
219}
220
221EAPI Ecore_X_Sync_Counter
222ecore_x_sync_counter_new(int val)
223{
224#ifdef ECORE_XCB_SYNC
225 xcb_sync_counter_t counter;
226 xcb_sync_int64_t v;
227#endif
228
229 LOGFN(__FILE__, __LINE__, __FUNCTION__);
230 CHECK_XCB_CONN;
231
232 if (!_sync_avail) return 0;
233
234#ifdef ECORE_XCB_SYNC
235 v.hi = (val < 0) ? ~0 : 0;
236 v.lo = val;
237
238 counter = xcb_generate_id(_ecore_xcb_conn);
239 xcb_sync_create_counter(_ecore_xcb_conn, counter, v);
240// ecore_x_flush();
241
242 return counter;
243#endif
244
245 return 0;
246}
247
248EAPI void
249ecore_x_sync_counter_free(Ecore_X_Sync_Counter counter)
250{
251 LOGFN(__FILE__, __LINE__, __FUNCTION__);
252 CHECK_XCB_CONN;
253
254 if ((!_sync_avail) || (!counter)) return;
255
256#ifdef ECORE_XCB_SYNC
257 xcb_sync_destroy_counter(_ecore_xcb_conn, counter);
258// ecore_x_flush();
259#endif
260}
261
262EAPI void
263ecore_x_sync_counter_set(Ecore_X_Sync_Counter counter,
264 int val)
265{
266#ifdef ECORE_XCB_SYNC
267 xcb_sync_int64_t v;
268#endif
269
270 LOGFN(__FILE__, __LINE__, __FUNCTION__);
271 CHECK_XCB_CONN;
272
273 if ((!_sync_avail) || (!counter)) return;
274
275#ifdef ECORE_XCB_SYNC
276 v.hi = (val < 0) ? ~0 : 0;
277 v.lo = val;
278
279 xcb_sync_set_counter(_ecore_xcb_conn, counter, v);
280// ecore_x_flush();
281#endif
282}
283
284EAPI void
285ecore_x_sync_counter_2_set(Ecore_X_Sync_Counter counter,
286 int val_hi,
287 unsigned int val_lo)
288{
289#ifdef ECORE_XCB_SYNC
290 xcb_sync_int64_t v;
291#endif
292
293 LOGFN(__FILE__, __LINE__, __FUNCTION__);
294 CHECK_XCB_CONN;
295
296 if ((!_sync_avail) || (!counter)) return;
297
298#ifdef ECORE_XCB_SYNC
299 v.hi = val_hi;
300 v.lo = val_lo;
301
302 xcb_sync_set_counter(_ecore_xcb_conn, counter, v);
303// ecore_x_flush();
304#endif
305}
306
307EAPI Eina_Bool
308ecore_x_sync_counter_2_query(Ecore_X_Sync_Counter counter,
309 int *val_hi,
310 unsigned int *val_lo)
311{
312#ifdef ECORE_XCB_SYNC
313 xcb_sync_query_counter_cookie_t cookie;
314 xcb_sync_query_counter_reply_t *reply;
315 xcb_sync_int64_t value;
316#endif
317
318 LOGFN(__FILE__, __LINE__, __FUNCTION__);
319 CHECK_XCB_CONN;
320
321 if ((!_sync_avail) || (!counter)) return EINA_FALSE;
322
323#ifdef ECORE_XCB_SYNC
324 cookie =
325 xcb_sync_query_counter_unchecked(_ecore_xcb_conn,
326 (xcb_sync_counter_t)counter);
327 reply = xcb_sync_query_counter_reply(_ecore_xcb_conn, cookie, NULL);
328 if (!reply) return EINA_FALSE;
329 value = reply->counter_value;
330 free(reply);
331 if (val_hi) *val_hi = (int)value.hi;
332 if (val_lo) *val_lo = (unsigned int)value.lo;
333 return EINA_TRUE;
334#endif
335
336 return EINA_FALSE;
337}
338