X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7f4dc78d358e4f33fbc53d9d4469a735cf0fd19b..44a6c8e61808e6197bc78e2344c2e93853943350:/src/gtk1/app.cpp?ds=sidebyside diff --git a/src/gtk1/app.cpp b/src/gtk1/app.cpp index 8081fc3c04..74f5e13cee 100644 --- a/src/gtk1/app.cpp +++ b/src/gtk1/app.cpp @@ -18,11 +18,14 @@ #include "wx/postscrp.h" #include "wx/intl.h" #include "wx/log.h" +#include "wx/memory.h" +#include "wx/font.h" +#include "wx/settings.h" #include "unistd.h" #ifdef USE_GDK_IMLIB -#include "gdk_imlib.h" +#include "../gdk_imlib/gdk_imlib.h" #endif //----------------------------------------------------------------------------- @@ -33,6 +36,7 @@ wxApp *wxTheApp = NULL; wxAppInitializerFunction wxApp::m_appInitFn = (wxAppInitializerFunction) NULL; extern wxList wxPendingDelete; +extern wxResourceCache *wxTheResourceCache; //----------------------------------------------------------------------------- // local functions @@ -61,9 +65,13 @@ bool wxYield(void) IMPLEMENT_DYNAMIC_CLASS(wxApp,wxEvtHandler) +BEGIN_EVENT_TABLE(wxApp, wxEvtHandler) + EVT_IDLE(wxApp::OnIdle) +END_EVENT_TABLE() + gint wxapp_idle_callback( gpointer WXUNUSED(data) ) { - if (wxTheApp) wxTheApp->OnIdle(); + if (wxTheApp) while (wxTheApp->ProcessIdle()) {}; usleep( 10000 ); return TRUE; }; @@ -96,10 +104,78 @@ int wxApp::OnRun(void) return MainLoop(); }; -bool wxApp::OnIdle(void) +bool wxApp::ProcessIdle(void) +{ + wxIdleEvent event; + event.SetEventObject( this ); + ProcessEvent( event ); + + return event.MoreRequested(); +}; + +void wxApp::OnIdle( wxIdleEvent &event ) { + static bool inOnIdle = FALSE; + + // Avoid recursion (via ProcessEvent default case) + if (inOnIdle) + return; + + inOnIdle = TRUE; + + // 'Garbage' collection of windows deleted with Close(). DeletePendingObjects(); - return FALSE; + + // flush the logged messages if any + wxLog *pLog = wxLog::GetActiveTarget(); + if ( pLog != NULL && pLog->HasPendingMessages() ) + pLog->Flush(); + + // Send OnIdle events to all windows + bool needMore = SendIdleEvents(); + + if (needMore) + event.RequestMore(TRUE); + + inOnIdle = FALSE; +}; + +bool wxApp::SendIdleEvents(void) +{ + bool needMore = FALSE; + wxNode* node = wxTopLevelWindows.First(); + while (node) + { + wxWindow* win = (wxWindow*) node->Data(); + if (SendIdleEvents(win)) + needMore = TRUE; + + node = node->Next(); + } + return needMore; +}; + +bool wxApp::SendIdleEvents( wxWindow* win ) +{ + bool needMore = FALSE; + + wxIdleEvent event; + event.SetEventObject(win); + win->ProcessEvent(event); + + if (event.MoreRequested()) + needMore = TRUE; + + wxNode* node = win->GetChildren()->First(); + while (node) + { + wxWindow* win = (wxWindow*) node->Data(); + if (SendIdleEvents(win)) + needMore = TRUE; + + node = node->Next(); + } + return needMore ; }; int wxApp::OnExit(void) @@ -169,9 +245,16 @@ void wxApp::CommonInit(void) (void) wxGetResource("wxWindows", "OsVersion", &wxOsVersion); #endif */ + wxSystemSettings::Init(); + wxTheResourceCache = new wxResourceCache(wxKEY_STRING); + + wxTheFontNameDirectory = new wxFontNameDirectory; + wxTheFontNameDirectory->Initialize(); wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING); wxTheColourDatabase->Initialize(); + + wxInitializeStockLists(); wxInitializeStockObjects(); // For PostScript printing @@ -188,14 +271,24 @@ void wxApp::CommonInit(void) g_globalCursor = new wxCursor; */ - wxInitializeStockObjects(); +// wxInitializeStockObjects(); }; void wxApp::CommonCleanUp(void) { + wxDELETE(wxTheColourDatabase); + wxDELETE(wxThePrintPaperDatabase); + wxDELETE(wxThePrintSetupData); + wxDELETE(wxTheFontNameDirectory); wxDeleteStockObjects(); wxFlushResources(); + + wxDELETE(wxTheResourceCache); + + wxDeleteStockLists(); + + wxSystemSettings::Done(); }; wxLog *wxApp::CreateLogTarget() @@ -213,6 +306,18 @@ int wxEntry( int argc, char *argv[] ) wxClassInfo::InitializeClasses(); +#if (WXDEBUG && USE_MEMORY_TRACING) || USE_DEBUG_CONTEXT + +#if !defined(_WINDLL) + streambuf* sBuf = new wxDebugStreamBuf; +#else + streambuf* sBuf = NULL; +#endif + ostream* oStr = new ostream(sBuf) ; + wxDebugContext::SetStream(oStr, sBuf); + +#endif + if (!wxTheApp) { if (!wxApp::GetInitializerFunction()) @@ -226,8 +331,6 @@ int wxEntry( int argc, char *argv[] ) wxObject *test_app = app_ini(); wxTheApp = (wxApp*) test_app; - -// wxTheApp = (wxApp*)( app_ini() ); }; if (!wxTheApp) @@ -236,8 +339,6 @@ int wxEntry( int argc, char *argv[] ) return 0; }; -// printf( "Programmstart.\n" ); - wxTheApp->argc = argc; wxTheApp->argv = argv; @@ -274,6 +375,22 @@ int wxEntry( int argc, char *argv[] ) wxTheApp->OnExit(); wxApp::CommonCleanUp(); + + wxDELETE(wxTheApp); + +#if (WXDEBUG && USE_MEMORY_TRACING) || USE_DEBUG_CONTEXT + // At this point we want to check if there are any memory + // blocks that aren't part of the wxDebugContext itself, + // as a special case. Then when dumping we need to ignore + // wxDebugContext, too. + if (wxDebugContext::CountObjectsLeft() > 0) + { + wxTrace("There were memory leaks.\n"); + wxDebugContext::Dump(); + wxDebugContext::PrintStatistics(); + } + wxDebugContext::SetStream(NULL, NULL); +#endif return retValue; };