Fix BadWindow errors that occurred when closing an X11 window.

This commit is based on OpenTK's fix in:
ec31675fc8

...and was adapted for ClassicalSharp's modified OpenTK code.

This also fixes options not being saved on Linux when the client or
launcher closes, at least on Debian Jessie. The default error handler
for Xlib is to print a message explaining the error to the console and
then call exit(1). If that happens, the Options.Save() calls in
Game.Dispose() and LauncherWindow.Run() are never reached.
This commit is contained in:
Jjp137 2016-02-19 18:43:46 -08:00
parent b66fdffae9
commit e76983ef18

View file

@ -326,8 +326,10 @@ namespace OpenTK.Platform.X11 {
if (!ce.Cancel) {
isExiting = true;
Debug.Print("Destroying window.");
API.XDestroyWindow(window.Display, window.WindowHandle);
DestroyWindow();
if (Closed != null)
Closed(this, EventArgs.Empty);
}
} break;
@ -335,8 +337,6 @@ namespace OpenTK.Platform.X11 {
Debug.Print("Window destroyed");
exists = false;
if (Closed != null)
Closed(this, EventArgs.Empty);
break;
case XEventName.ConfigureNotify:
@ -766,7 +766,9 @@ namespace OpenTK.Platform.X11 {
public void DestroyWindow() {
Debug.Print("X11GLNative shutdown sequence initiated.");
API.XSync(window.Display, true);
API.XDestroyWindow(window.Display, window.WindowHandle);
exists = false;
}
public Point PointToClient(Point point) {
@ -793,10 +795,7 @@ namespace OpenTK.Platform.X11 {
if (manuallyCalled) {
if (window != null && window.WindowHandle != IntPtr.Zero) {
if (Exists) {
API.XDestroyWindow(window.Display, window.WindowHandle);
while (Exists)
ProcessEvents();
DestroyWindow();
}
window.Dispose();
window = null;