From ec31675fc87883cb81c4df3498385a7fe54eae09 Mon Sep 17 00:00:00 2001 From: thefiddler Date: Mon, 19 May 2014 22:02:46 +0200 Subject: [PATCH] [X11] Fixed BadWindow error on shutdown This was caused by calling XDestroyWindow inside Dispose(), or by processing events after calling XDestroyWindow. Pending events are now discarded when Close() is called and not cancelled, and XDestroyWindow is only called if the window exists. --- Source/OpenTK/Platform/X11/X11GLNative.cs | 32 ++++++++--------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/Source/OpenTK/Platform/X11/X11GLNative.cs b/Source/OpenTK/Platform/X11/X11GLNative.cs index 7291a46e..5eb5d059 100644 --- a/Source/OpenTK/Platform/X11/X11GLNative.cs +++ b/Source/OpenTK/Platform/X11/X11GLNative.cs @@ -831,12 +831,8 @@ namespace OpenTK.Platform.X11 if (!ce.Cancel) { isExiting = true; - - Debug.WriteLine("Destroying window."); - using (new XLock(window.Display)) - { - Functions.XDestroyWindow(window.Display, window.Handle); - } + DestroyWindow(); + OnClosed(EventArgs.Empty); break; } } @@ -846,9 +842,6 @@ namespace OpenTK.Platform.X11 case XEventName.DestroyNotify: Debug.WriteLine("Window destroyed"); exists = false; - - OnClosed(EventArgs.Empty); - return; case XEventName.ConfigureNotify: @@ -1653,7 +1646,9 @@ namespace OpenTK.Platform.X11 Debug.WriteLine("X11GLNative shutdown sequence initiated."); using (new XLock(window.Display)) { + Functions.XSync(window.Display, true); Functions.XDestroyWindow(window.Display, window.Handle); + exists = false; } } @@ -1711,20 +1706,15 @@ namespace OpenTK.Platform.X11 { if (window != null && window.Handle != IntPtr.Zero) { + Functions.XFreeCursor(window.Display, EmptyCursor); + if(cursorHandle != IntPtr.Zero) + { + Functions.XFreeCursor(window.Display, cursorHandle); + } + if (Exists) { - using (new XLock(window.Display)) - { - if(cursorHandle != IntPtr.Zero) - { - Functions.XFreeCursor(window.Display, cursorHandle); - } - Functions.XFreeCursor(window.Display, EmptyCursor); - Functions.XDestroyWindow(window.Display, window.Handle); - } - - while (Exists) - ProcessEvents(); + DestroyWindow(); } window.Dispose();