X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2b5f62a0b2db198609b45dec622a018dae37008e..c15d9c859c64f28c56d1e61b7d031a74e6018583:/src/gtk/app.cpp diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index eccbb52d0a..a7b0428703 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -13,6 +13,7 @@ #ifdef __VMS #include +#undef ConnectionNumber #endif #include "wx/app.h" @@ -27,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" @@ -80,9 +76,6 @@ // global data //----------------------------------------------------------------------------- -wxApp *wxTheApp = (wxApp *) NULL; -wxAppInitializerFunction wxAppBase::m_appInitFn = (wxAppInitializerFunction) NULL; - bool g_mainThreadLocked = FALSE; gint g_pendingTag = 0; @@ -96,15 +89,6 @@ extern bool g_isIdle; void wxapp_install_idle_handler(); -//----------------------------------------------------------------------------- -// wxExit -//----------------------------------------------------------------------------- - -void wxExit() -{ - gtk_main_quit(); -} - //----------------------------------------------------------------------------- // wxYield //----------------------------------------------------------------------------- @@ -172,7 +156,7 @@ bool wxApp::Yield(bool onlyIfNeeded) // wxWakeUpIdle //----------------------------------------------------------------------------- -void wxWakeUpIdle() +void wxApp::WakeUpIdle() { #if wxUSE_THREADS if (!wxThread::IsMain()) @@ -237,8 +221,12 @@ static gint wxapp_idle_callback( gpointer WXUNUSED(data) ) // But repaint the assertion message if necessary if (wxTopLevelWindows.GetCount() > 0) { - wxWindow* win = (wxWindow*) wxTopLevelWindows.Last()->Data(); + wxWindow* win = (wxWindow*) wxTopLevelWindows.GetLast()->GetData(); +#ifdef __WXGTK20__ + if (win->IsKindOf(CLASSINFO(wxMessageDialog))) +#else if (win->IsKindOf(CLASSINFO(wxGenericMessageDialog))) +#endif win->OnInternalIdle(); } return TRUE; @@ -361,6 +349,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; @@ -607,13 +600,13 @@ bool wxApp::CallInternalIdle( wxWindow* win ) { win->OnInternalIdle(); - wxNode* node = win->GetChildren().First(); + wxWindowList::Node *node = win->GetChildren().GetFirst(); while (node) { - wxWindow* win = (wxWindow*) node->Data(); - CallInternalIdle( win ); + wxWindow *win = node->GetData(); - node = node->Next(); + CallInternalIdle( win ); + node = node->GetNext(); } return TRUE; @@ -631,14 +624,14 @@ bool wxApp::SendIdleEvents( wxWindow* win ) if (event.MoreRequested()) needMore = TRUE; - wxNode* node = win->GetChildren().First(); + wxWindowList::Node *node = win->GetChildren().GetFirst(); while (node) { - wxWindow* win = (wxWindow*) node->Data(); + wxWindow *win = node->GetData(); + if (SendIdleEvents(win)) needMore = TRUE; - - node = node->Next(); + node = node->GetNext(); } return needMore; @@ -650,6 +643,13 @@ int wxApp::MainLoop() return 0; } +void wxApp::Exit() +{ + // VZ: no idea why is it different from ExitMainLoop() but this is what + // wxExit() used to do + gtk_main_quit(); +} + void wxApp::ExitMainLoop() { if (gtk_main_level() > 0) @@ -673,17 +673,17 @@ void wxApp::Dispatch() void wxApp::DeletePendingObjects() { - wxNode *node = wxPendingDelete.First(); + wxNode *node = wxPendingDelete.GetFirst(); while (node) { - wxObject *obj = (wxObject *)node->Data(); + wxObject *obj = (wxObject *)node->GetData(); delete obj; if (wxPendingDelete.Find(obj)) delete node; - node = wxPendingDelete.First(); + node = wxPendingDelete.GetFirst(); } } @@ -704,10 +704,6 @@ bool wxApp::Initialize() wxInitializeStockLists(); wxInitializeStockObjects(); -#if wxUSE_WX_RESOURCES - wxInitializeResourceSystem(); -#endif - wxModule::RegisterModules(); if (!wxModule::InitializeModules()) return FALSE; @@ -723,10 +719,6 @@ void wxApp::CleanUp() { wxModule::CleanUpModules(); -#if wxUSE_WX_RESOURCES - wxCleanUpResourceSystem(); -#endif - delete wxTheColourDatabase; wxTheColourDatabase = (wxColourDatabase*) NULL; @@ -741,7 +733,9 @@ void wxApp::CleanUp() #if wxUSE_THREADS delete wxPendingEvents; + wxPendingEvents = NULL; delete wxPendingEventsLocker; + wxPendingEventsLocker = NULL; #endif // check for memory leaks @@ -799,10 +793,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())