Add dynamic symbol for _XGetRequest, which libX11 1.4.99.1 added.
authorRyan C. Gordon <icculus@icculus.org>
Wed, 18 Jan 2012 08:03:23 +0000 (03:03 -0500)
committernotaz <notasas@gmail.com>
Mon, 11 Mar 2013 20:58:58 +0000 (22:58 +0200)
Fixes Bugzilla #1376.

src/video/x11/SDL_x11dyn.c

index 4e549b3..a7e800e 100644 (file)
@@ -109,6 +109,21 @@ char *(*pXGetICValues)(XIC, ...) = NULL;
 #undef SDL_X11_SYM
 
 
+static void *SDL_XGetRequest_workaround(Display* dpy, CARD8 type, size_t len)
+{
+       xReq *req;
+       WORD64ALIGN
+       if (dpy->bufptr + len > dpy->bufmax)
+               _XFlush(dpy);
+       dpy->last_req = dpy->bufptr;
+       req = (xReq*)dpy->bufptr;
+       req->reqType = type;
+       req->length = len / 4;
+       dpy->bufptr += len;
+       dpy->request++;
+       return req;
+}
+
 static int x11_load_refcount = 0;
 
 void SDL_X11_UnloadSymbols(void)
@@ -168,6 +183,15 @@ int SDL_X11_LoadSymbols(void)
                X11_GetSym("XGetICValues",&SDL_X11_HAVE_UTF8,(void **)&pXGetICValues);
                #endif
 
+               /*
+                * In case we're built with newer Xlib headers, we need to make sure
+                *  that _XGetRequest() is available, even on older systems.
+                *  Otherwise, various Xlib macros we use will call a NULL pointer.
+                */
+               if (!SDL_X11_HAVE_XGETREQUEST) {
+                       p_XGetRequest = SDL_XGetRequest_workaround;
+               }
+
                if (SDL_X11_HAVE_BASEXLIB) {  /* all required symbols loaded. */
                        SDL_ClearError();
                } else {