]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/gsockmsw.cpp
simplified and cleaned up wxGTK's focus handling
[wxWidgets.git] / src / msw / gsockmsw.cpp
index a1ada1918bceac633f96a474fbe5c618d7184244..489feff570b45f59d255b128d01ac6ddd446dde3 100644 (file)
@@ -38,6 +38,9 @@
 
 #include "wx/gsocket.h"
 #include "wx/apptrait.h"
+#include "wx/link.h"
+
+wxFORCE_LINK_THIS_MODULE(gsockmsw)
 
 extern "C" WXDLLIMPEXP_BASE HINSTANCE wxGetInstance();
 #define INSTANCE wxGetInstance()
@@ -311,7 +314,19 @@ void GSocketMSWManager::Destroy_Socket(GSocket *socket)
   /* Remove the socket from the list */
   EnterCriticalSection(&critical);
   if ( socket->IsOk() )
-      socketList[(socket->m_msgnumber - WM_USER)] = NULL;
+  {
+      const int msgnum = socket->m_msgnumber;
+
+      // we need to remove any pending messages for this socket to avoid having
+      // them sent to a new socket which could reuse the same message number as
+      // soon as we destroy this one
+      MSG msg;
+      while ( ::PeekMessage(&msg, hWin, msgnum, msgnum, PM_REMOVE) )
+          ;
+
+      socketList[msgnum - WM_USER] = NULL;
+  }
+
   LeaveCriticalSection(&critical);
 }
 
@@ -458,6 +473,6 @@ static struct ManagerSetter
         static GSocketMSWManager s_manager;
         wxAppTraits::SetDefaultSocketManager(&s_manager);
     }
-} gsm_managerSetter;
+} gs_managerSetter;
 
 #endif  // wxUSE_SOCKETS