X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5375a1f5e859deebee2b30e4a50bd40fc324f586..1af546bfc355e09282958ae1187ed29bef65b04d:/src/gtk/app.cpp diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index 7b88bc6f5e..a1bdce64aa 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -11,6 +11,10 @@ #pragma implementation "app.h" #endif +#ifdef __VMS +#include +#endif + #include "wx/app.h" #include "wx/gdicmn.h" #include "wx/utils.h" @@ -38,6 +42,13 @@ #endif #include +#if defined(__DARWIN__) +// FIXME: select must be used instead of poll (GD) +#elif defined(__VMS) +# include +#else +# include +#endif #include "wx/gtk/win_gtk.h" #include @@ -50,25 +61,17 @@ wxApp *wxTheApp = (wxApp *) NULL; wxAppInitializerFunction wxAppBase::m_appInitFn = (wxAppInitializerFunction) NULL; -extern bool g_isIdle; - bool g_mainThreadLocked = FALSE; gint g_pendingTag = 0; static GtkWidget *gs_RootWindow = (GtkWidget*) NULL; //----------------------------------------------------------------------------- -// local functions +// idle system //----------------------------------------------------------------------------- -extern "C" -{ - gint wxapp_idle_callback( gpointer WXUNUSED(data) ); - gint wxapp_pending_callback( gpointer WXUNUSED(data) ); -} +extern bool g_isIdle; -void wxapp_install_thread_wakeup(); -void wxapp_uninstall_thread_wakeup(); void wxapp_install_idle_handler(); //----------------------------------------------------------------------------- @@ -165,29 +168,11 @@ void wxWakeUpIdle() // local functions //----------------------------------------------------------------------------- -void wxapp_install_idle_handler() -{ - wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") ); - - g_isIdle = FALSE; - - if (g_pendingTag == 0) - g_pendingTag = gtk_idle_add_priority( 900, wxapp_pending_callback, (gpointer) NULL ); - - /* This routine gets called by all event handlers - indicating that the idle is over. It may also - get called from other thread for sending events - to the main thread (and processing these in - idle time). Very low priority. */ - - wxTheApp->m_idleTag = gtk_idle_add_priority( 1000, wxapp_idle_callback, (gpointer) NULL ); -} - // the callback functions must be extern "C" to comply with GTK+ declarations extern "C" { -gint wxapp_pending_callback( gpointer WXUNUSED(data) ) +static gint wxapp_pending_callback( gpointer WXUNUSED(data) ) { if (!wxTheApp) return TRUE; @@ -214,7 +199,7 @@ gint wxapp_pending_callback( gpointer WXUNUSED(data) ) return FALSE; } -gint wxapp_idle_callback( gpointer WXUNUSED(data) ) +static gint wxapp_idle_callback( gpointer WXUNUSED(data) ) { if (!wxTheApp) return TRUE; @@ -239,7 +224,7 @@ gint wxapp_idle_callback( gpointer WXUNUSED(data) ) g_isIdle = TRUE; wxTheApp->m_idleTag = 0; - // Sent idle event to all who request them as long as + // Send idle event to all who request them as long as // no events have popped up in the event queue. while (wxTheApp->ProcessIdle() && (gtk_events_pending() == 0)) ; @@ -254,69 +239,52 @@ gint wxapp_idle_callback( gpointer WXUNUSED(data) ) #if wxUSE_THREADS -gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ) +static gint wxapp_poll_func( GPollFD *ufds, guint nfds, gint timeout ) { - // when getting called from GDK's time-out handler - // we are no longer within GDK's grab on the GUI - // thread so we must lock it here ourselves + gint res; gdk_threads_enter(); - wxapp_uninstall_thread_wakeup(); - - // unblock other threads wishing to do some GUI things wxMutexGuiLeave(); - g_mainThreadLocked = TRUE; - // wake up other threads - wxUsleep( 1 ); +#ifdef __DARWIN__ + // FIXME: poll is not available under Darwin/Mac OS X and this needs + // to be implemented using select instead (GD) + // what about other BSD derived systems? + res = -1; +#else + res = poll( (struct pollfd*) ufds, nfds, timeout ); +#endif - // block other thread again wxMutexGuiEnter(); - g_mainThreadLocked = FALSE; - wxapp_install_thread_wakeup(); - - // release lock again gdk_threads_leave(); - return TRUE; + return res; } #endif // wxUSE_THREADS } // extern "C" -#if wxUSE_THREADS - -static int g_threadUninstallLevel = 0; - -void wxapp_install_thread_wakeup() -{ - g_threadUninstallLevel++; - - if (g_threadUninstallLevel != 1) return; - - if (wxTheApp->m_wakeUpTimerTag) return; - - wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 50, wxapp_wakeup_timerout_callback, (gpointer) NULL ); -} - -void wxapp_uninstall_thread_wakeup() +void wxapp_install_idle_handler() { - g_threadUninstallLevel--; + wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") ); - if (g_threadUninstallLevel != 0) return; + g_isIdle = FALSE; - if (!wxTheApp->m_wakeUpTimerTag) return; + if (g_pendingTag == 0) + g_pendingTag = gtk_idle_add_priority( 900, wxapp_pending_callback, (gpointer) NULL ); - gtk_timeout_remove( wxTheApp->m_wakeUpTimerTag ); - wxTheApp->m_wakeUpTimerTag = 0; + // This routine gets called by all event handlers + // indicating that the idle is over. It may also + // get called from other thread for sending events + // to the main thread (and processing these in + // idle time). Very low priority. + wxTheApp->m_idleTag = gtk_idle_add_priority( 1000, wxapp_idle_callback, (gpointer) NULL ); } -#endif // wxUSE_THREADS - //----------------------------------------------------------------------------- // Access to the root window global //----------------------------------------------------------------------------- @@ -352,8 +320,7 @@ wxApp::wxApp() wxapp_install_idle_handler(); #if wxUSE_THREADS - m_wakeUpTimerTag = 0; - wxapp_install_thread_wakeup(); + g_main_set_poll_func( wxapp_poll_func ); #endif m_colorCube = (unsigned char*) NULL; @@ -366,10 +333,6 @@ wxApp::~wxApp() { if (m_idleTag) gtk_idle_remove( m_idleTag ); -#if wxUSE_THREADS - wxapp_uninstall_thread_wakeup(); -#endif - if (m_colorCube) free(m_colorCube); } @@ -532,12 +495,37 @@ bool wxApp::SendIdleEvents() wxWindow* win = node->GetData(); if (SendIdleEvents(win)) needMore = TRUE; + node = node->GetNext(); } + node = wxTopLevelWindows.GetFirst(); + while (node) + { + wxWindow* win = node->GetData(); + CallInternalIdle( win ); + + node = node->GetNext(); + } return needMore; } +bool wxApp::CallInternalIdle( wxWindow* win ) +{ + win->OnInternalIdle(); + + wxNode* node = win->GetChildren().First(); + while (node) + { + wxWindow* win = (wxWindow*) node->Data(); + CallInternalIdle( win ); + + node = node->Next(); + } + + return TRUE; +} + bool wxApp::SendIdleEvents( wxWindow* win ) { bool needMore = FALSE; @@ -547,8 +535,6 @@ bool wxApp::SendIdleEvents( wxWindow* win ) win->GetEventHandler()->ProcessEvent(event); - win->OnInternalIdle(); - if (event.MoreRequested()) needMore = TRUE; @@ -561,7 +547,8 @@ bool wxApp::SendIdleEvents( wxWindow* win ) node = node->Next(); } - return needMore ; + + return needMore; } int wxApp::MainLoop() @@ -609,8 +596,6 @@ void wxApp::DeletePendingObjects() bool wxApp::Initialize() { - wxBuffer = new wxChar[BUFSIZ + 512]; - wxClassInfo::InitializeClasses(); #if wxUSE_INTL @@ -648,9 +633,7 @@ void wxApp::CleanUp() wxCleanUpResourceSystem(); #endif - if (wxTheColourDatabase) - delete wxTheColourDatabase; - + delete wxTheColourDatabase; wxTheColourDatabase = (wxColourDatabase*) NULL; wxDeleteStockObjects(); @@ -660,17 +643,13 @@ void wxApp::CleanUp() delete wxTheApp; wxTheApp = (wxApp*) NULL; - // GL: I'm annoyed ... I don't know where to put this and I don't want to - // create a module for that as it's part of the core. + wxClassInfo::CleanUpClasses(); + #if wxUSE_THREADS delete wxPendingEvents; delete wxPendingEventsLocker; #endif - delete[] wxBuffer; - - wxClassInfo::CleanUpClasses(); - // check for memory leaks #if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT if (wxDebugContext::CountObjectsLeft(TRUE) > 0) @@ -874,47 +853,6 @@ int wxEntry( int argc, char *argv[] ) return retValue; } -#ifndef __WXUNIVERSAL__ - -// XPM hack: make the arrays const -#define static static const - -#include "wx/gtk/info.xpm" -#include "wx/gtk/error.xpm" -#include "wx/gtk/question.xpm" -#include "wx/gtk/warning.xpm" - -#undef static - -wxIcon wxApp::GetStdIcon(int which) const -{ - switch(which) - { - case wxICON_INFORMATION: - return wxIcon(info_xpm); - - case wxICON_QUESTION: - return wxIcon(question_xpm); - - case wxICON_EXCLAMATION: - return wxIcon(warning_xpm); - - default: - wxFAIL_MSG(wxT("requested non existent standard icon")); - // still fall through - - case wxICON_HAND: - return wxIcon(error_xpm); - } -} -#else -wxIcon wxApp::GetStdIcon(int which) const -{ - return wxTheme::Get()->GetRenderer()->GetStdIcon(which); -} -#endif // !__WXUNIVERSAL__ - - #ifdef __WXDEBUG__ void wxApp::OnAssert(const wxChar *file, int line, const wxChar *msg)