1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxAppBase class and macros used for declaration of wxApp 
   4 //              derived class in the user code 
   5 // Author:      Julian Smart 
   9 // Copyright:   (c) Julian Smart 
  10 // Licence:     wxWindows licence 
  11 ///////////////////////////////////////////////////////////////////////////// 
  13 #ifndef _WX_APP_H_BASE_ 
  14 #define _WX_APP_H_BASE_ 
  16 // ---------------------------------------------------------------------------- 
  17 // headers we have to include here 
  18 // ---------------------------------------------------------------------------- 
  20 #include "wx/event.h"       // for the base class 
  22 #include "wx/init.h"        // we must declare wxEntry() 
  23 #include "wx/intl.h"        // for wxLayoutDirection 
  25 class WXDLLIMPEXP_BASE wxAppConsole
; 
  26 class WXDLLIMPEXP_BASE wxAppTraits
; 
  27 class WXDLLIMPEXP_BASE wxCmdLineParser
; 
  28 class WXDLLIMPEXP_BASE wxLog
; 
  29 class WXDLLIMPEXP_BASE wxMessageOutput
; 
  32     class WXDLLEXPORT wxEventLoop
; 
  33     struct WXDLLIMPEXP_CORE wxVideoMode
; 
  36 // ---------------------------------------------------------------------------- 
  38 // ---------------------------------------------------------------------------- 
  40 // the type of the function used to create a wxApp object on program start up 
  41 typedef wxAppConsole
* (*wxAppInitializerFunction
)(); 
  43 // ---------------------------------------------------------------------------- 
  45 // ---------------------------------------------------------------------------- 
  50     wxPRINT_POSTSCRIPT 
= 2 
  53 // ---------------------------------------------------------------------------- 
  54 // wxAppConsole: wxApp for non-GUI applications 
  55 // ---------------------------------------------------------------------------- 
  57 class WXDLLIMPEXP_BASE wxAppConsole 
: public wxEvtHandler
 
  62     virtual ~wxAppConsole(); 
  65     // the virtual functions which may/must be overridden in the derived class 
  66     // ----------------------------------------------------------------------- 
  68     // This is the very first function called for a newly created wxApp object, 
  69     // it is used by the library to do the global initialization. If, for some 
  70     // reason, you must override it (instead of just overriding OnInit(), as 
  71     // usual, for app-specific initializations), do not forget to call the base 
  73     virtual bool Initialize(int& argc
, wxChar 
**argv
); 
  75     // This gives wxCocoa a chance to call OnInit() with a memory pool in place 
  76     virtual bool CallOnInit() { return OnInit(); } 
  78     // Called before OnRun(), this is a good place to do initialization -- if 
  79     // anything fails, return false from here to prevent the program from 
  80     // continuing. The command line is normally parsed here, call the base 
  81     // class OnInit() to do it. 
  82     virtual bool OnInit(); 
  84     // this is here only temporary hopefully (FIXME) 
  85     virtual bool OnInitGui() { return true; } 
  87     // This is the replacement for the normal main(): all program work should 
  88     // be done here. When OnRun() returns, the programs starts shutting down. 
  89     virtual int OnRun() = 0; 
  91     // This is only called if OnInit() returned true so it's a good place to do 
  92     // any cleanup matching the initializations done there. 
  95     // This is the very last function called on wxApp object before it is 
  96     // destroyed. If you override it (instead of overriding OnExit() as usual) 
  97     // do not forget to call the base class version! 
  98     virtual void CleanUp(); 
 100     // Called when a fatal exception occurs, this function should take care not 
 101     // to do anything which might provoke a nested exception! It may be 
 102     // overridden if you wish to react somehow in non-default way (core dump 
 103     // under Unix, application crash under Windows) to fatal program errors, 
 104     // however extreme care should be taken if you don't want this function to 
 106     virtual void OnFatalException() { } 
 108     // Called from wxExit() function, should terminate the application a.s.a.p. 
 111     // Return the layout direction for the current locale 
 112     virtual wxLayoutDirection 
GetLayoutDirection() const; 
 115     // application info: name, description, vendor 
 116     // ------------------------------------------- 
 118     // NB: all these should be set by the application itself, there are no 
 119     //     reasonable default except for the application name which is taken to 
 122         // set/get the application name 
 123     wxString 
GetAppName() const 
 125         return m_appName
.empty() ? m_className 
: m_appName
; 
 127     void SetAppName(const wxString
& name
) { m_appName 
= name
; } 
 129         // set/get the app class name 
 130     wxString 
GetClassName() const { return m_className
; } 
 131     void SetClassName(const wxString
& name
) { m_className 
= name
; } 
 133         // set/get the vendor name 
 134     const wxString
& GetVendorName() const { return m_vendorName
; } 
 135     void SetVendorName(const wxString
& name
) { m_vendorName 
= name
; } 
 138     // cmd line parsing stuff 
 139     // ---------------------- 
 141     // all of these methods may be overridden in the derived class to 
 142     // customize the command line parsing (by default only a few standard 
 143     // options are handled) 
 145     // you also need to call wxApp::OnInit() from YourApp::OnInit() for all 
 148 #if wxUSE_CMDLINE_PARSER 
 149     // this one is called from OnInit() to add all supported options 
 150     // to the given parser (don't forget to call the base class version if you 
 152     virtual void OnInitCmdLine(wxCmdLineParser
& parser
); 
 154     // called after successfully parsing the command line, return true 
 155     // to continue and false to exit (don't forget to call the base class 
 156     // version if you override it!) 
 157     virtual bool OnCmdLineParsed(wxCmdLineParser
& parser
); 
 159     // called if "--help" option was specified, return true to continue 
 161     virtual bool OnCmdLineHelp(wxCmdLineParser
& parser
); 
 163     // called if incorrect command line options were given, return 
 164     // false to abort and true to continue 
 165     virtual bool OnCmdLineError(wxCmdLineParser
& parser
); 
 166 #endif // wxUSE_CMDLINE_PARSER 
 169     // miscellaneous customization functions 
 170     // ------------------------------------- 
 172     // create the app traits object to which we delegate for everything which 
 173     // either should be configurable by the user (then he can change the 
 174     // default behaviour simply by overriding CreateTraits() and returning his 
 175     // own traits object) or which is GUI/console dependent as then wxAppTraits 
 176     // allows us to abstract the differences behind the common façade 
 177     wxAppTraits 
*GetTraits(); 
 179     // the functions below shouldn't be used now that we have wxAppTraits 
 180 #if WXWIN_COMPATIBILITY_2_4 
 183         // override this function to create default log target of arbitrary 
 184         // user-defined class (default implementation creates a wxLogGui 
 185         // object) -- this log object is used by default by all wxLogXXX() 
 187     wxDEPRECATED( virtual wxLog 
*CreateLogTarget() ); 
 190         // similar to CreateLogTarget() but for the global wxMessageOutput 
 192     wxDEPRECATED( virtual wxMessageOutput 
*CreateMessageOutput() ); 
 194 #endif // WXWIN_COMPATIBILITY_2_4 
 197     // event processing functions 
 198     // -------------------------- 
 200     // this method allows to filter all the events processed by the program, so 
 201     // you should try to return quickly from it to avoid slowing down the 
 202     // program to the crawl 
 204     // return value should be -1 to continue with the normal event processing, 
 205     // or TRUE or FALSE to stop further processing and pretend that the event 
 206     // had been already processed or won't be processed at all, respectively 
 207     virtual int FilterEvent(wxEvent
& event
); 
 210     // call the specified handler on the given object with the given event 
 212     // this method only exists to allow catching the exceptions thrown by any 
 213     // event handler, it would lead to an extra (useless) virtual function call 
 214     // if the exceptions were not used, so it doesn't even exist in that case 
 215     virtual void HandleEvent(wxEvtHandler 
*handler
, 
 216                              wxEventFunction func
, 
 217                              wxEvent
& event
) const; 
 219     // Called when an unhandled C++ exception occurs inside OnRun(): note that 
 220     // the exception type is lost by now, so if you really want to handle the 
 221     // exception you should override OnRun() and put a try/catch around 
 222     // MainLoop() call there or use OnExceptionInMainLoop() 
 223     virtual void OnUnhandledException() { } 
 224 #endif // wxUSE_EXCEPTIONS 
 226     // process all events in the wxPendingEvents list -- it is necessary to 
 227     // call this function to process posted events. This happens during each 
 228     // event loop iteration in GUI mode but if there is no main loop, it may be 
 229     // also called directly. 
 230     virtual void ProcessPendingEvents(); 
 232     // doesn't do anything in this class, just a hook for GUI wxApp 
 233     virtual bool Yield(bool WXUNUSED(onlyIfNeeded
) = false) { return true; } 
 235     // make sure that idle events are sent again 
 236     virtual void WakeUpIdle() { } 
 238     // this is just a convenience: by providing its implementation here we 
 239     // avoid #ifdefs in the code using it 
 240     static bool IsMainLoopRunning() { return false; } 
 247     // this function is called when an assert failure occurs, the base class 
 248     // version does the normal processing (i.e. shows the usual assert failure 
 251     // the arguments are the location of the failed assert (func may be empty 
 252     // if the compiler doesn't support C99 __FUNCTION__), the text of the 
 253     // assert itself and the user-specified message 
 254     virtual void OnAssertFailure(const wxChar 
*file
, 
 260     // old version of the function without func parameter, for compatibility 
 261     // only, override OnAssertFailure() in the new code 
 262     virtual void OnAssert(const wxChar 
*file
, 
 266 #endif // __WXDEBUG__ 
 268     // check that the wxBuildOptions object (constructed in the application 
 269     // itself, usually the one from IMPLEMENT_APP() macro) matches the build 
 270     // options of the library and abort if it doesn't 
 271     static bool CheckBuildOptions(const char *optionsSignature
, 
 272                                   const char *componentName
); 
 273 #if WXWIN_COMPATIBILITY_2_4 
 274     wxDEPRECATED( static bool CheckBuildOptions(const wxBuildOptions
& buildOptions
) ); 
 277     // implementation only from now on 
 278     // ------------------------------- 
 280     // helpers for dynamic wxApp construction 
 281     static void SetInitializerFunction(wxAppInitializerFunction fn
) 
 282         { ms_appInitFn 
= fn
; } 
 283     static wxAppInitializerFunction 
GetInitializerFunction() 
 284         { return ms_appInitFn
; } 
 286     // accessors for ms_appInstance field (external code might wish to modify 
 287     // it, this is why we provide a setter here as well, but you should really 
 288     // know what you're doing if you call it), wxTheApp is usually used instead 
 290     static wxAppConsole 
*GetInstance() { return ms_appInstance
; } 
 291     static void SetInstance(wxAppConsole 
*app
) { ms_appInstance 
= app
; } 
 294     // command line arguments (public for backwards compatibility) 
 299     // the function which creates the traits object when GetTraits() needs it 
 300     // for the first time 
 301     virtual wxAppTraits 
*CreateTraits(); 
 304     // function used for dynamic wxApp creation 
 305     static wxAppInitializerFunction ms_appInitFn
; 
 307     // the one and only global application object 
 308     static wxAppConsole 
*ms_appInstance
; 
 311     // application info (must be set from the user code) 
 312     wxString m_vendorName
,      // vendor name (ACME Inc) 
 313              m_appName
,         // app name 
 314              m_className
;       // class name 
 316     // the class defining the application behaviour, NULL initially and created 
 317     // by GetTraits() when first needed 
 318     wxAppTraits 
*m_traits
; 
 321     // the application object is a singleton anyhow, there is no sense in 
 323     DECLARE_NO_COPY_CLASS(wxAppConsole
) 
 326 // ---------------------------------------------------------------------------- 
 327 // wxAppBase: the common part of wxApp implementations for all platforms 
 328 // ---------------------------------------------------------------------------- 
 332 class WXDLLIMPEXP_CORE wxAppBase 
: public wxAppConsole
 
 336     virtual ~wxAppBase(); 
 338     // the virtual functions which may/must be overridden in the derived class 
 339     // ----------------------------------------------------------------------- 
 341         // very first initialization function 
 343         // Override: very rarely 
 344     virtual bool Initialize(int& argc
, wxChar 
**argv
); 
 346         // a platform-dependent version of OnInit(): the code here is likely to 
 347         // depend on the toolkit. default version does nothing. 
 350     virtual bool OnInitGui(); 
 352         // called to start program execution - the default version just enters 
 353         // the main GUI loop in which events are received and processed until 
 354         // the last window is not deleted (if GetExitOnFrameDelete) or 
 355         // ExitMainLoop() is called. In console mode programs, the execution 
 356         // of the program really starts here 
 358         // Override: rarely in GUI applications, always in console ones. 
 361         // a matching function for OnInit() 
 362     virtual int OnExit(); 
 364         // very last clean up function 
 366         // Override: very rarely 
 367     virtual void CleanUp(); 
 370     // the worker functions - usually not used directly by the user code 
 371     // ----------------------------------------------------------------- 
 373         // return true if we're running main loop, i.e. if the events can 
 374         // (already) be dispatched 
 375     static bool IsMainLoopRunning() 
 377         wxAppBase 
*app 
= wx_static_cast(wxAppBase 
*, GetInstance()); 
 378         return app 
&& app
->m_mainLoop 
!= NULL
; 
 381         // execute the main GUI loop, the function returns when the loop ends 
 382     virtual int MainLoop(); 
 384         // exit the main loop thus terminating the application 
 387         // exit the main GUI loop during the next iteration (i.e. it does not 
 388         // stop the program immediately!) 
 389     virtual void ExitMainLoop(); 
 391         // returns true if there are unprocessed events in the event queue 
 392     virtual bool Pending(); 
 394         // process the first event in the event queue (blocks until an event 
 395         // appears if there are none currently, use Pending() if this is not 
 396         // wanted), returns false if the event loop should stop and true 
 398     virtual bool Dispatch(); 
 400         // process all currently pending events right now 
 402         // it is an error to call Yield() recursively unless the value of 
 403         // onlyIfNeeded is true 
 405         // WARNING: this function is dangerous as it can lead to unexpected 
 406         //          reentrancies (i.e. when called from an event handler it 
 407         //          may result in calling the same event handler again), use 
 408         //          with _extreme_ care or, better, don't use at all! 
 409     virtual bool Yield(bool onlyIfNeeded 
= false) = 0; 
 411         // this virtual function is called in the GUI mode when the application 
 412         // becomes idle and normally just sends wxIdleEvent to all interested 
 415         // it should return true if more idle events are needed, false if not 
 416     virtual bool ProcessIdle(); 
 418         // Send idle event to window and all subwindows 
 419         // Returns true if more idle time is requested. 
 420     virtual bool SendIdleEvents(wxWindow
* win
, wxIdleEvent
& event
); 
 424     // Function called if an uncaught exception is caught inside the main 
 425     // event loop: it may return true to continue running the event loop or 
 426     // false to stop it (in the latter case it may rethrow the exception as 
 428     virtual bool OnExceptionInMainLoop(); 
 429 #endif // wxUSE_EXCEPTIONS 
 432     // top level window functions 
 433     // -------------------------- 
 435         // return true if our app has focus 
 436     virtual bool IsActive() const { return m_isActive
; } 
 438         // set the "main" top level window 
 439     void SetTopWindow(wxWindow 
*win
) { m_topWindow 
= win
; } 
 441         // return the "main" top level window (if it hadn't been set previously 
 442         // with SetTopWindow(), will return just some top level window and, if 
 443         // there are none, will return NULL) 
 444     virtual wxWindow 
*GetTopWindow() const; 
 446         // control the exit behaviour: by default, the program will exit the 
 447         // main loop (and so, usually, terminate) when the last top-level 
 448         // program window is deleted. Beware that if you disable this behaviour 
 449         // (with SetExitOnFrameDelete(false)), you'll have to call 
 450         // ExitMainLoop() explicitly from somewhere. 
 451     void SetExitOnFrameDelete(bool flag
) 
 452         { m_exitOnFrameDelete 
= flag 
? Yes 
: No
; } 
 453     bool GetExitOnFrameDelete() const 
 454         { return m_exitOnFrameDelete 
== Yes
; } 
 457     // display mode, visual, printing mode, ... 
 458     // ------------------------------------------------------------------------ 
 460         // Get display mode that is used use. This is only used in framebuffer 
 461         // wxWin ports (such as wxMGL or wxDFB). 
 462     virtual wxVideoMode 
GetDisplayMode() const; 
 463         // Set display mode to use. This is only used in framebuffer wxWin 
 464         // ports (such as wxMGL or wxDFB). This method should be called from 
 466     virtual bool SetDisplayMode(const wxVideoMode
& WXUNUSED(info
)) { return true; } 
 468         // set use of best visual flag (see below) 
 469     void SetUseBestVisual( bool flag 
) { m_useBestVisual 
= flag
; } 
 470     bool GetUseBestVisual() const { return m_useBestVisual
; } 
 472         // set/get printing mode: see wxPRINT_XXX constants. 
 474         // default behaviour is the normal one for Unix: always use PostScript 
 476     virtual void SetPrintMode(int WXUNUSED(mode
)) { } 
 477     int GetPrintMode() const { return wxPRINT_POSTSCRIPT
; } 
 480     // command line parsing (GUI-specific) 
 481     // ------------------------------------------------------------------------ 
 483 #if wxUSE_CMDLINE_PARSER 
 484     virtual bool OnCmdLineParsed(wxCmdLineParser
& parser
); 
 485     virtual void OnInitCmdLine(wxCmdLineParser
& parser
); 
 488     // miscellaneous other stuff 
 489     // ------------------------------------------------------------------------ 
 491     // called by toolkit-specific code to set the app status: active (we have 
 492     // focus) or not and also the last window which had focus before we were 
 494     virtual void SetActive(bool isActive
, wxWindow 
*lastFocus
); 
 496 #if WXWIN_COMPATIBILITY_2_6 
 497     // OBSOLETE: don't use, always returns true 
 499     // returns true if the program is successfully initialized 
 500     wxDEPRECATED( bool Initialized() ); 
 501 #endif // WXWIN_COMPATIBILITY_2_6 
 503     // perform standard OnIdle behaviour, ensure that this is always called 
 504     void OnIdle(wxIdleEvent
& event
); 
 508     // delete all objects in wxPendingDelete list 
 509     void DeletePendingObjects(); 
 511     // override base class method to use GUI traits 
 512     virtual wxAppTraits 
*CreateTraits(); 
 515     // the main event loop of the application (may be NULL if the loop hasn't 
 516     // been started yet or has already terminated) 
 517     wxEventLoop 
*m_mainLoop
; 
 519     // the main top level window (may be NULL) 
 520     wxWindow 
*m_topWindow
; 
 522     // if Yes, exit the main loop when the last top level window is deleted, if 
 523     // No don't do it and if Later -- only do it once we reach our OnRun() 
 525     // the explanation for using this strange scheme is given in appcmn.cpp 
 531     } m_exitOnFrameDelete
; 
 533     // true if the app wants to use the best visual on systems where 
 534     // more than one are available (Sun, SGI, XFree86 4.0 ?) 
 535     bool m_useBestVisual
; 
 537     // does any of our windows have focus? 
 541     DECLARE_NO_COPY_CLASS(wxAppBase
) 
 544 #if WXWIN_COMPATIBILITY_2_6 
 545     inline bool wxAppBase::Initialized() { return true; } 
 546 #endif // WXWIN_COMPATIBILITY_2_6 
 550 // ---------------------------------------------------------------------------- 
 551 // now include the declaration of the real class 
 552 // ---------------------------------------------------------------------------- 
 555     #if defined(__WXPALMOS__) 
 556         #include "wx/palmos/app.h" 
 557     #elif defined(__WXMSW__) 
 558         #include "wx/msw/app.h" 
 559     #elif defined(__WXMOTIF__) 
 560         #include "wx/motif/app.h" 
 561     #elif defined(__WXMGL__) 
 562         #include "wx/mgl/app.h" 
 563     #elif defined(__WXDFB__) 
 564         #include "wx/dfb/app.h" 
 565     #elif defined(__WXGTK20__) 
 566         #include "wx/gtk/app.h" 
 567     #elif defined(__WXGTK__) 
 568         #include "wx/gtk1/app.h" 
 569     #elif defined(__WXX11__) 
 570         #include "wx/x11/app.h" 
 571     #elif defined(__WXMAC__) 
 572         #include "wx/mac/app.h" 
 573     #elif defined(__WXCOCOA__) 
 574         #include "wx/cocoa/app.h" 
 575     #elif defined(__WXPM__) 
 576         #include "wx/os2/app.h" 
 579     // allow using just wxApp (instead of wxAppConsole) in console programs 
 580     typedef wxAppConsole wxApp
; 
 583 // ---------------------------------------------------------------------------- 
 585 // ---------------------------------------------------------------------------- 
 587 // for compatibility, we define this macro to access the global application 
 588 // object of type wxApp 
 590 // note that instead of using of wxTheApp in application code you should 
 591 // consider using DECLARE_APP() after which you may call wxGetApp() which will 
 592 // return the object of the correct type (i.e. MyApp and not wxApp) 
 594 // the cast is safe as in GUI build we only use wxApp, not wxAppConsole, and in 
 595 // console mode it does nothing at all 
 596 #define wxTheApp wx_static_cast(wxApp*, wxApp::GetInstance()) 
 598 // ---------------------------------------------------------------------------- 
 600 // ---------------------------------------------------------------------------- 
 602 // event loop related functions only work in GUI programs 
 603 // ------------------------------------------------------ 
 605 // Force an exit from main loop 
 606 extern void WXDLLIMPEXP_BASE 
wxExit(); 
 608 // Yield to other apps/messages 
 609 extern bool WXDLLIMPEXP_BASE 
wxYield(); 
 611 // Yield to other apps/messages 
 612 extern void WXDLLIMPEXP_BASE 
wxWakeUpIdle(); 
 614 // ---------------------------------------------------------------------------- 
 615 // macros for dynamic creation of the application object 
 616 // ---------------------------------------------------------------------------- 
 618 // Having a global instance of this class allows wxApp to be aware of the app 
 619 // creator function. wxApp can then call this function to create a new app 
 620 // object. Convoluted, but necessary. 
 622 class WXDLLIMPEXP_BASE wxAppInitializer
 
 625     wxAppInitializer(wxAppInitializerFunction fn
) 
 626         { wxApp::SetInitializerFunction(fn
); } 
 629 // the code below defines a IMPLEMENT_WXWIN_MAIN macro which you can use if 
 630 // your compiler really, really wants main() to be in your main program (e.g. 
 631 // hello.cpp). Now IMPLEMENT_APP should add this code if required. 
 633 #define IMPLEMENT_WXWIN_MAIN_CONSOLE \ 
 634         int main(int argc, char **argv) { return wxEntry(argc, argv); } 
 636 // port-specific header could have defined it already in some special way 
 637 #ifndef IMPLEMENT_WXWIN_MAIN 
 638     #define IMPLEMENT_WXWIN_MAIN IMPLEMENT_WXWIN_MAIN_CONSOLE 
 639 #endif // defined(IMPLEMENT_WXWIN_MAIN) 
 641 #ifdef __WXUNIVERSAL__ 
 642     #include "wx/univ/theme.h" 
 644     #define IMPLEMENT_WX_THEME_SUPPORT \ 
 645         WX_USE_THEME(win32); \ 
 648     #define IMPLEMENT_WX_THEME_SUPPORT 
 651 // Use this macro if you want to define your own main() or WinMain() function 
 652 // and call wxEntry() from there. 
 653 #define IMPLEMENT_APP_NO_MAIN(appname)                                      \ 
 654     wxAppConsole *wxCreateApp()                                             \ 
 656         wxAppConsole::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE,         \ 
 658         return new appname;                                                 \ 
 661         wxTheAppInitializer((wxAppInitializerFunction) wxCreateApp);        \ 
 662     DECLARE_APP(appname)                                                    \ 
 663     appname& wxGetApp() { return *wx_static_cast(appname*, wxApp::GetInstance()); } 
 665 // Same as IMPLEMENT_APP() normally but doesn't include themes support in 
 666 // wxUniversal builds 
 667 #define IMPLEMENT_APP_NO_THEMES(appname)    \ 
 668     IMPLEMENT_APP_NO_MAIN(appname)          \ 
 671 // Use this macro exactly once, the argument is the name of the wxApp-derived 
 672 // class which is the class of your application. 
 673 #define IMPLEMENT_APP(appname)              \ 
 674     IMPLEMENT_APP_NO_THEMES(appname)        \ 
 675     IMPLEMENT_WX_THEME_SUPPORT 
 677 // Same as IMPLEMENT_APP(), but for console applications. 
 678 #define IMPLEMENT_APP_CONSOLE(appname)      \ 
 679     IMPLEMENT_APP_NO_MAIN(appname)          \ 
 680     IMPLEMENT_WXWIN_MAIN_CONSOLE 
 682 // this macro can be used multiple times and just allows you to use wxGetApp() 
 684 #define DECLARE_APP(appname) extern appname& wxGetApp(); 
 687 // declare the stuff defined by IMPLEMENT_APP() macro, it's not really needed 
 688 // anywhere else but at the very least it suppresses icc warnings about 
 689 // defining extern symbols without prior declaration, and it shouldn't do any 
 691 extern wxAppConsole 
*wxCreateApp(); 
 692 extern wxAppInitializer wxTheAppInitializer
; 
 694 #endif // _WX_APP_H_BASE_