/* Find the RENDER screen for the X11 screen */ static const xcb_render_pictscreen_t * FindPictScreen(const xcb_setup_t *setup, const xcb_screen_t *scr, const xcb_render_query_pict_formats_reply_t *r) { xcb_screen_iterator_t si = xcb_setup_roots_iterator(setup); unsigned n = 0; while (si.data != scr) { assert(si.rem > 0); n++; xcb_screen_next(&si); } xcb_render_pictscreen_iterator_t rsi = xcb_render_query_pict_formats_screens_iterator(r); while (n > 0) { if (unlikely(rsi.rem == 0)) return NULL; /* buggy server */ n--; xcb_render_pictscreen_next(&rsi); } return rsi.data; }
uint32_t _ecore_xcb_render_find_visual_id(int type, Eina_Bool check_alpha) { #ifdef ECORE_XCB_RENDER const xcb_render_query_pict_formats_reply_t *reply; xcb_render_pictvisual_t *visual = NULL; xcb_render_pictscreen_iterator_t screens; xcb_render_pictdepth_iterator_t depths; xcb_render_pictvisual_iterator_t visuals; #endif LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; if (!_render_avail) return 0; #ifdef ECORE_XCB_RENDER reply = xcb_render_util_query_formats(_ecore_xcb_conn); if (!reply) return 0; for (screens = xcb_render_query_pict_formats_screens_iterator(reply); screens.rem; xcb_render_pictscreen_next(&screens)) { for (depths = xcb_render_pictscreen_depths_iterator(screens.data); depths.rem; xcb_render_pictdepth_next(&depths)) { for (visuals = xcb_render_pictdepth_visuals_iterator(depths.data); visuals.rem; xcb_render_pictvisual_next(&visuals)) { xcb_render_pictforminfo_t temp; xcb_render_pictforminfo_t *format; visual = visuals.data; temp.id = visual->format; format = xcb_render_util_find_format(reply, XCB_PICT_FORMAT_ID, &temp, 0); if (!format) continue; if (format->type == type) { if (check_alpha) { if (format->direct.alpha_mask) return visual->visual; } else return visual->visual; } } } } #endif return 0; }
xcb_render_pictvisual_t * xcb_render_util_find_visual_format (const xcb_render_query_pict_formats_reply_t *formats, const xcb_visualid_t visual) { xcb_render_pictscreen_iterator_t screens; xcb_render_pictdepth_iterator_t depths; xcb_render_pictvisual_iterator_t visuals; if (!formats) return 0; for (screens = xcb_render_query_pict_formats_screens_iterator(formats); screens.rem; xcb_render_pictscreen_next(&screens)) for (depths = xcb_render_pictscreen_depths_iterator(screens.data); depths.rem; xcb_render_pictdepth_next(&depths)) for (visuals = xcb_render_pictdepth_visuals_iterator(depths.data); visuals.rem; xcb_render_pictvisual_next(&visuals)) if (visuals.data->visual == visual) return visuals.data; return 0; }