#ifndef WX_PRECOMP
#include "wx/app.h"
+ #include "wx/bitmap.h"
#include "wx/intl.h"
#include "wx/list.h"
#include "wx/log.h"
#include "wx/msgdlg.h"
+ #include "wx/bitmap.h"
+ #include "wx/confbase.h"
#endif
#include "wx/apptrait.h"
-#if wxUSE_FONTMAP
- #include "wx/fontmap.h"
-#endif // wxUSE_FONTMAP
#include "wx/msgout.h"
#include "wx/thread.h"
#include "wx/utils.h"
+#if defined(__WXMSW__)
+ #include "wx/msw/private.h" // includes windows.h for LOGFONT
+#endif
+
+#if wxUSE_FONTMAP
+ #include "wx/fontmap.h"
+#endif // wxUSE_FONTMAP
+
// ============================================================================
// wxAppBase implementation
// ============================================================================
// ----------------------------------------------------------------------------
-// initialization and termination
+// initialization
// ----------------------------------------------------------------------------
wxAppBase::wxAppBase()
m_exitOnFrameDelete = Later;
}
+bool wxAppBase::Initialize(int& argc, wxChar **argv)
+{
+ if ( !wxAppConsole::Initialize(argc, argv) )
+ return false;
+
+#if wxUSE_THREADS
+ wxPendingEventsLocker = new wxCriticalSection;
+#endif
+
+ wxInitializeStockLists();
+ wxInitializeStockObjects();
+
+ wxBitmap::InitStandardHandlers();
+
+ return true;
+}
+
+// ----------------------------------------------------------------------------
+// cleanup
+// ----------------------------------------------------------------------------
+
wxAppBase::~wxAppBase()
{
// this destructor is required for Darwin
}
+void wxAppBase::CleanUp()
+{
+ // one last chance for pending objects to be cleaned up
+ DeletePendingObjects();
+
+ wxBitmap::CleanUpHandlers();
+
+ wxDeleteStockObjects();
+
+ wxDeleteStockLists();
+
+ delete wxTheColourDatabase;
+ wxTheColourDatabase = NULL;
+
+#if wxUSE_THREADS
+ delete wxPendingEvents;
+ wxPendingEvents = NULL;
+
+ delete wxPendingEventsLocker;
+ wxPendingEventsLocker = NULL;
+
+#if wxUSE_VALIDATORS
+ // If we don't do the following, we get an apparent memory leak.
+ ((wxEvtHandler&) wxDefaultValidator).ClearEventLocker();
+#endif // wxUSE_VALIDATORS
+#endif // wxUSE_THREADS
+}
+
+// ----------------------------------------------------------------------------
+// OnXXX() hooks
+// ----------------------------------------------------------------------------
+
bool wxAppBase::OnInitGui()
{
#ifdef __WXUNIVERSAL__
wxAppTraits *wxAppBase::CreateTraits()
{
- return wxAppTraits::CreateGUI();
+ return new wxGUIAppTraits;
}
// ----------------------------------------------------------------------------
(void)ProcessEvent(event);
}
+void wxAppBase::DeletePendingObjects()
+{
+ wxList::compatibility_iterator node = wxPendingDelete.GetFirst();
+ while (node)
+ {
+ wxObject *obj = node->GetData();
+
+ delete obj;
+
+ if (wxPendingDelete.Member(obj))
+ wxPendingDelete.Erase(node);
+
+ // Deleting one object may have deleted other pending
+ // objects, so start from beginning of list again.
+ node = wxPendingDelete.GetFirst();
+ }
+}
+
+// Returns TRUE if more time is needed.
+bool wxAppBase::ProcessIdle()
+{
+ wxIdleEvent event;
+ bool needMore = FALSE;
+ wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst();
+ node = wxTopLevelWindows.GetFirst();
+ while (node)
+ {
+ wxWindow* win = node->GetData();
+ if (SendIdleEvents(win, event))
+ needMore = TRUE;
+ node = node->GetNext();
+ }
+
+ event.SetEventObject(this);
+ (void) ProcessEvent(event);
+ if (event.MoreRequested())
+ needMore = TRUE;
+
+ wxUpdateUIEvent::ResetUpdateTime();
+
+ return needMore;
+}
+
+// Send idle event to window and all subwindows
+bool wxAppBase::SendIdleEvents(wxWindow* win, wxIdleEvent& event)
+{
+ bool needMore = FALSE;
+
+ win->OnInternalIdle();
+
+ if (wxIdleEvent::CanSend(win))
+ {
+ event.SetEventObject(win);
+ win->GetEventHandler()->ProcessEvent(event);
+
+ if (event.MoreRequested())
+ needMore = TRUE;
+ }
+ wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst();
+ while ( node )
+ {
+ wxWindow *child = node->GetData();
+ if (SendIdleEvents(child, event))
+ needMore = TRUE;
+
+ node = node->GetNext();
+ }
+
+ return needMore;
+}
+
+void wxAppBase::OnIdle(wxIdleEvent& WXUNUSED(event))
+{
+ // If there are pending events, we must process them: pending events
+ // are either events to the threads other than main or events posted
+ // with wxPostEvent() functions
+ // GRG: I have moved this here so that all pending events are processed
+ // before starting to delete any objects. This behaves better (in
+ // particular, wrt wxPostEvent) and is coherent with wxGTK's current
+ // behaviour. Changed Feb/2000 before 2.1.14
+ ProcessPendingEvents();
+
+ // 'Garbage' collection of windows deleted with Close().
+ DeletePendingObjects();
+
+#if wxUSE_LOG
+ // flush the logged messages if any
+ wxLog::FlushActive();
+#endif // wxUSE_LOG
+
+}
+
// ----------------------------------------------------------------------------
// wxGUIAppTraitsBase
// ----------------------------------------------------------------------------
wxPendingDelete.DeleteObject(object);
}
-// ----------------------------------------------------------------------------
-// wxAppTraits
-// ----------------------------------------------------------------------------
-
-wxAppTraits *wxAppTraitsBase::CreateGUI()
-{
- return new wxGUIAppTraits;
-}
-