]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/app.cpp
Fixed a crash when GetMonthControl returns NULL
[wxWidgets.git] / src / gtk / app.cpp
index 65710bb24dccd17b3d952cbcc99b9e22ab6e898b..e3badff23723783c2ec63a11088ffb2a3bb57d2b 100644 (file)
@@ -42,7 +42,9 @@
 #endif
 
 #include <unistd.h>
 #endif
 
 #include <unistd.h>
-#ifdef __VMS
+#if defined(__DARWIN__)
+// FIXME: select must be used instead of poll (GD)
+#elif defined(__VMS)
 # include <poll.h>
 #else
 # include <sys/poll.h>
 # include <poll.h>
 #else
 # include <sys/poll.h>
@@ -245,7 +247,14 @@ static gint wxapp_poll_func( GPollFD *ufds, guint nfds, gint timeout )
     wxMutexGuiLeave();
     g_mainThreadLocked = TRUE;
 
     wxMutexGuiLeave();
     g_mainThreadLocked = TRUE;
 
+#ifdef __DARWIN__
+    // FIXME: poll is not available under Darwin/Mac OS X and this needs
+    //        to be implemented using select instead (GD)
+    //        what about other BSD derived systems?
+    res = -1;
+#else
     res = poll( (struct pollfd*) ufds, nfds, timeout );
     res = poll( (struct pollfd*) ufds, nfds, timeout );
+#endif
 
     wxMutexGuiEnter();
     g_mainThreadLocked = FALSE;
 
     wxMutexGuiEnter();
     g_mainThreadLocked = FALSE;
@@ -486,12 +495,37 @@ bool wxApp::SendIdleEvents()
         wxWindow* win = node->GetData();
         if (SendIdleEvents(win))
             needMore = TRUE;
         wxWindow* win = node->GetData();
         if (SendIdleEvents(win))
             needMore = TRUE;
+            
         node = node->GetNext();
     }
 
         node = node->GetNext();
     }
 
+    node = wxTopLevelWindows.GetFirst();
+    while (node)
+    {
+        wxWindow* win = node->GetData();
+        CallInternalIdle( win );
+        
+        node = node->GetNext();
+    }
     return needMore;
 }
 
     return needMore;
 }
 
+bool wxApp::CallInternalIdle( wxWindow* win )
+{
+    win->OnInternalIdle();
+
+    wxNode* node = win->GetChildren().First();
+    while (node)
+    {
+        wxWindow* win = (wxWindow*) node->Data();
+        CallInternalIdle( win );
+
+        node = node->Next();
+    }
+    
+    return TRUE;
+}
+
 bool wxApp::SendIdleEvents( wxWindow* win )
 {
     bool needMore = FALSE;
 bool wxApp::SendIdleEvents( wxWindow* win )
 {
     bool needMore = FALSE;
@@ -501,8 +535,6 @@ bool wxApp::SendIdleEvents( wxWindow* win )
 
     win->GetEventHandler()->ProcessEvent(event);
 
 
     win->GetEventHandler()->ProcessEvent(event);
 
-    win->OnInternalIdle();
-
     if (event.MoreRequested())
         needMore = TRUE;
 
     if (event.MoreRequested())
         needMore = TRUE;
 
@@ -784,33 +816,24 @@ int wxEntry( int argc, char *argv[] )
 
     if ( retValue == 0 )
     {
 
     if ( retValue == 0 )
     {
-        /* delete pending toplevel windows (typically a single
-           dialog) so that, if there isn't any left, we don't
-           call OnRun() */
+        // Delete pending toplevel windows
         wxTheApp->DeletePendingObjects();
 
         wxTheApp->DeletePendingObjects();
 
-        wxTheApp->m_initialized = wxTopLevelWindows.GetCount() != 0;
+        // When is the app not initialized ?
+        wxTheApp->m_initialized = TRUE;
 
         if (wxTheApp->Initialized())
         {
             wxTheApp->OnRun();
 
             wxWindow *topWindow = wxTheApp->GetTopWindow();
 
         if (wxTheApp->Initialized())
         {
             wxTheApp->OnRun();
 
             wxWindow *topWindow = wxTheApp->GetTopWindow();
+            
+            // Delete all pending windows if any
+            wxTheApp->DeletePendingObjects();
+    
+            // Reset top window 
             if (topWindow)
             if (topWindow)
-            {
-                /* Forcibly delete the window. */
-                if (topWindow->IsKindOf(CLASSINFO(wxFrame)) ||
-                    topWindow->IsKindOf(CLASSINFO(wxDialog)) )
-                {
-                    topWindow->Close( TRUE );
-                    wxTheApp->DeletePendingObjects();
-                }
-                else
-                {
-                    delete topWindow;
-                    wxTheApp->SetTopWindow( (wxWindow*) NULL );
-                }
-            }
+                wxTheApp->SetTopWindow( (wxWindow*) NULL );
 
             retValue = wxTheApp->OnExit();
         }
 
             retValue = wxTheApp->OnExit();
         }
@@ -821,47 +844,6 @@ int wxEntry( int argc, char *argv[] )
     return retValue;
 }
 
     return retValue;
 }
 
-#ifndef __WXUNIVERSAL__
-
-// XPM hack: make the arrays const
-#define static static const
-
-#include "wx/gtk/info.xpm"
-#include "wx/gtk/error.xpm"
-#include "wx/gtk/question.xpm"
-#include "wx/gtk/warning.xpm"
-
-#undef static
-
-wxIcon wxApp::GetStdIcon(int which) const
-{
-    switch(which)
-    {
-        case wxICON_INFORMATION:
-            return wxIcon(info_xpm);
-
-        case wxICON_QUESTION:
-            return wxIcon(question_xpm);
-
-        case wxICON_EXCLAMATION:
-            return wxIcon(warning_xpm);
-
-        default:
-            wxFAIL_MSG(wxT("requested non existent standard icon"));
-            // still fall through
-
-        case wxICON_HAND:
-            return wxIcon(error_xpm);
-    }
-}
-#else
-wxIcon wxApp::GetStdIcon(int which) const
-{
-    return wxTheme::Get()->GetRenderer()->GetStdIcon(which);
-}
-#endif // !__WXUNIVERSAL__
-
-
 #ifdef __WXDEBUG__
 
 void wxApp::OnAssert(const wxChar *file, int line, const wxChar *msg)
 #ifdef __WXDEBUG__
 
 void wxApp::OnAssert(const wxChar *file, int line, const wxChar *msg)