diff --git a/glx/glxcmds.c b/glx/glxcmds.c index e836af8d5..f5f2babb8 100644 --- a/glx/glxcmds.c +++ b/glx/glxcmds.c @@ -1916,44 +1916,55 @@ DoGetDrawableAttributes(__GLXclientState * cl, XID drawId) { ClientPtr client = cl->client; xGLXGetDrawableAttributesReply reply; - __GLXdrawable *pGlxDraw; + __GLXdrawable *pGlxDraw = NULL; + DrawablePtr pDraw; CARD32 attributes[14]; - int numAttribs = 0, error; + int num = 0, error; if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY, - DixGetAttrAccess, &pGlxDraw, &error)) - return error; + DixGetAttrAccess, &pGlxDraw, &error)) { + /* hack for GLX 1.2 naked windows */ + int err = dixLookupWindow((WindowPtr *)&pDraw, drawId, client, + DixGetAttrAccess); + if (err != Success) + return error; + } + if (pGlxDraw) + pDraw = pGlxDraw->pDraw; - attributes[0] = GLX_TEXTURE_TARGET_EXT; - attributes[1] = pGlxDraw->target == GL_TEXTURE_2D ? GLX_TEXTURE_2D_EXT : - GLX_TEXTURE_RECTANGLE_EXT; - numAttribs++; - attributes[2] = GLX_Y_INVERTED_EXT; - attributes[3] = GL_FALSE; - numAttribs++; - attributes[4] = GLX_EVENT_MASK; - attributes[5] = pGlxDraw->eventMask; - numAttribs++; - attributes[6] = GLX_WIDTH; - attributes[7] = pGlxDraw->pDraw->width; - numAttribs++; - attributes[8] = GLX_HEIGHT; - attributes[9] = pGlxDraw->pDraw->height; - numAttribs++; - attributes[10] = GLX_FBCONFIG_ID; - attributes[11] = pGlxDraw->config->fbconfigID; - numAttribs++; - if (pGlxDraw->type == GLX_DRAWABLE_PBUFFER) { - attributes[12] = GLX_PRESERVED_CONTENTS; - attributes[13] = GL_TRUE; - numAttribs++; + attributes[2*num] = GLX_Y_INVERTED_EXT; + attributes[2*num+1] = GL_FALSE; + num++; + attributes[2*num] = GLX_WIDTH; + attributes[2*num+1] = pDraw->width; + num++; + attributes[2*num] = GLX_HEIGHT; + attributes[2*num+1] = pDraw->height; + num++; + if (pGlxDraw) { + attributes[2*num] = GLX_TEXTURE_TARGET_EXT; + attributes[2*num+1] = pGlxDraw->target == GL_TEXTURE_2D ? + GLX_TEXTURE_2D_EXT : + GLX_TEXTURE_RECTANGLE_EXT; + num++; + attributes[2*num] = GLX_EVENT_MASK; + attributes[2*num+1] = pGlxDraw->eventMask; + num++; + attributes[2*num] = GLX_FBCONFIG_ID; + attributes[2*num+1] = pGlxDraw->config->fbconfigID; + num++; + if (pGlxDraw->type == GLX_DRAWABLE_PBUFFER) { + attributes[2*num] = GLX_PRESERVED_CONTENTS; + attributes[2*num+1] = GL_TRUE; + num++; + } } reply = (xGLXGetDrawableAttributesReply) { .type = X_Reply, .sequenceNumber = client->sequence, - .length = numAttribs << 1, - .numAttribs = numAttribs + .length = num << 1, + .numAttribs = num }; if (client->swapped) {