// Author: Vadim Zeitlin
// Modified by:
// Created: 18.10.99
-// RCS-ID: $Id$
// Copyright: (c) Vadim Zeitlin
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
bool wxAppBase::Initialize(int& argcOrig, wxChar **argvOrig)
{
+#ifdef __WXOSX__
+ // Mac OS X passes a process serial number command line argument when
+ // the application is launched from the Finder. This argument must be
+ // removed from the command line arguments before being handled by the
+ // application (otherwise applications would need to handle it)
+ //
+ // Notice that this has to be done for all ports that can be used under OS
+ // X (e.g. wxGTK) and not just wxOSX itself, hence this code is here and
+ // not in a port-specific file.
+ if ( argcOrig > 1 )
+ {
+ static const wxChar *ARG_PSN = wxT("-psn_");
+ if ( wxStrncmp(argvOrig[1], ARG_PSN, wxStrlen(ARG_PSN)) == 0 )
+ {
+ // remove this argument
+ --argcOrig;
+ memmove(argvOrig + 1, argvOrig + 2, argcOrig * sizeof(wxChar*));
+ }
+ }
+#endif // __WXOSX__
+
if ( !wxAppConsole::Initialize(argcOrig, argvOrig) )
return false;
wxDeleteStockLists();
- delete wxTheColourDatabase;
- wxTheColourDatabase = NULL;
+ wxDELETE(wxTheColourDatabase);
wxAppConsole::CleanUp();
}
},
#endif // __WXUNIVERSAL__
-#if defined(__WXMGL__)
- // VS: this is not specific to wxMGL, all fullscreen (framebuffer) ports
+#if defined(__WXDFB__)
+ // VS: this is not specific to wxDFB, all fullscreen (framebuffer) ports
// should provide this option. That's why it is in common/appcmn.cpp
- // and not mgl/app.cpp
+ // and not dfb/app.cpp
{
wxCMD_LINE_OPTION,
NULL,
wxCMD_LINE_VAL_STRING,
0x0
},
-#endif // __WXMGL__
+#endif // __WXDFB__
// terminator
wxCMD_LINE_DESC_END
}
#endif // __WXUNIVERSAL__
-#if defined(__WXMGL__)
+#if defined(__WXDFB__)
wxString modeDesc;
if ( parser.Found(OPTION_MODE, &modeDesc) )
{
if ( !SetDisplayMode(wxVideoMode(w, h, bpp)) )
return false;
}
-#endif // __WXMGL__
+#endif // __WXDFB__
return wxAppConsole::OnCmdLineParsed(parser);
}
while (node)
{
wxWindow* win = node->GetData();
- if (SendIdleEvents(win, event))
+
+ // Don't send idle events to the windows that are about to be destroyed
+ // anyhow, this is wasteful and unexpected.
+ if ( !wxPendingDelete.Member(win) && win->SendIdleEvents(event) )
needMore = true;
node = node->GetNext();
}
-#if wxUSE_LOG
- // flush the logged messages if any
- wxLog::FlushActive();
-#endif
-
wxUpdateUIEvent::ResetUpdateTime();
return needMore;
}
-// Send idle event to window and all subwindows
-bool wxAppBase::SendIdleEvents(wxWindow* win, wxIdleEvent& event)
-{
- bool needMore = false;
-
- win->OnInternalIdle();
-
- // should we send idle event to this window?
- if ( wxIdleEvent::GetMode() == wxIDLE_PROCESS_ALL ||
- win->HasExtraStyle(wxWS_EX_PROCESS_IDLE) )
- {
- event.SetEventObject(win);
- win->HandleWindowEvent(event);
-
- if (event.MoreRequested())
- needMore = true;
- }
- wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst();
- while ( node )
- {
- wxWindow *child = node->GetData();
- if (SendIdleEvents(child, event))
- needMore = true;
-
- node = node->GetNext();
- }
-
- return needMore;
-}
-
// ----------------------------------------------------------------------------
// wxGUIAppTraitsBase
// ----------------------------------------------------------------------------
wxLog *wxGUIAppTraitsBase::CreateLogTarget()
{
#if wxUSE_LOGGUI
+#ifndef __WXOSX_IPHONE__
return new wxLogGui;
+#else
+ return new wxLogStderr;
+#endif
#else
// we must have something!
return new wxLogStderr;
bool wxGUIAppTraitsBase::ShowAssertDialog(const wxString& msg)
{
+#if wxDEBUG_LEVEL
// under MSW we prefer to use the base class version using ::MessageBox()
// even if wxMessageBox() is available because it has less chances to
// double fault our app than our wxMessageBox()
//
// and finally we can't use wxMessageBox() if it wasn't compiled in, of
// course
-#if defined(__WXMSW__) || defined(__WXDFB__) || !wxUSE_MSGDLG
- return wxAppTraitsBase::ShowAssertDialog(msg);
-#else // wxUSE_MSGDLG
-#if wxDEBUG_LEVEL
- wxString msgDlg = msg;
+#if !defined(__WXMSW__) && !defined(__WXDFB__) && wxUSE_MSGDLG
+
+ // we can't (safely) show the GUI dialog from another thread, only do it
+ // for the asserts in the main thread
+ if ( wxIsMainThread() )
+ {
+ wxString msgDlg = msg;
#if wxUSE_STACKWALKER
- // on Unix stack frame generation may take some time, depending on the
- // size of the executable mainly... warn the user that we are working
- wxFprintf(stderr, wxT("[Debug] Generating a stack trace... please wait"));
- fflush(stderr);
-
- const wxString stackTrace = GetAssertStackTrace();
- if ( !stackTrace.empty() )
- msgDlg << wxT("\n\nCall stack:\n") << stackTrace;
+ const wxString stackTrace = GetAssertStackTrace();
+ if ( !stackTrace.empty() )
+ msgDlg << wxT("\n\nCall stack:\n") << stackTrace;
#endif // wxUSE_STACKWALKER
- // this message is intentionally not translated -- it is for
- // developpers only
- msgDlg += wxT("\nDo you want to stop the program?\n")
- wxT("You can also choose [Cancel] to suppress ")
- wxT("further warnings.");
+ // this message is intentionally not translated -- it is for
+ // developpers only
+ msgDlg += wxT("\nDo you want to stop the program?\n")
+ wxT("You can also choose [Cancel] to suppress ")
+ wxT("further warnings.");
- switch ( wxMessageBox(msgDlg, wxT("wxWidgets Debug Alert"),
- wxYES_NO | wxCANCEL | wxICON_STOP ) )
- {
- case wxYES:
- wxTrap();
- break;
+ switch ( wxMessageBox(msgDlg, wxT("wxWidgets Debug Alert"),
+ wxYES_NO | wxCANCEL | wxICON_STOP ) )
+ {
+ case wxYES:
+ wxTrap();
+ break;
- case wxCANCEL:
- // no more asserts
- return true;
+ case wxCANCEL:
+ // no more asserts
+ return true;
- //case wxNO: nothing to do
+ //case wxNO: nothing to do
+ }
+
+ return false;
}
-#else // !wxDEBUG_LEVEL
- // this function always exists (for ABI compatibility) but is never called
- // if debug level is 0 and so can simply do nothing then
- wxUnusedVar(msg);
-#endif // wxDEBUG_LEVEL/!wxDEBUG_LEVEL
+#endif // wxUSE_MSGDLG
+#endif // wxDEBUG_LEVEL
- return false;
-#endif // !wxUSE_MSGDLG/wxUSE_MSGDLG
+ return wxAppTraitsBase::ShowAssertDialog(msg);
}
bool wxGUIAppTraitsBase::HasStderr()