svn update: 48958 (latest:48959)
[framework/uifw/ecore.git] / src / lib / ecore_x / xcb / ecore_xcb_reply.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4
5 #include <stdlib.h>
6
7
8 /* 
9  * FIXME:
10  * - in ecore_xcb_cookie_cache, should provide better error management
11  *   when memory allocation fails
12  * - Use an array instead of a list
13  * - Is ecore_xcb_reply_free really needed ?
14  *   _ecore_xcb_reply_cache frees the current reply and
15  *   _ecore_x_reply_shutdown frees the last reply to free.
16  *   I keep it in case it is need for memory improvements,
17  *   but its code is commented.
18  */
19
20 static Eina_List  *_ecore_xcb_cookies = NULL;
21 static void       *_ecore_xcb_reply = NULL;
22
23 typedef struct _Ecore_Xcb_Data Ecore_Xcb_Data;
24
25 struct _Ecore_Xcb_Data
26 {
27   unsigned int         cookie;
28 };
29
30
31 int
32 _ecore_x_reply_init ()
33 {
34    return 1;
35 }
36
37 void
38 _ecore_x_reply_shutdown ()
39 {
40   Ecore_Xcb_Data *data;
41
42   if (_ecore_xcb_reply)
43     free(_ecore_xcb_reply);
44
45    if (!_ecore_xcb_cookies)
46      return;
47
48    EINA_LIST_FREE(_ecore_xcb_cookies, data)
49      free(data);
50 }
51
52 void
53 _ecore_xcb_cookie_cache (unsigned int cookie)
54 {
55    Ecore_Xcb_Data *data;
56
57    if (!_ecore_xcb_cookies)
58      return;
59
60    data = (Ecore_Xcb_Data *)malloc(sizeof(Ecore_Xcb_Data));
61    if (!data)
62      return;
63
64    data->cookie = cookie;
65
66    _ecore_xcb_cookies = eina_list_append(_ecore_xcb_cookies, data);
67    if (!eina_list_data_find(_ecore_xcb_cookies, data))
68      {
69         free(data);
70         return;
71      }
72 }
73
74 unsigned int
75 _ecore_xcb_cookie_get (void)
76 {
77    Ecore_Xcb_Data *data;
78    unsigned int    cookie;
79
80    if (!_ecore_xcb_cookies)
81      return 0;
82
83    data = eina_list_data_get(_ecore_xcb_cookies);
84    if (!data) return 0;
85
86    _ecore_xcb_cookies = eina_list_remove_list(_ecore_xcb_cookies, _ecore_xcb_cookies);
87         cookie = data->cookie;
88         free(data);
89
90         return cookie;
91 }
92
93 void
94 _ecore_xcb_reply_cache (void *reply)
95 {
96    if (_ecore_xcb_reply)
97      free(_ecore_xcb_reply);
98    _ecore_xcb_reply = reply;
99 }
100
101 void *
102 _ecore_xcb_reply_get (void)
103 {
104    return _ecore_xcb_reply;
105 }
106
107 EAPI void
108 ecore_xcb_reply_free()
109 {
110 /*   if (_ecore_xcb_reply) */
111 /*     { */
112 /*        free(_ecore_xcb_reply); */
113 /*        _ecore_xcb_reply = NULL; */
114 /*     } */
115 }