extern wxChar *wxOsVersion;
extern wxList *wxWinHandleList;
extern wxList WXDLLEXPORT wxPendingDelete;
-#if wxUSE_THREADS
-extern wxList *wxPendingEvents;
-extern wxCriticalSection *wxPendingEventsLocker;
-#endif
extern void wxSetKeyboardHook(bool doIt);
extern wxCursor *g_globalCursor;
wxGetResource(wxT("wxWindows"), wxT("OsVersion"), &wxOsVersion);
#endif
- // I'm annoyed ... I don't know where to put this and I don't want to
- // create a module for that as it's part of the core.
#if wxUSE_THREADS
- wxPendingEvents = new wxList();
- wxPendingEventsLocker = new wxCriticalSection();
+ wxPendingEventsLocker = new wxCriticalSection;
#endif
wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING);
// GL: I'm annoyed ... I don't know where to put this and I don't want to
// create a module for that as it's part of the core.
-#if wxUSE_THREADS
delete wxPendingEvents;
+#if wxUSE_THREADS
delete wxPendingEventsLocker;
// If we don't do the following, we get an apparent memory leak.
((wxEvtHandler&) wxDefaultValidator).ClearEventLocker();
return event.MoreRequested();
}
-#if wxUSE_THREADS
void wxApp::ProcessPendingEvents()
{
- wxNode *node = wxPendingEvents->First();
+#if wxUSE_THREADS
+ // ensure that we're the only thread to modify the pending events list
wxCriticalSectionLocker locker(*wxPendingEventsLocker);
+#endif
+ if ( !wxPendingEvents )
+ return;
+
+ wxNode *node = wxPendingEvents->First();
while (node)
{
wxEvtHandler *handler = (wxEvtHandler *)node->Data();
node = wxPendingEvents->First();
}
}
-#endif
-
void wxApp::ExitMainLoop()
{
event.RequestMore(TRUE);
}
- // If they are pending events, we must process them.
-#if wxUSE_THREADS
+ // If they are pending events, we must process them: pending events are
+ // either events to the threads other than main or events posted with
+ // wxPostEvent() functions
ProcessPendingEvents();
-#endif
+
s_inOnIdle = FALSE;
}
// Yield to incoming messages
bool wxYield()
{
+ // we don't want to process WM_QUIT from here - it should be processed in
+ // the main event loop in order to stop it
+
MSG msg;
- // We want to go back to the main message loop
- // if we see a WM_QUIT. (?)
-#ifdef __WXWINE__
- while (PeekMessage(&msg, (HWND)NULL, 0, 0, PM_NOREMOVE) && msg.message != WM_QUIT)
-#else
- while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) && msg.message != WM_QUIT)
-#endif
+ while ( PeekMessage(&msg, (HWND)0, 0, 0, PM_NOREMOVE) &&
+ msg.message != WM_QUIT )
{
if ( !wxTheApp->DoMessage() )
break;
}
+
// If they are pending events, we must process them.
-#if wxUSE_THREADS
wxTheApp->ProcessPendingEvents();
-#endif
return TRUE;
}