X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fxcb_out.c;h=f12a0713e758ccf7cf30612cfb4166d23393818e;hb=75fead5b868a0dfdc9e6fd5ef0dd37eb71761312;hp=b0130e7f332c850a255a5c1f1b2ae829ca84e053;hpb=fb61c94d685a254ef0702a2e2093b8cdda02d514;p=free-sw%2Fxcb%2Flibxcb diff --git a/src/xcb_out.c b/src/xcb_out.c index b0130e7..f12a071 100644 --- a/src/xcb_out.c +++ b/src/xcb_out.c @@ -29,7 +29,6 @@ #include #include #include -#include #include "xcb.h" #include "xcbext.h" @@ -121,7 +120,7 @@ unsigned int XCBSendRequest(XCBConnection *c, int flags, struct iovec *vector, c longlen += vector[i].iov_len; if(!vector[i].iov_base) { - vector[i].iov_base = (caddr_t) pad; + vector[i].iov_base = (char *) pad; assert(vector[i].iov_len <= sizeof(pad)); } } @@ -145,8 +144,10 @@ unsigned int XCBSendRequest(XCBConnection *c, int flags, struct iovec *vector, c flags &= ~XCB_REQUEST_RAW; /* do we need to work around the X server bug described in glx.xml? */ - if(req->ext && !req->isvoid && strcmp(req->ext->name, "GLX") && - ((req->opcode == 17 && ((CARD32 *) vector[0].iov_base)[0] == 0x10004) || + /* XXX: GetFBConfigs won't use BIG-REQUESTS in any sane + * configuration, but that should be handled here anyway. */ + if(req->ext && !req->isvoid && !strcmp(req->ext->name, "GLX") && + ((req->opcode == 17 && ((CARD32 *) vector[0].iov_base)[1] == 0x10004) || req->opcode == 21)) workaround = WORKAROUND_GLX_GET_FB_CONFIGS_BUG; @@ -166,7 +167,8 @@ unsigned int XCBSendRequest(XCBConnection *c, int flags, struct iovec *vector, c request = ++c->out.request; assert(request != 0); - _xcb_in_expect_reply(c, request, workaround, flags); + if(workaround != WORKAROUND_NONE || flags != 0) + _xcb_in_expect_reply(c, request, workaround, flags); if(!req->isvoid) c->in.request_expected = c->out.request; @@ -224,34 +226,6 @@ void _xcb_out_destroy(_xcb_out *out) pthread_mutex_destroy(&out->reqlenlock); } -/* precondition: there must be something for us to write. */ -int _xcb_out_write(XCBConnection *c, struct iovec **vector, int *count) -{ - int n; - assert(!c->out.queue_len); - n = writev(c->fd, *vector, *count); - if(n < 0 && errno == EAGAIN) - return 1; - if(n <= 0) - return 0; - - for(; *count; --*count, ++*vector) - { - int cur = (*vector)->iov_len; - if(cur > n) - cur = n; - (*vector)->iov_len -= cur; - (*vector)->iov_base = (char *) (*vector)->iov_base + cur; - n -= cur; - if((*vector)->iov_len) - break; - } - if(!*count) - *vector = 0; - assert(n == 0); - return 1; -} - int _xcb_out_send(XCBConnection *c, struct iovec **vector, int *count) { int ret = 1;