From 22777e548061d4731bce98cbebefde6d18d15b25 Mon Sep 17 00:00:00 2001 From: ed Date: Fri, 12 Mar 2021 10:28:14 +0000 Subject: [PATCH] Linux: Remove embedded OpenGL window events from event queue when destroying This fixes BadWindow errors from Expose events that may be processed after the window is destroyed. --- modules/juce_opengl/native/juce_OpenGL_linux_X11.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/modules/juce_opengl/native/juce_OpenGL_linux_X11.h b/modules/juce_opengl/native/juce_OpenGL_linux_X11.h index ef7eb852ed..1219041323 100644 --- a/modules/juce_opengl/native/juce_OpenGL_linux_X11.h +++ b/modules/juce_opengl/native/juce_OpenGL_linux_X11.h @@ -97,7 +97,7 @@ public: XSetWindowAttributes swa; swa.colormap = colourMap; swa.border_pixel = 0; - swa.event_mask = ExposureMask | StructureNotifyMask; + swa.event_mask = embeddedWindowEventMask; auto glBounds = component.getTopLevelComponent() ->getLocalArea (&component, component.getLocalBounds()); @@ -133,9 +133,18 @@ public: if (embeddedWindow != 0) { XWindowSystemUtilities::ScopedXLock xLock; + X11Symbols::getInstance()->xUnmapWindow (display, embeddedWindow); X11Symbols::getInstance()->xDestroyWindow (display, embeddedWindow); X11Symbols::getInstance()->xSync (display, False); + + XEvent event; + while (X11Symbols::getInstance()->xCheckWindowEvent (display, + embeddedWindow, + embeddedWindowEventMask, + &event) == True) + { + } } } @@ -233,6 +242,8 @@ public: struct Locker { Locker (NativeContext&) {} }; private: + static constexpr int embeddedWindowEventMask = ExposureMask | StructureNotifyMask; + Component& component; GLXContext renderContext = {}; Window embeddedWindow = {};