[PATCH libX11] Add _XGetRequest as substitute for GetReq/GetReqExtra
Peter Hutterer
peter.hutterer at who-t.net
Mon Oct 24 20:37:56 PDT 2011
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
include/X11/Xlibint.h | 51 ++++++++++++++++--------------------------------
src/XlibInt.c | 26 +++++++++++++++++++++++++
2 files changed, 43 insertions(+), 34 deletions(-)
diff --git a/include/X11/Xlibint.h b/include/X11/Xlibint.h
index 083498f..2074e96 100644
--- a/include/X11/Xlibint.h
+++ b/include/X11/Xlibint.h
@@ -420,6 +420,19 @@ extern LockInfoPtr _Xglobal_lock;
#define WORD64ALIGN
#endif /* WORD64 */
+/**
+ * Return a len-sized request buffer for the request type. This function may
+ * flush the buffer.
+ *
+ * @param dpy The display connection
+ * @param type The request qtype
+ * @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
@@ -432,25 +445,10 @@ extern LockInfoPtr _Xglobal_lock;
#if !defined(UNIXCPP) || defined(ANSICPP)
#define GetReq(name, req) \
- WORD64ALIGN\
- 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 = _XGetRequest(dpy, X_##name, SIZEOF(x##name##Req))
#else /* non-ANSI C uses empty comment instead of "##" for token concatenation */
#define GetReq(name, req) \
- WORD64ALIGN\
- 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 = _XGetRequest(dpy, X_/**/name, SIZEOF(x/**/name/**/Req))
#endif
/* GetReqExtra is the same as GetReq, but allocates "n" additional
@@ -458,24 +456,10 @@ extern LockInfoPtr _Xglobal_lock;
#if !defined(UNIXCPP) || defined(ANSICPP)
#define GetReqExtra(name, n, req) \
- WORD64ALIGN\
- 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 = _XGetRequest(dpy, X_##name, SIZEOF(x##name##Req) + n)
#else
#define GetReqExtra(name, n, req) \
- WORD64ALIGN\
- 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 = _XGetRequest(dpy, X_/**/name, SIZEOF(x/**/name/**/Req) + n)
#endif
/* GetReqSized is the same as GetReq but allows the caller to specify the
@@ -503,7 +487,6 @@ extern LockInfoPtr _Xglobal_lock;
#endif
-
/*
* GetResReq is for those requests that have a resource ID
* (Window, Pixmap, GContext, etc.) as their single argument.
diff --git a/src/XlibInt.c b/src/XlibInt.c
index 3db151e..a143dc4 100644
--- a/src/XlibInt.c
+++ b/src/XlibInt.c
@@ -1956,6 +1956,32 @@ Screen *_XScreenOfWindow(Display *dpy, Window w)
}
+
+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)
/*
--
1.7.7
More information about the xorg-devel
mailing list