This is wrong, very wrong. Almost as wrong as what it replaces. Do not merge me, ever. --- glx/glxcmds.c | 6 ++++-- glx/glxext.c | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/glx/glxcmds.c b/glx/glxcmds.c index 9b4bc9e..59df1c8 100644 --- a/glx/glxcmds.c +++ b/glx/glxcmds.c @@ -643,8 +643,10 @@ DoMakeCurrent(__GLXclientState *cl, /* ** Make the previous context not current. */ - if (!(*prevglxc->loseCurrent)(prevglxc)) { - return __glXError(GLXBadContext); + if (prevglxc->readPriv && prevglxc->drawPriv) { + if (!(*prevglxc->loseCurrent)(prevglxc)) { + return __glXError(GLXBadContext); + } } __glXFlushContextCache(); if (!prevglxc->isDirect) { diff --git a/glx/glxext.c b/glx/glxext.c index 4bd5d6b..90711f4 100644 --- a/glx/glxext.c +++ b/glx/glxext.c @@ -145,6 +145,7 @@ static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid) if (c == __glXLastContext) __glXFlushContextCache(); +#if 0 for (i = 1; i < currentMaxClients; i++) { if (clients[i]) { __GLXclientState *cl = glxGetClient(clients[i]); @@ -159,13 +160,16 @@ static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid) } } } +#endif } if (c->drawPriv == glxPriv) c->drawPriv = NULL; if (c->readPriv == glxPriv) c->readPriv = NULL; +#if 0 if (!c->idExists && !c->isCurrent) __glXFreeContext(c); +#endif } glxPriv->destroy(glxPriv); @@ -439,6 +443,14 @@ __GLXcontext *__glXForceCurrent(__GLXclientState *cl, GLXContextTag tag, *error = __glXError(GLXBadCurrentWindow); return 0; } + if (cx->readPriv == NULL) { + /* + * hack of the century + */ + __glXFlushContextCache(); + *error = 0; + return NULL; + } } if (cx->wait && (*cx->wait)(cx, cl, error)) -- 1.7.3.5 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel