- static wxToolkitInfo info;
- wxToolkitInfo& baseInfo = wxAppTraits::GetToolkitInfo();
- info.versionMajor = baseInfo.versionMajor;
- info.versionMinor = baseInfo.versionMinor;
- info.os = baseInfo.os;
- info.shortName = _T("msw");
- info.name = _T("wxMSW");
-#ifdef __WXUNIVERSAL__
- info.shortName << _T("univ");
- info.name << _T("/wxUniversal");
+ // We only ever dispatch messages from the main thread and, additionally,
+ // even from the main thread we shouldn't wait for the message if we don't
+ // have a running event loop as we would never remove them from the message
+ // queue then and so we would enter an infinite loop as
+ // MsgWaitForMultipleObjects() keeps returning WAIT_OBJECT_0 + 1.
+ if ( flags == wxTHREAD_WAIT_BLOCK ||
+ !wxIsMainThread() ||
+ !wxEventLoop::GetActive() )
+ {
+ // Simple blocking wait.
+ return DoSimpleWaitForThread(hThread);
+ }
+
+ return ::MsgWaitForMultipleObjects
+ (
+ 1, // number of objects to wait for
+ (HANDLE *)&hThread, // the objects
+ false, // wait for any objects, not all
+ INFINITE, // no timeout
+ QS_ALLINPUT | // return as soon as there are any events
+ QS_ALLPOSTMESSAGE
+ );
+}
+#endif // wxUSE_THREADS
+
+wxPortId wxGUIAppTraits::GetToolkitVersion(int *majVer, int *minVer) const
+{
+ OSVERSIONINFO info;
+ wxZeroMemory(info);
+
+ // on Windows, the toolkit version is the same of the OS version
+ // as Windows integrates the OS kernel with the GUI toolkit.
+ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ if ( ::GetVersionEx(&info) )
+ {
+ if ( majVer )
+ *majVer = info.dwMajorVersion;
+ if ( minVer )
+ *minVer = info.dwMinorVersion;
+ }
+
+#if defined(__WXHANDHELD__) || defined(__WXWINCE__)
+ return wxPORT_WINCE;
+#else
+ return wxPORT_MSW;