diff options
Diffstat (limited to 'src/glx/x11')
-rw-r--r-- | src/glx/x11/glx_query.c | 31 | ||||
-rw-r--r-- | src/glx/x11/glxclient.h | 4 |
2 files changed, 35 insertions, 0 deletions
diff --git a/src/glx/x11/glx_query.c b/src/glx/x11/glx_query.c index 56f3495186..ef33f7c403 100644 --- a/src/glx/x11/glx_query.c +++ b/src/glx/x11/glx_query.c @@ -31,6 +31,12 @@ #include "glxclient.h" +#if defined(USE_XCB) +# include <X11/Xlib-xcb.h> +# include <xcb/xcb.h> +# include <xcb/glx.h> +#endif + /** * GLX protocol structure for the ficticious "GXLGenericGetString" request. * @@ -101,3 +107,28 @@ __glXGetStringFromServer(Display * dpy, int opcode, CARD32 glxCode, return buf; } + +#ifdef USE_XCB +char * +__glXQueryServerString(Display* dpy, + CARD32 screen, + CARD32 name) +{ + xcb_connection_t *c = XGetXCBConnection(dpy); + xcb_glx_query_server_string_reply_t* reply = + xcb_glx_query_server_string_reply(c, + xcb_glx_query_server_string(c, + screen, + name), + NULL); + + /* The spec doesn't mention this, but the Xorg server replies with + * a string already terminated with '\0'. */ + uint32_t len = xcb_glx_query_server_string_string_length(reply); + char* buf = Xmalloc(len); + memcpy(buf, xcb_glx_query_server_string_string(reply), len); + free(reply); + + return buf; +} +#endif /* USE_XCB */ diff --git a/src/glx/x11/glxclient.h b/src/glx/x11/glxclient.h index 02e8750c97..8f1e69154a 100644 --- a/src/glx/x11/glxclient.h +++ b/src/glx/x11/glxclient.h @@ -742,6 +742,10 @@ extern void __glXInitializeVisualConfigFromTags( __GLcontextModes *config, extern char * __glXGetStringFromServer( Display * dpy, int opcode, CARD32 glxCode, CARD32 for_whom, CARD32 name ); +#ifdef USE_XCB +extern char * __glXQueryServerString(Display* dpy, CARD32 screen, CARD32 name); +#endif + extern char *__glXstrdup(const char *str); |