X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ff7d1dcb82d7ebb48589f8768daa6fa6d5d43507..55e18dbe2faca047b2008734782d52a6eb140115:/src/gtk/app.cpp diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index c3f805327c..1bf855421b 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -28,11 +28,6 @@ #include "wx/msgdlg.h" #include "wx/file.h" #include "wx/filename.h" - -#if wxUSE_WX_RESOURCES - #include "wx/resource.h" -#endif - #include "wx/module.h" #include "wx/image.h" @@ -173,6 +168,8 @@ bool wxApp::Yield(bool onlyIfNeeded) // wxWakeUpIdle //----------------------------------------------------------------------------- +static bool gs_WakeUpIdle = false; + void wxWakeUpIdle() { #if wxUSE_THREADS @@ -180,8 +177,11 @@ void wxWakeUpIdle() wxMutexGuiEnter(); #endif - if (g_isIdle) + if (g_isIdle) { + gs_WakeUpIdle = true; wxapp_install_idle_handler(); + gs_WakeUpIdle = false; + } #if wxUSE_THREADS if (!wxThread::IsMain()) @@ -239,7 +239,11 @@ static gint wxapp_idle_callback( gpointer WXUNUSED(data) ) if (wxTopLevelWindows.GetCount() > 0) { wxWindow* win = (wxWindow*) wxTopLevelWindows.GetLast()->GetData(); +#ifdef __WXGTK20__ + if (win->IsKindOf(CLASSINFO(wxMessageDialog))) +#else if (win->IsKindOf(CLASSINFO(wxGenericMessageDialog))) +#endif win->OnInternalIdle(); } return TRUE; @@ -362,6 +366,11 @@ static gint wxapp_poll_func( GPollFD *ufds, guint nfds, gint timeout ) void wxapp_install_idle_handler() { + // GD: this assert is raised when using the thread sample (which works) + // so the test is probably not so easy. Can widget callbacks be + // triggered from child threads and, if so, for which widgets? + // wxASSERT_MSG( wxThread::IsMain() || gs_WakeUpIdle, wxT("attempt to install idle handler from widget callback in child thread (should be exclusively from wxWakeUpIdle)") ); + wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") ); g_isIdle = FALSE; @@ -705,10 +714,6 @@ bool wxApp::Initialize() wxInitializeStockLists(); wxInitializeStockObjects(); -#if wxUSE_WX_RESOURCES - wxInitializeResourceSystem(); -#endif - wxModule::RegisterModules(); if (!wxModule::InitializeModules()) return FALSE; @@ -724,10 +729,6 @@ void wxApp::CleanUp() { wxModule::CleanUpModules(); -#if wxUSE_WX_RESOURCES - wxCleanUpResourceSystem(); -#endif - delete wxTheColourDatabase; wxTheColourDatabase = (wxColourDatabase*) NULL; @@ -742,7 +743,9 @@ void wxApp::CleanUp() #if wxUSE_THREADS delete wxPendingEvents; + wxPendingEvents = NULL; delete wxPendingEventsLocker; + wxPendingEventsLocker = NULL; #endif // check for memory leaks @@ -800,10 +803,11 @@ int wxEntryStart( int& argc, char *argv[] ) if (!wxOKlibc()) wxConvCurrent = (wxMBConv*) NULL; #endif - gdk_threads_enter(); - gtk_init( &argc, &argv ); + /* we can not enter threads before gtk_init is done */ + gdk_threads_enter(); + wxSetDetectableAutoRepeat( TRUE ); if (!wxApp::Initialize())