svn update: 48958 (latest:48959)
[framework/uifw/ecore.git] / src / lib / ecore_x / xcb / ecore_xcb_atom.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4
5 #include <string.h>
6
7 #include "ecore_xcb_private.h"
8
9
10 /**
11  * @defgroup Ecore_X_Atom_Group XCB Atom Functions
12  *
13  * Functions that operate on atoms.
14  */
15
16 /*********/
17 /* Atoms */
18 /*********/
19
20 #include "ecore_x_atoms_decl.h"
21
22 /* To avoid round trips, the initialization is separated in 2
23    functions: _ecore_xcb_atom_init and
24    _ecore_xcb_atom_init_finalize. The first one gets the cookies and
25    the second one gets the replies and set the atoms. */
26
27 #define FETCH_ATOM(s) \
28    atom_cookies[i] = xcb_intern_atom(_ecore_xcb_conn, 0, strlen(s), s); \
29    i++
30
31 #define FETCH_ATOM_FINALIZE(x) \
32    reply = xcb_intern_atom_reply(_ecore_xcb_conn, atom_cookies[i], NULL); \
33    x = reply->atom; \
34    free(reply); \
35    i++;
36
37 void
38 _ecore_x_atom_init(xcb_intern_atom_cookie_t *atom_cookies)
39 {
40    int i = 0;
41
42    /* generic atoms */
43    FETCH_ATOM("COMPOUND_TEXT");
44    FETCH_ATOM("FILE_NAME");
45    FETCH_ATOM("TEXT");
46    FETCH_ATOM("UTF8_STRING");
47
48    /* dnd atoms */
49    FETCH_ATOM("JXSelectionWindowProperty");
50    FETCH_ATOM("XdndSelection");
51    FETCH_ATOM("XdndAware");
52    FETCH_ATOM("XdndEnter");
53    FETCH_ATOM("XdndTypeList");
54    FETCH_ATOM("XdndPosition");
55    FETCH_ATOM("XdndActionCopy");
56    FETCH_ATOM("XdndActionMove");
57    FETCH_ATOM("XdndActionPrivate");
58    FETCH_ATOM("XdndActionAsk");
59    FETCH_ATOM("XdndActionList");
60    FETCH_ATOM("XdndActionLink");
61    FETCH_ATOM("XdndActionDescription");
62    FETCH_ATOM("XdndProxy");
63    FETCH_ATOM("XdndStatus");
64    FETCH_ATOM("XdndLeave");
65    FETCH_ATOM("XdndDrop");
66    FETCH_ATOM("XdndFinished");
67
68    /* old E atom */
69    FETCH_ATOM("_E_FRAME_SIZE");
70
71    /* old Gnome atom */
72    FETCH_ATOM("_WIN_LAYER");
73
74    /* ICCCM */
75    FETCH_ATOM("WM_PROTOCOLS");
76    FETCH_ATOM("WM_COLORMAP_WINDOWS");
77
78    FETCH_ATOM("WM_STATE");
79
80    FETCH_ATOM("WM_CHANGE_STATE");
81
82    FETCH_ATOM("WM_TAKE_FOCUS");
83    FETCH_ATOM("WM_SAVE_YOURSELF");
84    FETCH_ATOM("WM_DELETE_WINDOW");
85
86    FETCH_ATOM("WM_COLORMAP_NOTIFY");
87
88    FETCH_ATOM("SM_CLIENT_ID");
89    FETCH_ATOM("WM_CLIENT_LEADER");
90    FETCH_ATOM("WM_WINDOW_ROLE");
91
92    /* Motif WM atom */
93    FETCH_ATOM("_MOTIF_WM_HINTS");
94
95    /* NetWM atoms */
96    FETCH_ATOM("_NET_SUPPORTED");
97    FETCH_ATOM("_NET_CLIENT_LIST");
98    FETCH_ATOM("_NET_CLIENT_LIST_STACKING");
99    FETCH_ATOM("_NET_NUMBER_OF_DESKTOPS");
100    FETCH_ATOM("_NET_DESKTOP_GEOMETRY");
101    FETCH_ATOM("_NET_DESKTOP_VIEWPORT");
102    FETCH_ATOM("_NET_CURRENT_DESKTOP");
103    FETCH_ATOM("_NET_DESKTOP_NAMES");
104    FETCH_ATOM("_NET_ACTIVE_WINDOW");
105    FETCH_ATOM("_NET_WORKAREA");
106    FETCH_ATOM("_NET_SUPPORTING_WM_CHECK");
107    FETCH_ATOM("_NET_VIRTUAL_ROOTS");
108    FETCH_ATOM("_NET_DESKTOP_LAYOUT");
109    FETCH_ATOM("_NET_SHOWING_DESKTOP");
110
111    FETCH_ATOM("_NET_CLOSE_WINDOW");
112    FETCH_ATOM("_NET_MOVERESIZE_WINDOW");
113    FETCH_ATOM("_NET_WM_MOVERESIZE");
114    FETCH_ATOM("_NET_RESTACK_WINDOW");
115    FETCH_ATOM("_NET_REQUEST_FRAME_EXTENTS");
116
117    FETCH_ATOM("_NET_WM_NAME");
118    FETCH_ATOM("_NET_WM_VISIBLE_NAME");
119    FETCH_ATOM("_NET_WM_ICON_NAME");
120    FETCH_ATOM("_NET_WM_VISIBLE_ICON_NAME");
121    FETCH_ATOM("_NET_WM_DESKTOP");
122
123    FETCH_ATOM("_NET_WM_WINDOW_TYPE");
124    FETCH_ATOM("_NET_WM_WINDOW_TYPE_DESKTOP");
125    FETCH_ATOM("_NET_WM_WINDOW_TYPE_DOCK");
126    FETCH_ATOM("_NET_WM_WINDOW_TYPE_TOOLBAR");
127    FETCH_ATOM("_NET_WM_WINDOW_TYPE_MENU");
128    FETCH_ATOM("_NET_WM_WINDOW_TYPE_UTILITY");
129    FETCH_ATOM("_NET_WM_WINDOW_TYPE_SPLASH");
130    FETCH_ATOM("_NET_WM_WINDOW_TYPE_DIALOG");
131    FETCH_ATOM("_NET_WM_WINDOW_TYPE_NORMAL");
132
133    FETCH_ATOM("_NET_WM_STATE");
134    FETCH_ATOM("_NET_WM_STATE_MODAL");
135    FETCH_ATOM("_NET_WM_STATE_STICKY");
136    FETCH_ATOM("_NET_WM_STATE_MAXIMIZED_VERT");
137    FETCH_ATOM("_NET_WM_STATE_MAXIMIZED_HORZ");
138    FETCH_ATOM("_NET_WM_STATE_SHADED");
139    FETCH_ATOM("_NET_WM_STATE_SKIP_TASKBAR");
140    FETCH_ATOM("_NET_WM_STATE_SKIP_PAGER");
141    FETCH_ATOM("_NET_WM_STATE_HIDDEN");
142    FETCH_ATOM("_NET_WM_STATE_FULLSCREEN");
143    FETCH_ATOM("_NET_WM_STATE_ABOVE");
144    FETCH_ATOM("_NET_WM_STATE_BELOW");
145    FETCH_ATOM("_NET_WM_STATE_DEMANDS_ATTENTION");
146
147    FETCH_ATOM("_NET_WM_ALLOWED_ACTIONS");
148    FETCH_ATOM("_NET_WM_ACTION_MOVE");
149    FETCH_ATOM("_NET_WM_ACTION_RESIZE");
150    FETCH_ATOM("_NET_WM_ACTION_MINIMIZE");
151    FETCH_ATOM("_NET_WM_ACTION_SHADE");
152    FETCH_ATOM("_NET_WM_ACTION_STICK");
153    FETCH_ATOM("_NET_WM_ACTION_MAXIMIZE_HORZ");
154    FETCH_ATOM("_NET_WM_ACTION_MAXIMIZE_VERT");
155    FETCH_ATOM("_NET_WM_ACTION_FULLSCREEN");
156    FETCH_ATOM("_NET_WM_ACTION_CHANGE_DESKTOP");
157    FETCH_ATOM("_NET_WM_ACTION_CLOSE");
158    FETCH_ATOM("_NET_WM_ACTION_ABOVE");
159    FETCH_ATOM("_NET_WM_ACTION_BELOW");
160
161    FETCH_ATOM("_NET_WM_STRUT");
162    FETCH_ATOM("_NET_WM_STRUT_PARTIAL");
163    FETCH_ATOM("_NET_WM_ICON_GEOMETRY");
164    FETCH_ATOM("_NET_WM_ICON");
165    FETCH_ATOM("_NET_WM_PID");
166    FETCH_ATOM("_NET_WM_HANDLED_ICONS");
167    FETCH_ATOM("_NET_WM_USER_TIME");
168    FETCH_ATOM("_NET_STARTUP_ID");
169    FETCH_ATOM("_NET_FRAME_EXTENTS");
170
171    FETCH_ATOM("_NET_WM_PING");
172    FETCH_ATOM("_NET_WM_SYNC_REQUEST");
173    FETCH_ATOM("_NET_WM_SYNC_REQUEST_COUNTER");
174
175    FETCH_ATOM("_NET_WM_WINDOW_OPACITY");
176    FETCH_ATOM("_NET_WM_WINDOW_SHADOW");
177    FETCH_ATOM("_NET_WM_WINDOW_SHADE");
178
179    FETCH_ATOM("_NET_STARTUP_INFO_BEGIN");
180    FETCH_ATOM("_NET_STARTUP_INFO");
181
182    /* selection atoms */
183    FETCH_ATOM("TARGETS");
184    FETCH_ATOM("CLIPBOARD");
185    FETCH_ATOM("_ECORE_SELECTION_PRIMARY");
186    FETCH_ATOM("_ECORE_SELECTION_SECONDARY");
187    FETCH_ATOM("_ECORE_SELECTION_CLIPBOARD");
188
189    /* These atoms are already internally defined */
190    ECORE_X_ATOM_SELECTION_PRIMARY   = 1;
191    ECORE_X_ATOM_SELECTION_SECONDARY = 2;
192    ECORE_X_ATOM_ATOM                = 4;
193    ECORE_X_ATOM_CARDINAL            = 6;
194    ECORE_X_ATOM_STRING              = 31;
195    ECORE_X_ATOM_WINDOW              = 33;
196    ECORE_X_ATOM_WM_NAME             = 39;
197    ECORE_X_ATOM_WM_ICON_NAME        = 37;
198    ECORE_X_ATOM_WM_NORMAL_HINTS     = 40;
199    ECORE_X_ATOM_WM_SIZE_HINTS       = 41;
200    ECORE_X_ATOM_WM_HINTS            = 35;
201    ECORE_X_ATOM_WM_CLASS            = 67;
202    ECORE_X_ATOM_WM_TRANSIENT_FOR    = 68;
203    ECORE_X_ATOM_WM_COMMAND          = 34;
204    ECORE_X_ATOM_WM_CLIENT_MACHINE   = 36;
205    ECORE_X_ATOM_WM_ICON_SIZE        = 38;
206
207    /* Initialize the globally defined xdnd atoms */
208    ECORE_X_DND_ACTION_COPY          = ECORE_X_ATOM_XDND_ACTION_COPY;
209    ECORE_X_DND_ACTION_MOVE          = ECORE_X_ATOM_XDND_ACTION_MOVE;
210    ECORE_X_DND_ACTION_LINK          = ECORE_X_ATOM_XDND_ACTION_LINK;
211    ECORE_X_DND_ACTION_ASK           = ECORE_X_ATOM_XDND_ACTION_ASK;
212    ECORE_X_DND_ACTION_PRIVATE       = ECORE_X_ATOM_XDND_ACTION_PRIVATE;
213 }
214
215 void
216 _ecore_x_atom_init_finalize(xcb_intern_atom_cookie_t *atom_cookies)
217 {
218    xcb_intern_atom_reply_t *reply = NULL;
219    int i = 0;
220
221    /* generic atoms */
222    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_COMPOUND_TEXT);
223    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_FILE_NAME);
224    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_TEXT);
225    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_UTF8_STRING);
226
227    /* dnd atoms */
228    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_SELECTION_PROP_XDND);
229    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_SELECTION_XDND);
230    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_AWARE);
231    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_ENTER);
232    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_TYPE_LIST);
233    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_POSITION);
234    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_ACTION_COPY);
235    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_ACTION_MOVE);
236    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_ACTION_PRIVATE);
237    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_ACTION_ASK);
238    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_ACTION_LIST);
239    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_ACTION_LINK);
240    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_ACTION_DESCRIPTION);
241    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_PROXY);
242    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_STATUS);
243    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_LEAVE);
244    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_DROP);
245    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_XDND_FINISHED);
246
247    /* old E atom */
248    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_E_FRAME_SIZE);
249
250    /* old Gnome atom */
251    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_WIN_LAYER);
252
253    /* ICCCM */
254    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_WM_PROTOCOLS);
255    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_WM_COLORMAP_WINDOWS);
256
257    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_WM_STATE);
258
259    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_WM_CHANGE_STATE);
260
261    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_WM_TAKE_FOCUS);
262    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_WM_SAVE_YOURSELF);
263    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_WM_DELETE_WINDOW);
264
265    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_WM_COLORMAP_NOTIFY);
266
267    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_SM_CLIENT_ID);
268    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_WM_CLIENT_LEADER);
269    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_WM_WINDOW_ROLE);
270
271    /* Motif WM atom */
272    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_MOTIF_WM_HINTS);
273
274    /* NetWM atoms */
275    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_SUPPORTED);
276    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_CLIENT_LIST);
277    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_CLIENT_LIST_STACKING);
278    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS);
279    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_DESKTOP_GEOMETRY);
280    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_DESKTOP_VIEWPORT);
281    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_CURRENT_DESKTOP);
282    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_DESKTOP_NAMES);
283    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_ACTIVE_WINDOW);
284    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WORKAREA);
285    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK);
286    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_VIRTUAL_ROOTS);
287    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_DESKTOP_LAYOUT);
288    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_SHOWING_DESKTOP);
289
290    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_CLOSE_WINDOW);
291    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_MOVERESIZE_WINDOW);
292    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_MOVERESIZE);
293    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_RESTACK_WINDOW);
294    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS);
295
296    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_NAME);
297    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
298    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ICON_NAME);
299    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME);
300    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_DESKTOP);
301
302    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_WINDOW_TYPE);
303    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP);
304    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK);
305    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR);
306    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU);
307    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY);
308    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH);
309    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG);
310    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL);
311
312    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STATE);
313    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STATE_MODAL);
314    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STATE_STICKY);
315    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT);
316    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ);
317    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STATE_SHADED);
318    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR);
319    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER);
320    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STATE_HIDDEN);
321    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN);
322    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STATE_ABOVE);
323    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STATE_BELOW);
324    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION);
325
326    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS);
327    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ACTION_MOVE);
328    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ACTION_RESIZE);
329    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE);
330    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ACTION_SHADE);
331    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ACTION_STICK);
332    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ);
333    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT);
334    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN);
335    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP);
336    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ACTION_CLOSE);
337    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ACTION_ABOVE);
338    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ACTION_BELOW);
339
340    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STRUT);
341    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_STRUT_PARTIAL);
342    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ICON_GEOMETRY);
343    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_ICON);
344    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_PID);
345    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_HANDLED_ICONS);
346    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_USER_TIME);
347    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_STARTUP_ID);
348    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_FRAME_EXTENTS);
349
350    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_PING);
351    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_SYNC_REQUEST);
352    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER);
353
354    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_WINDOW_OPACITY);
355    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_WINDOW_SHADOW);
356    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_WM_WINDOW_SHADE);
357
358    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN);
359    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_NET_STARTUP_INFO);
360
361    /* selection atoms */
362    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_SELECTION_TARGETS);
363    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_SELECTION_CLIPBOARD);
364    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_SELECTION_PROP_PRIMARY);
365    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_SELECTION_PROP_SECONDARY);
366    FETCH_ATOM_FINALIZE(ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD);
367 }
368
369
370 /**
371  * Sends the InternAtom request.
372  * @param name Name of the requested atom.
373  * @ingroup Ecore_X_Atom_Group
374  */
375 EAPI void
376 ecore_x_atom_get_prefetch(const char *name)
377 {
378    xcb_intern_atom_cookie_t cookie;
379
380    cookie = xcb_intern_atom_unchecked(_ecore_xcb_conn, 0, strlen(name), name);
381    _ecore_xcb_cookie_cache(cookie.sequence);
382 }
383
384 /**
385  * Gets the reply of the InternAtom request sent by ecore_x_atom_get_prefetch().
386  * @ingroup Ecore_X_Atom_Group
387  */
388 EAPI void
389 ecore_x_atom_get_fetch(void)
390 {
391    xcb_intern_atom_cookie_t cookie;
392    xcb_intern_atom_reply_t *reply;
393
394    cookie.sequence = _ecore_xcb_cookie_get();
395    reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookie, NULL);
396    _ecore_xcb_reply_cache(reply);
397 }
398
399 /**
400  * Retrieves the atom value associated to a name.
401  * @param  name Unused.
402  * @return      Associated atom value.
403  *
404  * Retrieves the atom value associated to a name. The reply is the
405  * returned value of the function ecore_xcb_intern_atom_reply(). If
406  * @p reply is @c NULL, the NULL atom is returned. Otherwise, the atom
407  * associated to the name is returned.
408  *
409  * To use this function, you must call before, and in order,
410  * ecore_x_atom_get_prefetch(), which sends the InternAtom request,
411  * then ecore_x_atom_get_fetch(), which gets the reply.
412  * @ingroup Ecore_X_Atom_Group
413  */
414 EAPI Ecore_X_Atom
415 ecore_x_atom_get(const char *name __UNUSED__)
416 {
417    xcb_intern_atom_reply_t *reply;
418
419    reply = _ecore_xcb_reply_get();
420    if (!reply) return XCB_NONE;
421
422    return reply->atom;
423 }
424
425
426 /**
427  * Sends the GetAtomName request.
428  * @param atom Atom to get the name from.
429  * @ingroup Ecore_X_Atom_Group
430  */
431 EAPI void
432 ecore_x_get_atom_name_prefetch(Ecore_X_Atom atom)
433 {
434    xcb_get_atom_name_cookie_t cookie;
435
436    cookie = xcb_get_atom_name_unchecked(_ecore_xcb_conn, atom);
437    _ecore_xcb_cookie_cache(cookie.sequence);
438 }
439
440 /**
441  * Gets the reply of the GetAtomName request sent by ecore_x_get_atom_name_prefetch().
442  * @ingroup Ecore_X_Atom_Group
443  */
444 EAPI void
445 ecore_x_get_atom_name_fetch(void)
446 {
447    xcb_get_atom_name_cookie_t cookie;
448    xcb_get_atom_name_reply_t *reply;
449
450    cookie.sequence = _ecore_xcb_cookie_get();
451    reply = xcb_get_atom_name_reply(_ecore_xcb_conn, cookie, NULL);
452    _ecore_xcb_reply_cache(reply);
453 }
454
455 /**
456  * Retrieves the name of the given atom.
457  * @param  atom Unused.
458  * @return      The name of the atom.
459  *
460  * To use this function, you must call before, and in order,
461  * ecore_x_get_atom_name_prefetch(), which sends the GetAtomName request,
462  * then ecore_x_get_atom_name_fetch(), which gets the reply.
463  * @ingroup Ecore_X_Atom_Group
464  */
465 EAPI char *
466 ecore_x_atom_name_get(Ecore_X_Atom atom)
467 {
468    xcb_get_atom_name_reply_t *reply;
469    char                      *name;
470    int                        length;
471
472    reply = _ecore_xcb_reply_get();
473    if (!reply) return NULL;
474
475    length = xcb_get_atom_name_name_length(reply);
476    name = (char *)malloc(sizeof(char) * (length + 1));
477    if (!name) return NULL;
478
479    memcpy(name, xcb_get_atom_name_name(reply), length);
480    name[length] = '\0';
481
482    return name;
483 }