diff options
author | Adam Jackson <[email protected]> | 2011-03-31 20:43:57 +0000 |
---|---|---|
committer | Adam Jackson <[email protected]> | 2011-06-29 14:07:19 -0400 |
commit | 4833104718677caad0027d5e7539ca9bba389392 (patch) | |
tree | f14a20f76dc0989b58e95b88e4c4fc65bef73f9e /src/glx/glxcmds.c | |
parent | 9e2bc5d4b0385e374e06c0b26db266067a723bf3 (diff) |
glx: Verify that drawable creation on the client side actually worked
... and clean up if it didn't.
Signed-off-by: Adam Jackson <[email protected]>
Diffstat (limited to 'src/glx/glxcmds.c')
-rw-r--r-- | src/glx/glxcmds.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c index 21068184ce2..191b321ce32 100644 --- a/src/glx/glxcmds.c +++ b/src/glx/glxcmds.c @@ -640,19 +640,33 @@ glXCreateGLXPixmap(Display * dpy, XVisualInfo * vis, Pixmap pixmap) psc = priv->screens[vis->screen]; if (psc->driScreen == NULL) - break; + return xid; + config = glx_config_find_visual(psc->visuals, vis->visualid); pdraw = psc->driScreen->createDrawable(psc, pixmap, xid, config); if (pdraw == NULL) { fprintf(stderr, "failed to create pixmap\n"); + xid = None; break; } if (__glxHashInsert(priv->drawHash, xid, pdraw)) { (*pdraw->destroyDrawable) (pdraw); - return None; /* FIXME: Check what we're supposed to do here... */ + xid = None; + break; } } while (0); + + if (xid == None) { + xGLXDestroyGLXPixmapReq *dreq; + LockDisplay(dpy); + GetReq(GLXDestroyGLXPixmap, dreq); + dreq->reqType = opcode; + dreq->glxCode = X_GLXDestroyGLXPixmap; + dreq->glxpixmap = xid; + UnlockDisplay(dpy); + SyncHandle(); + } #endif return xid; |