diff --git a/src/QuColors.c b/src/QuColors.c index e51375f..237b8bf 100644 --- a/src/QuColors.c +++ b/src/QuColors.c @@ -29,8 +29,8 @@ in this Software without prior written authorization from The Open Group. #endif #include "Xlibint.h" -int -XQueryColors( +static void +_XQueryColors( register Display *dpy, Colormap cmap, XColor *defs, /* RETURN */ @@ -42,11 +42,10 @@ XQueryColors( long nbytes; register xQueryColorsReq *req; - LockDisplay(dpy); GetReq(QueryColors, req); req->cmap = cmap; - req->length += ncolors; /* each pixel is a CARD32 */ + SetReqLen(req, ncolors, ncolors); /* each pixel is a CARD32 */ for (i = 0; i < ncolors; i++) Data32 (dpy, (long *)&defs[i].pixel, 4L); @@ -70,8 +69,31 @@ XQueryColors( } else _XEatData(dpy, (unsigned long) nbytes); } +} + +int +XQueryColors( + register Display * const dpy, + const Colormap cmap, + XColor *defs, /* RETURN */ + int ncolors) +{ + int n; + + if (dpy->bigreq_size > 0) + n = dpy->bigreq_size - (sizeof (xQueryColorsReq) >> 2) - 1; + else + n = dpy->max_request_size - (sizeof (xQueryColorsReq) >> 2); + + LockDisplay(dpy); + while (ncolors >= n) { + _XQueryColors(dpy, cmap, defs, n); + defs += n; + ncolors -= n; + } + if (ncolors > 0) + _XQueryColors(dpy, cmap, defs, ncolors); UnlockDisplay(dpy); SyncHandle(); return 1; } -