#include "wx/msgdlg.h"
#include "wx/confbase.h"
#include "wx/utils.h"
+ #include "wx/wxcrtvararg.h"
#endif
#include "wx/apptrait.h"
#include "wx/cmdline.h"
-#include "wx/evtloop.h"
#include "wx/msgout.h"
#include "wx/thread.h"
#include "wx/vidmode.h"
-#include "wx/ptr_scpd.h"
#ifdef __WXDEBUG__
#if wxUSE_STACKWALKER
WXDLLIMPEXP_DATA_CORE(wxList) wxPendingDelete;
-// ----------------------------------------------------------------------------
-// wxEventLoopPtr
-// ----------------------------------------------------------------------------
-
-// this defines wxEventLoopPtr
-wxDEFINE_TIED_SCOPED_PTR_TYPE(wxEventLoop)
-
// ============================================================================
// wxAppBase implementation
// ============================================================================
wxAppBase::wxAppBase()
{
m_topWindow = (wxWindow *)NULL;
-
+
m_useBestVisual = false;
m_forceTrueColour = false;
-
- m_isActive = true;
- m_mainLoop = NULL;
+ m_isActive = true;
// We don't want to exit the app if the user code shows a dialog from its
// OnInit() -- but this is what would happen if we set m_exitOnFrameDelete
if ( !wxAppConsole::Initialize(argcOrig, argvOrig) )
return false;
-#if wxUSE_THREADS
- wxPendingEventsLocker = new wxCriticalSection;
-#endif
-
wxInitializeStockLists();
wxBitmap::InitStandardHandlers();
delete wxTheColourDatabase;
wxTheColourDatabase = NULL;
- delete wxPendingEvents;
- wxPendingEvents = NULL;
-
#if wxUSE_THREADS
- 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
+
+ wxAppConsole::CleanUp();
}
// ----------------------------------------------------------------------------
#endif // wxUSE_CMDLINE_PARSER
-// ----------------------------------------------------------------------------
-// main event loop implementation
-// ----------------------------------------------------------------------------
-
-int wxAppBase::MainLoop()
-{
- wxEventLoopTiedPtr mainLoop(&m_mainLoop, new wxEventLoop);
-
- return m_mainLoop->Run();
-}
-
-void wxAppBase::ExitMainLoop()
-{
- // we should exit from the main event loop, not just any currently active
- // (e.g. modal dialog) event loop
- if ( m_mainLoop && m_mainLoop->IsRunning() )
- {
- m_mainLoop->Exit(0);
- }
-}
-
-bool wxAppBase::Pending()
-{
- // use the currently active message loop here, not m_mainLoop, because if
- // we're showing a modal dialog (with its own event loop) currently the
- // main event loop is not running anyhow
- wxEventLoop * const loop = wxEventLoop::GetActive();
-
- return loop && loop->Pending();
-}
-
-bool wxAppBase::Dispatch()
-{
- // see comment in Pending()
- wxEventLoop * const loop = wxEventLoop::GetActive();
-
- return loop && loop->Dispatch();
-}
-
// ----------------------------------------------------------------------------
// OnXXX() hooks
// ----------------------------------------------------------------------------
}
//else: it has been changed, assume the user knows what he is doing
- return MainLoop();
+ return wxAppConsole::OnRun();
}
int wxAppBase::OnExit()
return wxAppConsole::OnExit();
}
-void wxAppBase::Exit()
-{
- ExitMainLoop();
-}
-
wxAppTraits *wxAppBase::CreateTraits()
{
return new wxGUIAppTraits;
// Returns true if more time is needed.
bool wxAppBase::ProcessIdle()
{
+ // process pending wx events before sending idle events
+ ProcessPendingEvents();
+
wxIdleEvent event;
bool needMore = false;
wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst();
node = node->GetNext();
}
- event.SetEventObject(this);
- (void) ProcessEvent(event);
- if (event.MoreRequested())
+ if (wxAppConsole::ProcessIdle())
needMore = true;
+ // 'Garbage' collection of windows deleted with Close().
+ DeletePendingObjects();
+
+#if wxUSE_LOG
+ // flush the logged messages if any
+ wxLog::FlushActive();
+#endif
+
wxUpdateUIEvent::ResetUpdateTime();
return needMore;
win->OnInternalIdle();
- if (wxIdleEvent::CanSend(win))
+ // should we send idle event to this window?
+ if ( wxIdleEvent::GetMode() == wxIDLE_PROCESS_ALL ||
+ win->HasExtraStyle(wxWS_EX_PROCESS_IDLE) )
{
event.SetEventObject(win);
win->GetEventHandler()->ProcessEvent(event);
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
-
-}
-
-// ----------------------------------------------------------------------------
-// exceptions support
-// ----------------------------------------------------------------------------
-
-#if wxUSE_EXCEPTIONS
-
-bool wxAppBase::OnExceptionInMainLoop()
-{
- throw;
-
- // some compilers are too stupid to know that we never return after throw
-#if defined(__DMC__) || (defined(_MSC_VER) && _MSC_VER < 1200)
- return false;
-#endif
-}
-
-#endif // wxUSE_EXCEPTIONS
-
// ----------------------------------------------------------------------------
// wxGUIAppTraitsBase
// ----------------------------------------------------------------------------
wxLog *wxGUIAppTraitsBase::CreateLogTarget()
{
-#if wxUSE_LOGGUI
+// DE: One day I'll remove this but right now the generic dialog used for this
+// just doesn't work right at all on wxCocoa.
+#if wxUSE_LOGGUI && !defined(__WXCOCOA__)
return new wxLogGui;
#else
// we must have something!
// wxMessageOutputMessageBox doesn't work under Motif
#ifdef __WXMOTIF__
return new wxMessageOutputLog;
- #else
+ #elif wxUSE_MSGDLG
return new wxMessageOutputMessageBox;
+ #else
+ return new wxMessageOutputStderr;
#endif
#endif // __UNIX__/!__UNIX__
}