X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/32d4bfd16c554ba060ccee9236abb8e7ff0e913a..47765ba2b8bc04fdc00257dcba45dcdb34c451e4:/src/gtk/app.cpp diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index a690ab53a4..fd60e2a126 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -48,10 +48,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,7 +123,7 @@ unsigned char g_palette[64*3] = // local functions //----------------------------------------------------------------------------- -extern void wxFlushResources(void); +extern void wxFlushResources(); //----------------------------------------------------------------------------- // global functions @@ -143,39 +139,29 @@ gint wxapp_idle_callback( gpointer WXUNUSED(data) ); bool wxYield() { - /* it's necessary to call ProcessIdle() to update the frames sizes which - might have been changed (it also will update other things set from - OnUpdateUI() which is a nice (and desired) side effect) */ - while (wxTheApp->ProcessIdle()) { } + bool has_idle = (wxTheApp->m_idleTag != 0); -#if 0 - for ( wxWindowList::Node *node = wxTopLevelWindows.GetFirst(); - node; - node = node->GetNext() ) - { - wxWindow *win = node->GetData(); - win->OnInternalIdle(); - } -#endif - - if (wxTheApp->m_idleTag) + if (has_idle) { /* We need to temporarily remove idle callbacks or the loop will never finish. */ gtk_idle_remove( wxTheApp->m_idleTag ); wxTheApp->m_idleTag = 0; + } - while (gtk_events_pending()) - gtk_main_iteration(); + while (gtk_events_pending()) + gtk_main_iteration(); + + /* it's necessary to call ProcessIdle() to update the frames sizes which + 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 ); } - else - { - while (gtk_events_pending()) - gtk_main_iteration(); - } return TRUE; } @@ -216,7 +202,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. */ @@ -226,12 +212,29 @@ void wxapp_install_idle_handler() g_isIdle = FALSE; } -/* #if wxUSE_THREADS -static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ) + +/* 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) ) +{ + wxapp_uninstall_thread_wakeup(); #if (GTK_MINOR_VERSION > 0) // when getting called from GDK's time-out handler @@ -254,12 +257,12 @@ static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ) GDK_THREADS_LEAVE (); #endif - wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 20, wxapp_wakeup_timerout_callback, (gpointer) NULL ); + wxapp_install_thread_wakeup(); return TRUE; } -#endif -*/ + +#endif // wxUSE_THREADS //----------------------------------------------------------------------------- // wxApp @@ -280,11 +283,10 @@ wxApp::wxApp() m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL ); -/* #if wxUSE_THREADS - m_wakeUpTimerTag = gtk_timeout_add( 20, wxapp_wakeup_timerout_callback, (gpointer) NULL ); + m_wakeUpTimerTag = 0; + wxapp_install_thread_wakeup(); #endif -*/ m_colorCube = (unsigned char*) NULL; } @@ -293,11 +295,9 @@ wxApp::~wxApp() { if (m_idleTag) gtk_idle_remove( m_idleTag ); -/* #if wxUSE_THREADS - if (m_wakeUpTimerTag) gtk_timeout_remove( m_wakeUpTimerTag ); + wxapp_uninstall_thread_wakeup(); #endif -*/ if (m_colorCube) free(m_colorCube); } @@ -394,7 +394,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; @@ -416,19 +416,17 @@ bool wxApp::ProcessIdle() void wxApp::OnIdle( wxIdleEvent &event ) { - static bool inOnIdle = FALSE; + static bool s_inOnIdle = FALSE; /* Avoid recursion (via ProcessEvent default case) */ - if (inOnIdle) + if (s_inOnIdle) return; - inOnIdle = TRUE; + 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(); @@ -446,7 +444,7 @@ void wxApp::OnIdle( wxIdleEvent &event ) if (needMore) event.RequestMore(TRUE); - inOnIdle = FALSE; + s_inOnIdle = FALSE; } bool wxApp::SendIdleEvents() @@ -472,10 +470,10 @@ bool wxApp::SendIdleEvents( wxWindow* win ) wxIdleEvent event; event.SetEventObject(win); - win->OnInternalIdle(); - win->ProcessEvent(event); + win->OnInternalIdle(); + if (event.MoreRequested()) needMore = TRUE; @@ -517,12 +515,16 @@ void wxApp::Dispatch() gtk_main_iteration(); } -#if wxUSE_THREADS void wxApp::ProcessPendingEvents() { - wxNode *node = wxPendingEvents->First(); +#if wxUSE_THREADS wxCriticalSectionLocker locker(*wxPendingEventsLocker); +#endif // wxUSE_THREADS + + if ( !wxPendingEvents ) + return; + wxNode *node = wxPendingEvents->First(); while (node) { wxEvtHandler *handler = (wxEvtHandler *)node->Data(); @@ -534,7 +536,6 @@ void wxApp::ProcessPendingEvents() node = wxPendingEvents->First(); } } -#endif // wxUSE_THREADS void wxApp::DeletePendingObjects() { @@ -584,8 +585,6 @@ bool wxApp::Initialize() wxInitializeResourceSystem(); #endif - wxImage::InitStandardHandlers(); - wxModule::RegisterModules(); if (!wxModule::InitializeModules()) return FALSE; @@ -619,8 +618,6 @@ void wxApp::CleanUp() wxDeleteStockLists(); - wxImage::CleanUpHandlers(); - delete wxTheApp; wxTheApp = (wxApp*) NULL; @@ -641,7 +638,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(); } @@ -654,9 +651,8 @@ void wxApp::CleanUp() wxLog *oldLog = wxLog::SetActiveTarget( (wxLog*) NULL ); if (oldLog) delete oldLog; -} - #endif // wxUSE_LOG +} //----------------------------------------------------------------------------- // wxEntry @@ -666,7 +662,11 @@ int wxEntry( int argc, char *argv[] ) { gtk_set_locale(); +#if wxUSE_WCHAR_T if (!wxOKlibc()) wxConvCurrent = &wxConvLocal; +#else + if (!wxOKlibc()) wxConvCurrent = (wxMBConv*) NULL; +#endif gtk_init( &argc, &argv ); @@ -678,7 +678,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(); @@ -687,10 +687,20 @@ 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 + wxTheApp->argv = new wxChar*[argc+1]; + int mb_argc = 0; + while (mb_argc < argc) { + wxTheApp->argv[mb_argc] = wxStrdup(wxConvLibc.cMB2WX(argv[mb_argc])); + mb_argc++; + } + wxTheApp->argv[mb_argc] = (wxChar *)NULL; +#else wxTheApp->argv = argv; +#endif wxString name(wxFileNameFromPath(argv[0])); wxStripExtension( name ); @@ -781,7 +791,7 @@ wxApp::GetStdIcon(int which) const return wxIcon(warning_xpm); default: - wxFAIL_MSG("requested non existent standard icon"); + wxFAIL_MSG(wxT("requested non existent standard icon")); // still fall through case wxICON_HAND: