Commit 36d0fac7 authored by Ulrich Sibiller's avatar Ulrich Sibiller Committed by Mike Gabriel

Backport of _XGetRequest()

To enable linking of a current libXrender libNX_X11 needs that symbol. This is a (manual) backport of the following upstream libX11 commit available at https://cgit.freedesktop.org/xorg/lib/libX11/commit/src/XlibInt.c?id=4a060f993bf676cf21ad9784e010f54134da7b40: Commit: 4a060f993bf676cf21ad9784e010f54134da7b40 Author: Peter Hutterer <peter.hutterer@who-t.net> Date: Mon, 17 Oct 2011 09:45:15 +1000 Subject: Add _XGetRequest as substitute for GetReq/GetReqExtra
parent c355dc91
......@@ -3732,6 +3732,36 @@ Screen *_XScreenOfWindow (dpy, w)
return NULL;
}
/*
* WARNING: This implementation's pre-conditions and post-conditions
* must remain compatible with the old macro-based implementations of
* GetReq, GetReqExtra, GetResReq, and GetEmptyReq. The portions of the
* Display structure affected by those macros are part of libX11's
* ABI.
*/
void *_XGetRequest(Display *dpy, CARD8 type, size_t len)
{
xReq *req;
WORD64ALIGN
if (dpy->bufptr + len > dpy->bufmax)
_XFlush(dpy);
if (len % 4)
fprintf(stderr,
"Xlib: request %d length %zd not a multiple of 4.\n",
type, len);
dpy->last_req = dpy->bufptr;
req = (xReq*)dpy->bufptr;
req->reqType = type;
req->length = len / 4;
dpy->bufptr += len;
dpy->request++;
return req;
}
#if defined(WIN32)
......
......@@ -422,6 +422,19 @@ extern LockInfoPtr _Xglobal_lock;
/* Leftover from CRAY support - was defined empty on all non-Cray systems */
#define WORD64ALIGN
/**
* Return a len-sized request buffer for the request type. This function may
* flush the output queue.
*
* @param dpy The display connection
* @param type The request type
* @param len Length of the request in bytes
*
* @returns A pointer to the request buffer with a few default values
* initialized.
*/
extern void *_XGetRequest(Display *dpy, CARD8 type, size_t len);
/*
* GetReq - Get the next available X request packet in the buffer and
* return it.
......@@ -433,23 +446,10 @@ extern LockInfoPtr _Xglobal_lock;
#if !defined(UNIXCPP) || defined(ANSICPP)
#define GetReq(name, req) \
if ((dpy->bufptr + SIZEOF(x##name##Req)) > dpy->bufmax)\
_XFlush(dpy);\
req = (x##name##Req *)(dpy->last_req = dpy->bufptr);\
req->reqType = X_##name;\
req->length = (SIZEOF(x##name##Req))>>2;\
dpy->bufptr += SIZEOF(x##name##Req);\
dpy->request++
req = (x##name##Req *) _XGetRequest(dpy, X_##name, SIZEOF(x##name##Req))
#else /* non-ANSI C uses empty comment instead of "##" for token concatenation */
#define GetReq(name, req) \
if ((dpy->bufptr + SIZEOF(x/**/name/**/Req)) > dpy->bufmax)\
_XFlush(dpy);\
req = (x/**/name/**/Req *)(dpy->last_req = dpy->bufptr);\
req->reqType = X_/**/name;\
req->length = (SIZEOF(x/**/name/**/Req))>>2;\
dpy->bufptr += SIZEOF(x/**/name/**/Req);\
dpy->request++
req = (x/**/name/**/Req *) _XGetRequest(dpy, X_/**/name, SIZEOF(x/**/name/**/Req))
#endif
/* GetReqExtra is the same as GetReq, but allocates "n" additional
......@@ -457,22 +457,10 @@ extern LockInfoPtr _Xglobal_lock;
#if !defined(UNIXCPP) || defined(ANSICPP)
#define GetReqExtra(name, n, req) \
if ((dpy->bufptr + SIZEOF(x##name##Req) + n) > dpy->bufmax)\
_XFlush(dpy);\
req = (x##name##Req *)(dpy->last_req = dpy->bufptr);\
req->reqType = X_##name;\
req->length = (SIZEOF(x##name##Req) + n)>>2;\
dpy->bufptr += SIZEOF(x##name##Req) + n;\
dpy->request++
req = (x##name##Req *) _XGetRequest(dpy, X_##name, SIZEOF(x##name##Req) + n)
#else
#define GetReqExtra(name, n, req) \
if ((dpy->bufptr + SIZEOF(x/**/name/**/Req) + n) > dpy->bufmax)\
_XFlush(dpy);\
req = (x/**/name/**/Req *)(dpy->last_req = dpy->bufptr);\
req->reqType = X_/**/name;\
req->length = (SIZEOF(x/**/name/**/Req) + n)>>2;\
dpy->bufptr += SIZEOF(x/**/name/**/Req) + n;\
dpy->request++
req = (x/**/name/**/Req *) _XGetRequest(dpy, X_/**/name, SIZEOF(x/**/name/**/Req) + n)
#endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment