From aa0109bf960b3b71110d4fa45008dc76f241f4ef Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 26 Nov 2002 18:18:54 +0000 Subject: [PATCH] move WindowExists() code into glxext.c (effectively out of the driver) --- src/miniglx/dri_util.c | 26 ++------------------------ src/miniglx/glxclient.h | 3 +++ src/miniglx/glxext.c | 27 +++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/miniglx/dri_util.c b/src/miniglx/dri_util.c index e092391dd93..5e579c344f0 100644 --- a/src/miniglx/dri_util.c +++ b/src/miniglx/dri_util.c @@ -232,28 +232,6 @@ static void __driRemoveDrawable(void *drawHash, __DRIdrawable *pdraw) } } -static Bool __driWindowExistsFlag; - -static int __driWindowExistsErrorHandler(Display *dpy, XErrorEvent *xerr) -{ - if (xerr->error_code == BadWindow) { - __driWindowExistsFlag = GL_FALSE; - } - return 0; -} - -static Bool __driWindowExists(Display *dpy, GLXDrawable draw) -{ - XWindowAttributes xwa; - int (*oldXErrorHandler)(Display *, XErrorEvent *); - - __driWindowExistsFlag = GL_TRUE; - oldXErrorHandler = XSetErrorHandler(__driWindowExistsErrorHandler); - XGetWindowAttributes(dpy, draw, &xwa); /* dummy request */ - XSetErrorHandler(oldXErrorHandler); - return __driWindowExistsFlag; -} - static void __driGarbageCollectDrawables(void *drawHash) { GLXDrawable draw; @@ -265,7 +243,7 @@ static void __driGarbageCollectDrawables(void *drawHash) __DRIdrawablePrivate *pdp = (__DRIdrawablePrivate *)pdraw->private; dpy = pdp->driScreenPriv->display; XSync(dpy, GL_FALSE); - if (!__driWindowExists(dpy, draw)) { + if (!__glXWindowExists(dpy, draw)) { /* Destroy the local drawable data in the hash table, if the drawable no longer exists in the Xserver */ __driRemoveDrawable(drawHash, pdraw); @@ -763,7 +741,7 @@ static void driDestroyDrawable(Display *dpy, void *drawablePrivate) if (pdp) { (*psp->DriverAPI.DestroyBuffer)(pdp); - if (__driWindowExists(dpy, pdp->draw)) { + if (__glXWindowExists(dpy, pdp->draw)) { #if 0 (void)XF86DRIDestroyDrawable(dpy, scrn, pdp->draw); #else diff --git a/src/miniglx/glxclient.h b/src/miniglx/glxclient.h index 8310eb7cd68..9e66d93be7c 100644 --- a/src/miniglx/glxclient.h +++ b/src/miniglx/glxclient.h @@ -313,6 +313,9 @@ extern void __glXRegisterExtensions(void); extern void *__glXRegisterGLXFunction(const char *funcName, void *funcAddr); extern void __glXRegisterGLXExtensionString(const char *extName); +extern Bool __glXWindowExists(Display *dpy, GLXDrawable draw); + + /************************************************************************/ diff --git a/src/miniglx/glxext.c b/src/miniglx/glxext.c index fe169e3942d..abd8638c917 100644 --- a/src/miniglx/glxext.c +++ b/src/miniglx/glxext.c @@ -1113,3 +1113,30 @@ __glXRegisterExtensions(void) #endif } + + +static Bool __driWindowExistsFlag; + +static int __driWindowExistsErrorHandler(Display *dpy, XErrorEvent *xerr) +{ + if (xerr->error_code == BadWindow) { + __driWindowExistsFlag = GL_FALSE; + } + return 0; +} + +/* + * Utility function useful to DRI drivers. + */ +Bool __glXWindowExists(Display *dpy, GLXDrawable draw) +{ + XWindowAttributes xwa; + int (*oldXErrorHandler)(Display *, XErrorEvent *); + + XSync(dpy, GL_FALSE); + __driWindowExistsFlag = GL_TRUE; + oldXErrorHandler = XSetErrorHandler(__driWindowExistsErrorHandler); + XGetWindowAttributes(dpy, draw, &xwa); /* dummy request */ + XSetErrorHandler(oldXErrorHandler); + return __driWindowExistsFlag; +}