opengles emulator: Fixed Windows renderer termination

Make the event pump loop in the renderer process we do on Windows
exit when the Framebuffer's subwindow is destroyed.
Fixed TcpStream to close the socket using 'closesocket' on windows,
otherwise the other end of the socket does not sense that the socket
is closed.

+ Use WS_DISABLED to ensure that our GL subwindow doesn't receive
  any input events.

Change-Id: Icb477b3e1d7993a8880acb5e01bc5da29309ae50
diff --git a/tools/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.cpp b/tools/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.cpp
index 2f9a556..9f84937 100644
--- a/tools/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.cpp
+++ b/tools/emulator/opengl/host/libs/libOpenglRender/FrameBuffer.cpp
@@ -91,6 +91,10 @@
         s_egl.eglMakeCurrent(s_theFrameBuffer->m_eglDisplay, NULL, NULL, NULL);
         s_egl.eglDestroySurface(s_theFrameBuffer->m_eglDisplay,s_theFrameBuffer->m_eglSurface);
         s_egl.eglDestroyContext(s_theFrameBuffer->m_eglDisplay,s_theFrameBuffer->m_eglContext);
+        if (s_theFrameBuffer->m_subWin) {
+            destroySubWindow(s_theFrameBuffer->m_subWinDisplay,
+                             s_theFrameBuffer->m_subWin);
+        }
         delete s_theFrameBuffer;
         s_theFrameBuffer = NULL;
     }
diff --git a/tools/emulator/opengl/host/libs/libOpenglRender/NativeWindowsSubWindow.cpp b/tools/emulator/opengl/host/libs/libOpenglRender/NativeWindowsSubWindow.cpp
index 4ff3943..e519b68 100644
--- a/tools/emulator/opengl/host/libs/libOpenglRender/NativeWindowsSubWindow.cpp
+++ b/tools/emulator/opengl/host/libs/libOpenglRender/NativeWindowsSubWindow.cpp
@@ -38,9 +38,11 @@
 
     RegisterClass(&wc);
     printf("creating window %d %d %d %d\n",x,y,width,height);
-    EGLNativeWindowType ret = CreateWindow("subWin",
+    EGLNativeWindowType ret = CreateWindowEx(
+                        WS_EX_NOPARENTNOTIFY,  // do not bother our parent window
+                        "subWin",
                         "sub",
-                        WS_CHILD,
+                        WS_CHILD|WS_DISABLED,
                         x,y,width,height,
                         p_window,
                         NULL,
@@ -51,5 +53,5 @@
 }
 
 void destroySubWindow(EGLNativeDisplayType dis,EGLNativeWindowType win){
-    DestroyWindow(win);
+    PostMessage(win, WM_CLOSE, 0, 0);
 }
diff --git a/tools/emulator/opengl/host/renderer/main.cpp b/tools/emulator/opengl/host/renderer/main.cpp
index 3a6d0af..fb20454 100644
--- a/tools/emulator/opengl/host/renderer/main.cpp
+++ b/tools/emulator/opengl/host/renderer/main.cpp
@@ -140,7 +140,7 @@
     //
     // run the server listener loop
     //
-    server->Main(); // never returns
+    server->Main();
 #else
     //
     // on windows we need to handle messages for the
@@ -152,24 +152,15 @@
 
     //
     // Dispatch events for the subwindow
+    // During termination of the render server, the FrameBuffer
+    // will be finalized, the Framebuffer subwindow will
+    // get destroyed and the following loop will exit.
     //
     MSG msg;
     HWND hWnd = FrameBuffer::getFB()->getSubWindow();
-    bool done = 0;
-    while(!done) {
-        GetMessage(&msg, hWnd, 0, 0);
+    while( GetMessage(&msg, hWnd, 0, 0) > 0 ) {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
-
-        //
-        // if server thread has exiting
-        // wait for it to exit and done.
-        //
-        if (server->isExiting()) {
-            int exitStatus;
-            server->wait(&exitStatus);
-            done = true;
-        }
     }
 #endif
 
diff --git a/tools/emulator/opengl/shared/OpenglCodecCommon/TcpStream.cpp b/tools/emulator/opengl/shared/OpenglCodecCommon/TcpStream.cpp
index f144a9f..4e947da 100644
--- a/tools/emulator/opengl/shared/OpenglCodecCommon/TcpStream.cpp
+++ b/tools/emulator/opengl/shared/OpenglCodecCommon/TcpStream.cpp
@@ -44,7 +44,11 @@
 TcpStream::~TcpStream()
 {
     if (m_sock >= 0) {
+#ifdef _WIN32
+        closesocket(m_sock);
+#else
         ::close(m_sock);
+#endif
     }
     if (m_buf != NULL) {
         free(m_buf);