]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/app.cpp
No longer emit char events for shift/ctrl presses.
[wxWidgets.git] / src / msw / app.cpp
index 21dd1dbeccabee29bb34a3b16872716375efe8c7..ac660f8e3f1603a5bcc67677ac8eb2360fcaba2b 100644 (file)
@@ -93,8 +93,8 @@ extern char *wxOsVersion;
 extern wxList *wxWinHandleList;
 extern wxList WXDLLEXPORT wxPendingDelete;
 #if wxUSE_THREADS
-extern wxList wxPendingEvents;
-extern wxCriticalSection wxPendingEventsLocker;
+extern wxList *wxPendingEvents;
+extern wxCriticalSection *wxPendingEventsLocker;
 #endif
 extern void wxSetKeyboardHook(bool doIt);
 extern wxCursor *g_globalCursor;
@@ -169,6 +169,12 @@ bool wxApp::Initialize()
     wxGetResource("wxWindows", "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();
+#endif
+
     wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING);
     wxTheColourDatabase->Initialize();
 
@@ -551,6 +557,15 @@ void wxApp::CleanUp()
     if (wxWinHandleList)
         delete wxWinHandleList ;
 
+    // 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;
+    delete wxPendingEventsLocker;
+    // If we don't do the following, we get an apparent memory leak.
+    ((wxEvtHandler&) wxDefaultValidator).ClearEventLocker();
+#endif
+
     wxClassInfo::CleanUpClasses();
 
     delete wxTheApp;
@@ -899,11 +914,6 @@ int wxApp::MainLoop()
 
 
         DoMessage();
-
-       // If they are pending events, we must process them.
-#if wxUSE_THREADS
-       ProcessPendingEvents();
-#endif
     }
 
     return s_currentMsg.wParam;
@@ -921,9 +931,9 @@ bool wxApp::ProcessIdle()
 
 #if wxUSE_THREADS
 void wxApp::ProcessPendingEvents()
-
-    wxNode *node = wxPendingEvents.First();
-    wxCriticalSectionLocker locker(wxPendingEventsLocker);
+{
+    wxNode *node = wxPendingEvents->First();
+    wxCriticalSectionLocker locker(*wxPendingEventsLocker);
 
     while (node)
     {
@@ -932,7 +942,7 @@ void wxApp::ProcessPendingEvents()
         handler->ProcessPendingEvents();
 
         delete node;
-        node = wxPendingEvents.First();
+        node = wxPendingEvents->First();
     }
 }
 #endif
@@ -1009,6 +1019,10 @@ void wxApp::OnIdle(wxIdleEvent& event)
         event.RequestMore(TRUE);
     }
 
+    // If they are pending events, we must process them.
+#if wxUSE_THREADS
+    ProcessPendingEvents();
+#endif
     s_inOnIdle = FALSE;
 }
 
@@ -1016,14 +1030,14 @@ void wxApp::OnIdle(wxIdleEvent& event)
 bool wxApp::SendIdleEvents()
 {
     bool needMore = FALSE;
-    wxNode* node = wxTopLevelWindows.First();
+
+    wxWindowList::Node* node = wxTopLevelWindows.GetFirst();
     while (node)
     {
-        wxWindow* win = (wxWindow*) node->Data();
+        wxWindow* win = node->GetData();
         if (SendIdleEvents(win))
             needMore = TRUE;
-
-        node = node->Next();
+        node = node->GetNext();
     }
 
     return needMore;
@@ -1097,8 +1111,8 @@ wxWindow* wxApp::GetTopWindow() const
 {
     if (m_topWindow)
         return m_topWindow;
-    else if (wxTopLevelWindows.Number() > 0)
-        return (wxWindow*) wxTopLevelWindows.First()->Data();
+    else if (wxTopLevelWindows.GetCount() > 0)
+        return wxTopLevelWindows.GetFirst()->GetData();
     else
         return NULL;
 }
@@ -1164,6 +1178,10 @@ bool wxYield()
         if ( !wxTheApp->DoMessage() )
             break;
     }
+    // If they are pending events, we must process them.
+#if wxUSE_THREADS
+    wxTheApp->ProcessPendingEvents();
+#endif
 
     return TRUE;
 }