1 #include "ecore_xcb_private.h"
2 #include <ctype.h> // for isupper/tolower
3 #ifdef ECORE_XCB_RENDER
4 # include <xcb/render.h>
5 # include <xcb/xcb_renderutil.h>
8 /* local function prototypes */
9 static Eina_Bool _ecore_xcb_render_parse_boolean(char *v);
12 static Eina_Bool _render_avail = EINA_FALSE;
13 static Eina_Bool _render_argb = EINA_FALSE;
14 static Eina_Bool _render_anim = EINA_FALSE;
17 _ecore_xcb_render_init(void)
19 LOGFN(__FILE__, __LINE__, __FUNCTION__);
21 #ifdef ECORE_XCB_RENDER
22 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_render_id);
27 _ecore_xcb_render_finalize(void)
29 #ifdef ECORE_XCB_RENDER
30 const xcb_query_extension_reply_t *ext_reply;
33 LOGFN(__FILE__, __LINE__, __FUNCTION__);
35 #ifdef ECORE_XCB_RENDER
36 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_render_id);
37 if ((ext_reply) && (ext_reply->present))
39 xcb_render_query_version_cookie_t cookie;
40 xcb_render_query_version_reply_t *reply;
43 xcb_render_query_version_unchecked(_ecore_xcb_conn,
44 XCB_RENDER_MAJOR_VERSION,
45 XCB_RENDER_MINOR_VERSION);
46 reply = xcb_render_query_version_reply(_ecore_xcb_conn, cookie, NULL);
49 // if ((reply->major_version >= XCB_RENDER_MAJOR_VERSION) &&
50 if (reply->minor_version >= XCB_RENDER_MINOR_VERSION)
54 _render_avail = EINA_TRUE;
55 _ecore_xcb_xdefaults_init();
56 if ((reply->major_version > 0) || (reply->minor_version >= 5))
58 _render_argb = EINA_TRUE;
59 v = getenv("XCURSOR_CORE");
61 v = _ecore_xcb_xdefaults_string_get("Xcursor", "core");
62 if ((v) && (_ecore_xcb_render_parse_boolean(v)))
63 _render_argb = EINA_FALSE;
66 ((reply->major_version > 0) || (reply->minor_version >= 8)))
68 _render_anim = EINA_TRUE;
69 v = getenv("XCURSOR_ANIM");
71 v = _ecore_xcb_xdefaults_string_get("Xcursor", "anim");
72 if ((v) && (_ecore_xcb_render_parse_boolean(v)))
73 _render_anim = EINA_FALSE;
75 _ecore_xcb_xdefaults_shutdown();
84 _ecore_xcb_render_avail_get(void)
90 _ecore_xcb_render_argb_get(void)
96 _ecore_xcb_render_anim_get(void)
102 _ecore_xcb_render_visual_supports_alpha(Ecore_X_Visual visual)
104 Eina_Bool ret = EINA_FALSE;
105 #ifdef ECORE_XCB_RENDER
106 const xcb_render_query_pict_formats_reply_t *reply;
107 xcb_render_pictvisual_t *vis;
110 LOGFN(__FILE__, __LINE__, __FUNCTION__);
113 if (!visual) return EINA_FALSE;
114 if (!_render_avail) return EINA_FALSE;
116 #ifdef ECORE_XCB_RENDER
117 reply = xcb_render_util_query_formats(_ecore_xcb_conn);
118 if (!reply) return EINA_FALSE;
121 xcb_render_util_find_visual_format(reply,
122 ((xcb_visualtype_t *)visual)->visual_id);
125 xcb_render_pictforminfo_t temp;
126 xcb_render_pictforminfo_t *format;
128 temp.id = vis->format;
130 xcb_render_util_find_format(reply, XCB_PICT_FORMAT_ID, &temp, 0);
132 if ((format->type == XCB_RENDER_PICT_TYPE_DIRECT) &&
133 (format->direct.alpha_mask))
143 _ecore_xcb_render_find_visual_id(int type,
144 Eina_Bool check_alpha)
146 #ifdef ECORE_XCB_RENDER
147 const xcb_render_query_pict_formats_reply_t *reply;
148 xcb_render_pictvisual_t *visual = NULL;
149 xcb_render_pictscreen_iterator_t screens;
150 xcb_render_pictdepth_iterator_t depths;
151 xcb_render_pictvisual_iterator_t visuals;
154 LOGFN(__FILE__, __LINE__, __FUNCTION__);
157 if (!_render_avail) return 0;
159 #ifdef ECORE_XCB_RENDER
160 reply = xcb_render_util_query_formats(_ecore_xcb_conn);
161 if (!reply) return 0;
163 for (screens = xcb_render_query_pict_formats_screens_iterator(reply);
164 screens.rem; xcb_render_pictscreen_next(&screens))
166 for (depths = xcb_render_pictscreen_depths_iterator(screens.data);
167 depths.rem; xcb_render_pictdepth_next(&depths))
169 for (visuals = xcb_render_pictdepth_visuals_iterator(depths.data);
170 visuals.rem; xcb_render_pictvisual_next(&visuals))
172 xcb_render_pictforminfo_t temp;
173 xcb_render_pictforminfo_t *format;
175 visual = visuals.data;
176 temp.id = visual->format;
179 xcb_render_util_find_format(reply, XCB_PICT_FORMAT_ID,
181 if (!format) continue;
182 if (format->type == type)
186 if (format->direct.alpha_mask)
187 return visual->visual;
190 return visual->visual;
200 /* local function prototypes */
202 _ecore_xcb_render_parse_boolean(char *v)
209 if ((c == 't') || (c == 'y') || (c == '1'))
211 if ((c == 'f') || (c == 'n') || (c == '0'))
220 if (d == 'n') return EINA_TRUE;
221 if (d == 'f') return EINA_FALSE;