From 9f16d10f6d4c423f0e723e7c1f5805c461b2da10 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 14 Aug 2018 18:32:59 +0300
Subject: [PATCH] MAINT-5651 Crashes on close from LLWindowWin32

---
 indra/llwindow/llwindowwin32.cpp | 29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index f98c2423e5e..cbda906599d 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -754,7 +754,6 @@ void LLWindowWin32::close()
 
 	// Make sure cursor is visible and we haven't mangled the clipping state.
 	setMouseClipping(FALSE);
-	showCursor();
 
 	// Go back to screen mode written in the registry.
 	if (mFullscreen)
@@ -762,9 +761,23 @@ void LLWindowWin32::close()
 		resetDisplayResolution();
 	}
 
+	// Don't process events in our mainWindowProc any longer.
+	SetWindowLongPtr(mWindowHandle, GWLP_USERDATA, NULL);
+	if (mCallbacks)
+	{
+		mCallbacks->handleFocusLost(this);
+	}
+	else
+	{
+		showCursor();
+	}
+
 	// Clean up remaining GL state
-	LL_DEBUGS("Window") << "Shutting down GL" << LL_ENDL;
-	gGLManager.shutdownGL();
+	if (gGLManager.mInited)
+	{
+		LL_INFOS("Window") << "Cleaning up GL" << LL_ENDL;
+		gGLManager.shutdownGL();
+	}
 
 	LL_DEBUGS("Window") << "Releasing Context" << LL_ENDL;
 	if (mhRC)
@@ -785,16 +798,16 @@ void LLWindowWin32::close()
 	// Restore gamma to the system values.
 	restoreGamma();
 
-	if (mhDC && !ReleaseDC(mWindowHandle, mhDC))
+	if (mhDC)
 	{
-		LL_WARNS("Window") << "Release of ghDC failed" << LL_ENDL;
+		if (!ReleaseDC(mWindowHandle, mhDC))
+		{
+			LL_WARNS("Window") << "Release of ghDC failed" << LL_ENDL;
+		}
 		mhDC = NULL;
 	}
 
 	LL_DEBUGS("Window") << "Destroying Window" << LL_ENDL;
-	
-	// Don't process events in our mainWindowProc any longer.
-	SetWindowLongPtr(mWindowHandle, GWLP_USERDATA, NULL);
 
 	// Make sure we don't leave a blank toolbar button.
 	ShowWindow(mWindowHandle, SW_HIDE);
-- 
GitLab