X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/45ff6421e6d0327584bb85aeb5bda8be48b6ca5e..c0b8a8b9cc0c2bfd56426c9a6b6c946ea1031c55:/src/gtk/app.cpp diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index 65710bb24d..b5045c14bb 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -42,7 +42,9 @@ #endif #include -#ifdef __VMS +#if defined(__DARWIN__) +// FIXME: select must be used instead of poll (GD) +#elif defined(__VMS) # include #else # include @@ -85,12 +87,14 @@ void wxExit() // wxYield //----------------------------------------------------------------------------- +// not static because used by textctrl.cpp +// +// MT-FIXME +bool wxIsInsideYield = FALSE; + bool wxApp::Yield(bool onlyIfNeeded) { - // MT-FIXME - static bool s_inYield = FALSE; - - if ( s_inYield ) + if ( wxIsInsideYield ) { if ( !onlyIfNeeded ) { @@ -108,7 +112,7 @@ bool wxApp::Yield(bool onlyIfNeeded) } #endif // wxUSE_THREADS - s_inYield = TRUE; + wxIsInsideYield = TRUE; if (!g_isIdle) { @@ -128,7 +132,7 @@ bool wxApp::Yield(bool onlyIfNeeded) // 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). But we + // OnUpdateUI() which is a nice (and desired) side effect). But we // call ProcessIdle() only once since this is not meant for longish // background jobs (controlled by wxIdleEvent::RequestMore() and the // return value of Processidle(). @@ -137,7 +141,7 @@ bool wxApp::Yield(bool onlyIfNeeded) // let the logs be flashed again wxLog::Resume(); - s_inYield = FALSE; + wxIsInsideYield = FALSE; return TRUE; } @@ -245,7 +249,14 @@ static gint wxapp_poll_func( GPollFD *ufds, guint nfds, gint timeout ) wxMutexGuiLeave(); g_mainThreadLocked = TRUE; +#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 wxMutexGuiEnter(); g_mainThreadLocked = FALSE; @@ -315,7 +326,7 @@ wxApp::wxApp() #endif m_colorCube = (unsigned char*) NULL; - + // this is NULL for a "regular" wxApp, but is set (and freed) by a wxGLApp m_glVisualInfo = (void *) NULL; } @@ -342,7 +353,7 @@ bool wxApp::OnInitGui() // seems gtk_widget_set_default_visual no longer exists? GdkVisual* vis = gtk_widget_get_default_visual(); #else - GdkVisual* vis = gdkx_visual_get( + GdkVisual* vis = gdkx_visual_get( ((XVisualInfo *) m_glVisualInfo) ->visualid ); gtk_widget_set_default_visual( vis ); #endif @@ -352,7 +363,7 @@ bool wxApp::OnInitGui() visual = vis; } - + // On some machines, the default visual is just 256 colours, so // we make sure we get the best. This can sometimes be wasteful. @@ -430,14 +441,14 @@ bool wxApp::OnInitGui() GdkVisual *wxApp::GetGdkVisual() { GdkVisual *visual = NULL; - + if (m_glVisualInfo) visual = gdkx_visual_get( ((XVisualInfo *) m_glVisualInfo)->visualid ); else visual = gdk_window_get_visual( wxGetRootWindow()->window ); - + wxASSERT( visual ); - + return visual; } @@ -486,12 +497,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; @@ -501,8 +537,6 @@ bool wxApp::SendIdleEvents( wxWindow* win ) win->GetEventHandler()->ProcessEvent(event); - win->OnInternalIdle(); - if (event.MoreRequested()) needMore = TRUE; @@ -515,7 +549,7 @@ bool wxApp::SendIdleEvents( wxWindow* win ) node = node->Next(); } - + return needMore; } @@ -784,33 +818,24 @@ int wxEntry( int argc, char *argv[] ) if ( retValue == 0 ) { - /* delete pending toplevel windows (typically a single - dialog) so that, if there isn't any left, we don't - call OnRun() */ + // Delete pending toplevel windows wxTheApp->DeletePendingObjects(); - wxTheApp->m_initialized = wxTopLevelWindows.GetCount() != 0; + // When is the app not initialized ? + wxTheApp->m_initialized = TRUE; if (wxTheApp->Initialized()) { wxTheApp->OnRun(); wxWindow *topWindow = wxTheApp->GetTopWindow(); + + // Delete all pending windows if any + wxTheApp->DeletePendingObjects(); + + // Reset top window if (topWindow) - { - /* Forcibly delete the window. */ - if (topWindow->IsKindOf(CLASSINFO(wxFrame)) || - topWindow->IsKindOf(CLASSINFO(wxDialog)) ) - { - topWindow->Close( TRUE ); - wxTheApp->DeletePendingObjects(); - } - else - { - delete topWindow; - wxTheApp->SetTopWindow( (wxWindow*) NULL ); - } - } + wxTheApp->SetTopWindow( (wxWindow*) NULL ); retValue = wxTheApp->OnExit(); } @@ -821,54 +846,13 @@ 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) +void wxApp::OnAssert(const wxChar *file, int line, const wxChar* cond, const wxChar *msg) { m_isInAssert = TRUE; - wxAppBase::OnAssert(file, line, msg); + wxAppBase::OnAssert(file, line, cond, msg); m_isInAssert = FALSE; }