X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/42b4e99e9a72c259e6a4d24b7e9cd5a3129a990f..7b9da2077d0975db6c965a85c91d5aca671ab5e3:/src/gtk/app.cpp diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index 2bce90acab..5d08196d7b 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -8,7 +8,6 @@ ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ - #pragma implementation "appbase.h" #pragma implementation "app.h" #endif @@ -48,10 +47,6 @@ wxApp *wxTheApp = (wxApp *) NULL; wxAppInitializerFunction wxAppBase::m_appInitFn = (wxAppInitializerFunction) NULL; -#if wxUSE_THREADS -extern wxList *wxPendingEvents; -extern wxCriticalSection *wxPendingEventsLocker; -#endif extern wxResourceCache *wxTheResourceCache; extern bool g_isIdle; @@ -127,10 +122,18 @@ unsigned char g_palette[64*3] = // local functions //----------------------------------------------------------------------------- -extern void wxFlushResources(void); +extern void wxFlushResources(); + +/* forward declaration */ +gint wxapp_idle_callback( gpointer WXUNUSED(data) ); +void wxapp_install_idle_handler(); + +#if wxUSE_THREADS +gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ); +#endif //----------------------------------------------------------------------------- -// global functions +// wxExit //----------------------------------------------------------------------------- void wxExit() @@ -138,13 +141,14 @@ void wxExit() gtk_main_quit(); } -/* forward declaration */ -gint wxapp_idle_callback( gpointer WXUNUSED(data) ); +//----------------------------------------------------------------------------- +// wxYield +//----------------------------------------------------------------------------- bool wxYield() { bool has_idle = (wxTheApp->m_idleTag != 0); - + if (has_idle) { /* We need to temporarily remove idle callbacks or the loop will @@ -160,20 +164,34 @@ bool wxYield() might have been changed (it also will update other things set from OnUpdateUI() which is a nice (and desired) side effect) */ while (wxTheApp->ProcessIdle()) { } - + if (has_idle) { /* re-add idle handler */ wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL ); } - + return TRUE; } +//----------------------------------------------------------------------------- +// wxWakeUpIdle +//----------------------------------------------------------------------------- + +void wxWakeUpIdle() +{ + if (g_isIdle) + wxapp_install_idle_handler(); +} + +//----------------------------------------------------------------------------- +// local functions +//----------------------------------------------------------------------------- + gint wxapp_idle_callback( gpointer WXUNUSED(data) ) { if (!wxTheApp) return TRUE; - + #if (GTK_MINOR_VERSION > 0) /* when getting called from GDK's idle handler we are no longer within GDK's grab on the GUI @@ -206,7 +224,7 @@ gint wxapp_idle_callback( gpointer WXUNUSED(data) ) void wxapp_install_idle_handler() { - wxASSERT_MSG( wxTheApp->m_idleTag == 0, _T("attempt to install idle handler twice") ); + wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") ); /* this routine gets called by all event handlers indicating that the idle is over. */ @@ -218,25 +236,22 @@ void wxapp_install_idle_handler() #if wxUSE_THREADS -/* forward declaration */ -static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ); - void wxapp_install_thread_wakeup() { if (wxTheApp->m_wakeUpTimerTag) return; - + wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 100, wxapp_wakeup_timerout_callback, (gpointer) NULL ); } void wxapp_uninstall_thread_wakeup() { if (!wxTheApp->m_wakeUpTimerTag) return; - + gtk_timeout_remove( wxTheApp->m_wakeUpTimerTag ); wxTheApp->m_wakeUpTimerTag = 0; } -static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ) +gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ) { wxapp_uninstall_thread_wakeup(); @@ -265,7 +280,8 @@ static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ) return TRUE; } -#endif + +#endif // wxUSE_THREADS //----------------------------------------------------------------------------- // wxApp @@ -397,7 +413,7 @@ bool wxApp::OnInitGui() index |= (g >> (5 - vis->green_prec)) << vis->green_shift; index |= (b >> (5 - vis->blue_prec)) << vis->blue_shift; #else - wxFAIL_MSG( _T("Unsupported graphics hardware") ); + wxFAIL_MSG( wxT("Unsupported graphics hardware") ); #endif } m_colorCube[ (r*1024) + (g*32) + b ] = index; @@ -427,11 +443,9 @@ void wxApp::OnIdle( wxIdleEvent &event ) s_inOnIdle = TRUE; -#if wxUSE_THREADS /* Resend in the main thread events which have been prepared in other threads */ ProcessPendingEvents(); -#endif /* 'Garbage' collection of windows deleted with Close(). */ DeletePendingObjects(); @@ -478,7 +492,7 @@ bool wxApp::SendIdleEvents( wxWindow* win ) win->ProcessEvent(event); win->OnInternalIdle(); - + if (event.MoreRequested()) needMore = TRUE; @@ -520,25 +534,6 @@ void wxApp::Dispatch() gtk_main_iteration(); } -#if wxUSE_THREADS -void wxApp::ProcessPendingEvents() -{ - wxNode *node = wxPendingEvents->First(); - wxCriticalSectionLocker locker(*wxPendingEventsLocker); - - while (node) - { - wxEvtHandler *handler = (wxEvtHandler *)node->Data(); - - handler->ProcessPendingEvents(); - - delete node; - - node = wxPendingEvents->First(); - } -} -#endif // wxUSE_THREADS - void wxApp::DeletePendingObjects() { wxNode *node = wxPendingDelete.First(); @@ -640,7 +635,7 @@ void wxApp::CleanUp() #if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT if (wxDebugContext::CountObjectsLeft() > 0) { - wxLogDebug(_T("There were memory leaks.\n")); + wxLogDebug(wxT("There were memory leaks.\n")); wxDebugContext::Dump(); wxDebugContext::PrintStatistics(); } @@ -653,9 +648,8 @@ void wxApp::CleanUp() wxLog *oldLog = wxLog::SetActiveTarget( (wxLog*) NULL ); if (oldLog) delete oldLog; -} - #endif // wxUSE_LOG +} //----------------------------------------------------------------------------- // wxEntry @@ -681,7 +675,7 @@ int wxEntry( int argc, char *argv[] ) if (!wxTheApp) { wxCHECK_MSG( wxApp::GetInitializerFunction(), -1, - _T("wxWindows error: No initializer - use IMPLEMENT_APP macro.\n") ); + wxT("wxWindows error: No initializer - use IMPLEMENT_APP macro.\n") ); wxAppInitializerFunction app_ini = wxApp::GetInitializerFunction(); @@ -690,7 +684,7 @@ int wxEntry( int argc, char *argv[] ) wxTheApp = (wxApp*) test_app; } - wxCHECK_MSG( wxTheApp, -1, _T("wxWindows error: no application object") ); + wxCHECK_MSG( wxTheApp, -1, wxT("wxWindows error: no application object") ); wxTheApp->argc = argc; #if wxUSE_UNICODE @@ -794,7 +788,7 @@ wxApp::GetStdIcon(int which) const return wxIcon(warning_xpm); default: - wxFAIL_MSG(_T("requested non existent standard icon")); + wxFAIL_MSG(wxT("requested non existent standard icon")); // still fall through case wxICON_HAND: