]>
git.saurik.com Git - wxWidgets.git/blob - src/stubs/app.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   8 // Copyright:   (c) AUTHOR 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 #pragma implementation "app.h" 
  19 #include "wx/gdicmn.h" 
  22 #include "wx/cursor.h" 
  24 #include "wx/palette.h" 
  26 #include "wx/dialog.h" 
  27 #include "wx/msgdlg.h" 
  29 #include "wx/module.h" 
  30 #include "wx/memory.h" 
  32 #if wxUSE_WX_RESOURCES 
  33 #include "wx/resource.h" 
  38 extern char *wxBuffer
; 
  39 extern wxList wxPendingDelete
; 
  41 wxApp 
*wxTheApp 
= NULL
; 
  43 #if !USE_SHARED_LIBRARY 
  44 IMPLEMENT_DYNAMIC_CLASS(wxApp
, wxEvtHandler
) 
  45 BEGIN_EVENT_TABLE(wxApp
, wxEvtHandler
) 
  46     EVT_IDLE(wxApp::OnIdle
) 
  50 long wxApp::sm_lastMessageTime 
= 0; 
  52 bool wxApp::Initialize() 
  55   wxBuffer 
= new char[1500]; 
  57   wxBuffer 
= new char[BUFSIZ 
+ 512]; 
  61 #if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT 
  63   streambuf* sBuf = new wxDebugStreamBuf; 
  64   ostream* oStr = new ostream(sBuf) ; 
  65   wxDebugContext::SetStream(oStr, sBuf); 
  69   wxClassInfo::InitializeClasses(); 
  71   wxTheColourDatabase 
= new wxColourDatabase(wxKEY_STRING
); 
  72   wxTheColourDatabase
->Initialize(); 
  74   wxInitializeStockLists(); 
  75   wxInitializeStockObjects(); 
  77 #if wxUSE_WX_RESOURCES 
  78   wxInitializeResourceSystem(); 
  81   wxBitmap::InitStandardHandlers(); 
  83   wxModule::RegisterModules(); 
  84   wxASSERT( wxModule::InitializeModules() == TRUE 
); 
  91   wxModule::CleanUpModules(); 
  93 #if wxUSE_WX_RESOURCES 
  94   wxCleanUpResourceSystem(); 
  97   wxDeleteStockObjects() ; 
  99   // Destroy all GDI lists, etc. 
 101   delete wxTheBrushList
; 
 102   wxTheBrushList 
= NULL
; 
 107   delete wxTheFontList
; 
 108   wxTheFontList 
= NULL
; 
 110   delete wxTheBitmapList
; 
 111   wxTheBitmapList 
= NULL
; 
 113   delete wxTheColourDatabase
; 
 114   wxTheColourDatabase 
= NULL
; 
 116   wxBitmap::CleanUpHandlers(); 
 121   wxClassInfo::CleanUpClasses(); 
 126 #if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT 
 127   // At this point we want to check if there are any memory 
 128   // blocks that aren't part of the wxDebugContext itself, 
 129   // as a special case. Then when dumping we need to ignore 
 130   // wxDebugContext, too. 
 131   if (wxDebugContext::CountObjectsLeft() > 0) 
 133     wxTrace("There were memory leaks.\n"); 
 134     wxDebugContext::Dump(); 
 135     wxDebugContext::PrintStatistics(); 
 137 //  wxDebugContext::SetStream(NULL, NULL); 
 140   // do it as the very last thing because everything else can log messages 
 141   wxLog::DontCreateOnDemand(); 
 142   // do it as the very last thing because everything else can log messages 
 143   delete wxLog::SetActiveTarget(NULL
); 
 146 int wxEntry( int argc
, char *argv
[] ) 
 148   if (!wxApp::Initialize()) 
 152     if (!wxApp::GetInitializerFunction()) 
 154       printf( "wxWindows error: No initializer - use IMPLEMENT_APP macro.\n" ); 
 158         wxTheApp 
= (wxApp
*) (* wxApp::GetInitializerFunction()) (); 
 163     printf( "wxWindows error: wxTheApp == NULL\n" ); 
 167   wxTheApp
->argc 
= argc
; 
 168   wxTheApp
