/** * Check that the X server supports the RENDER extension. */ static bool CheckRender(vout_display_t *vd, xcb_connection_t *conn) { xcb_render_query_version_reply_t *r; xcb_render_query_version_cookie_t ck; bool ok = false; ck = xcb_render_query_version(conn, 0, 11); r = xcb_render_query_version_reply(conn, ck, NULL); if (r == NULL) msg_Err(vd, "RENDER extension not available"); else if (r->major_version > 0) msg_Dbg(vd, "RENDER extension v%"PRIu32".%"PRIu32" unknown", r->major_version, r->minor_version); else if (r->major_version == 0 && r->minor_version < 6) msg_Dbg(vd, "RENDER extension v%"PRIu32".%"PRIu32" too old", r->major_version, r->minor_version); else { msg_Dbg(vd, "using RENDER extension v%"PRIu32".%"PRIu32, r->major_version, r->minor_version); ok = true; } free(r); return ok; }
static connection_cache * find_or_create_display (xcb_connection_t *c) { connection_cache *info; xcb_render_query_version_cookie_t version_cookie; xcb_render_query_pict_formats_cookie_t formats_cookie; int present; /* * look for display in list */ for (info = connections.head; info; info = info->next) if (info->c == c) { connections.cur = info; /* cache most recently used */ return info; } /* * don't already have this display: add it. */ info = malloc (sizeof (connection_cache)); if (!info) return NULL; info->c = c; version_cookie = xcb_render_query_version(c, 0, 10); formats_cookie = xcb_render_query_pict_formats(c); xcb_flush(c); present = has_required_depths (c); info->version = xcb_render_query_version_reply(c, version_cookie, 0); info->formats = xcb_render_query_pict_formats_reply(c, formats_cookie, 0); if (!present || !info->version || !info->formats) { free(info->version); info->version = 0; free(info->formats); info->formats = 0; } /* Check for the lack of sub-pixel data */ else if (info->version->major_version == 0 && info->version->minor_version < 6) info->formats->num_subpixel = 0; /* * now, chain it onto the list */ info->next = connections.head; connections.head = info; connections.cur = info; return info; }