+// non customizable initialization done after wxApp creation and initialization
+static bool DoCommonPostInit()
+{
+ wxModule::RegisterModules();
+
+ if ( !wxModule::InitializeModules() )
+ {
+ wxLogError(_("Initialization failed in post init, aborting."));
+ return false;
+ }
+
+#if defined(__WXDEBUG__)
+ // check if event classes implement Clone() correctly
+ // NOTE: the check is done against _all_ event classes which are linked to
+ // the executable currently running, which are not necessarily all
+ // wxWidgets event classes.
+ const wxClassInfo *ci = wxClassInfo::GetFirst();
+ for (; ci; ci = ci->GetNext())
+ {
+ // is this class derived from wxEvent?
+ if (!ci->IsKindOf(CLASSINFO(wxEvent)) || wxString(ci->GetClassName()) == "wxEvent")
+ continue;
+
+ if (!ci->IsDynamic())
+ {
+ wxLogWarning("The event class '%s' should have a DECLARE_DYNAMIC_CLASS macro!",
+ ci->GetClassName());
+ continue;
+ }
+
+ // yes; test if it implements Clone() correctly
+ wxEvent* test = wxDynamicCast(ci->CreateObject(),wxEvent);
+ if (test == NULL)
+ {
+ wxLogWarning("The event class '%s' should have a DECLARE_DYNAMIC_CLASS macro!",
+ ci->GetClassName());
+ continue;
+ }
+
+ wxEvent* cloned = test->Clone();
+ if (!cloned || cloned->GetClassInfo() != ci)
+ wxLogWarning("The event class '%s' does not correctly implement Clone()!",
+ ci->GetClassName());
+
+ delete cloned;
+ delete test;
+ }
+#endif
+
+ return true;
+}
+
+bool wxEntryStart(int& argc, wxChar **argv)
+{
+ // do minimal, always necessary, initialization
+ // --------------------------------------------
+
+ // initialize wxRTTI
+ if ( !DoCommonPreInit() )
+ return false;
+
+
+ // first of all, we need an application object
+ // -------------------------------------------
+
+ // the user might have already created it himself somehow
+ wxAppPtr app(wxTheApp);
+ if ( !app.get() )
+ {
+ // if not, he might have used IMPLEMENT_APP() to give us a function to
+ // create it
+ wxAppInitializerFunction fnCreate = wxApp::GetInitializerFunction();
+
+ if ( fnCreate )
+ {
+ // he did, try to create the custom wxApp object
+ app.Set((*fnCreate)());
+ }
+ }
+
+ if ( !app.get() )
+ {
+ // either IMPLEMENT_APP() was not used at all or it failed -- in any
+ // case we still need something
+ app.Set(new wxDummyConsoleApp);
+ }
+
+
+ // wxApp initialization: this can be customized
+ // --------------------------------------------
+
+ if ( !app->Initialize(argc, argv) )
+ return false;
+
+ // remember, possibly modified (e.g. due to removal of toolkit-specific
+ // parameters), command line arguments in member variables
+ app->argc = argc;
+ app->argv = argv;
+
+ wxCallAppCleanup callAppCleanup(app.get());
+
+
+ // common initialization after wxTheApp creation
+ // ---------------------------------------------
+
+ if ( !DoCommonPostInit() )
+ return false;
+
+
+ // prevent the smart pointer from destroying its contents
+ app.release();
+
+ // and the cleanup object from doing cleanup
+ callAppCleanup.Dismiss();
+
+#if wxUSE_LOG
+ // now that we have a valid wxApp (wxLogGui would have crashed if we used
+ // it before now), we can delete the temporary sink we had created for the
+ // initialization messages -- the next time logging function is called, the
+ // sink will be recreated but this time wxAppTraits will be used
+ delete wxLog::SetActiveTarget(NULL);
+#endif // wxUSE_LOG
+
+ return true;
+}
+
+#if wxUSE_UNICODE
+
+// we provide a wxEntryStart() wrapper taking "char *" pointer too
+bool wxEntryStart(int& argc, char **argv)
+{
+ ConvertArgsToUnicode(argc, argv);
+
+ if ( !wxEntryStart(gs_initData.argc, gs_initData.argv) )
+ {
+ FreeConvertedArgs();
+
+ return false;
+ }
+
+ return true;
+}
+
+#endif // wxUSE_UNICODE
+