->argv 
= argv
; 
 170   // GUI-specific initialization, such as creating an app context. 
 171   wxTheApp
->OnInitGui(); 
 173   // Here frames insert themselves automatically 
 174   // into wxTopLevelWindows by getting created 
 177   if (!wxTheApp
->OnInit()) return 0; 
 181   if (wxTheApp
->Initialized()) retValue 
= wxTheApp
->OnRun(); 
 183   if (wxTheApp
->GetTopWindow()) 
 185     delete wxTheApp
->GetTopWindow(); 
 186     wxTheApp
->SetTopWindow(NULL
); 
 189   wxTheApp
->DeletePendingObjects();   
 198 // Static member initialization 
 199 wxAppInitializerFunction 
wxApp::m_appInitFn 
= (wxAppInitializerFunction
) NULL
; 
 206   m_wantDebugOutput 
= TRUE 
; 
 211   m_printMode 
= wxPRINT_WINDOWS
; 
 213   m_printMode 
= wxPRINT_POSTSCRIPT
; 
 215   m_exitOnFrameDelete 
= TRUE
; 
 219 bool wxApp::Initialized() 
 227 int wxApp::MainLoop() 
 231 /* TODO: implement your main loop here, calling ProcessIdle in idle time. 
 234     while (!::PeekMessage(&s_currentMsg, 0, 0, 0, PM_NOREMOVE) && 
 244 // Returns TRUE if more time is needed. 
 245 bool wxApp::ProcessIdle() 
 248     event
.SetEventObject(this); 
 251     return event
.MoreRequested(); 
 254 void wxApp::ExitMainLoop() 
 259 // Is a message/event pending? 
 260 bool wxApp::Pending() 
 267 // Dispatch a message. 
 268 void wxApp::Dispatch() 
 274 void wxApp::OnIdle(wxIdleEvent
& event
) 
 276   static bool inOnIdle 
= FALSE
; 
 278   // Avoid recursion (via ProcessEvent default case) 
 284   // 'Garbage' collection of windows deleted with Close(). 
 285   DeletePendingObjects(); 
 287   // flush the logged messages if any 
 288   wxLog 
*pLog 
= wxLog::GetActiveTarget(); 
 289   if ( pLog 
!= NULL 
&& pLog
->HasPendingMessages() ) 
 292   // Send OnIdle events to all windows 
 293   bool needMore 
= SendIdleEvents(); 
 296     event
.RequestMore(TRUE
); 
 301 // Send idle event to all top-level windows 
 302 bool wxApp::SendIdleEvents() 
 304     bool needMore 
= FALSE
; 
 305         wxNode
* node 
= wxTopLevelWindows
.First(); 
 308                 wxWindow
* win 
= (wxWindow
*) node
->Data(); 
 309                 if (SendIdleEvents(win
)) 
 317 // Send idle event to window and all subwindows 
 318 bool wxApp::SendIdleEvents(wxWindow
* win
) 
 320     bool needMore 
= FALSE
; 
 323         event
.SetEventObject(win
); 
 324         win
->ProcessEvent(event
); 
 326     if (event
.MoreRequested()) 
 329         wxNode
* node 
= win
->GetChildren().First(); 
 332                 wxWindow
* win 
= (wxWindow
*) node
->Data(); 
 333                 if (SendIdleEvents(win
)) 
 341 void wxApp::DeletePendingObjects() 
 343   wxNode 
*node 
= wxPendingDelete
.First(); 
 346     wxObject 
*obj 
= (wxObject 
*)node
->Data(); 
 350     if (wxPendingDelete
.Member(obj
)) 
 353     // Deleting one object may have deleted other pending 
 354     // objects, so start from beginning of list again. 
 355     node 
= wxPendingDelete
.First(); 
 359 wxLog
* wxApp::CreateLogTarget() 
 364 wxWindow
* wxApp::GetTopWindow() const 
 368     else if (wxTopLevelWindows
.Number() > 0) 
 369         return (wxWindow
*) wxTopLevelWindows
.First()->Data(); 
 378  * TODO: Exit in some platform-specific way. Not recommended that the app calls this: 
 379  * only for emergencies. 
 383 // Yield to other processes