X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a69be60b0f1dac4713e6650ca3ca9fe5a53de062..bf25264013271a7827b82be5f6c9afa7fdf444ae:/include/wx/app.h diff --git a/include/wx/app.h b/include/wx/app.h index 424420c731..a9bf03c287 100644 --- a/include/wx/app.h +++ b/include/wx/app.h @@ -6,33 +6,13 @@ // Modified by: // Created: 01/02/97 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem +// Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_APP_H_BASE_ #define _WX_APP_H_BASE_ -#ifdef __GNUG__ - #pragma interface "appbase.h" -#endif - -// ---------------------------------------------------------------------------- -// typedefs -// ---------------------------------------------------------------------------- - -#if (defined(__WXMSW__) && !defined(__WXMICROWIN__)) || defined (__WXPM__) - class WXDLLEXPORT wxApp; - typedef wxApp* (*wxAppInitializerFunction)(); -#else - // returning wxApp* won't work with gcc - #include "wx/object.h" - - typedef wxObject* (*wxAppInitializerFunction)(); -#endif - -class WXDLLEXPORT wxCmdLineParser; - // ---------------------------------------------------------------------------- // headers we have to include here // ---------------------------------------------------------------------------- @@ -43,21 +23,30 @@ class WXDLLEXPORT wxCmdLineParser; #include "wx/window.h" // for wxTopLevelWindows #endif // wxUSE_GUI -#if WXWIN_COMPATIBILITY_2_2 - #include "wx/icon.h" -#endif - #include "wx/build.h" +class WXDLLEXPORT wxApp; +class WXDLLEXPORT wxAppTraits; +class WXDLLEXPORT wxCmdLineParser; class WXDLLEXPORT wxLog; class WXDLLEXPORT wxMessageOutput; +// ---------------------------------------------------------------------------- +// typedefs +// ---------------------------------------------------------------------------- + +// the type of the function used to create a wxApp object on program start up +typedef wxApp* (*wxAppInitializerFunction)(); + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- -static const int wxPRINT_WINDOWS = 1; -static const int wxPRINT_POSTSCRIPT = 2; +enum +{ + wxPRINT_WINDOWS = 1, + wxPRINT_POSTSCRIPT = 2 +}; // ---------------------------------------------------------------------------- // support for framebuffer ports @@ -83,103 +72,48 @@ private: unsigned m_width, m_height, m_depth; bool m_ok; }; -#endif +#endif // wxUSE_GUI // ---------------------------------------------------------------------------- -// the common part of wxApp implementations for all platforms +// wxAppConsole: wxApp for non-GUI applications // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxAppBase : public wxEvtHandler +class WXDLLEXPORT wxAppConsole : public wxEvtHandler { - DECLARE_NO_COPY_CLASS(wxAppBase) - public: - wxAppBase(); - virtual ~wxAppBase(); + // ctor and dtor + wxAppConsole(); + virtual ~wxAppConsole(); + // the virtual functions which may/must be overridden in the derived class // ----------------------------------------------------------------------- - // called during the program initialization, returning FALSE from here - // prevents the program from continuing - it's a good place to create - // the top level program window and return TRUE. - // - // Override: always in GUI application, rarely in console ones. + // Called before OnRun(), this is a good place to do initialization -- if + // anything fails, return false from here to prevent the program from + // continuing. The command line is normally parsed here, call the base + // class OnInit() to do it. virtual bool OnInit(); -#if wxUSE_GUI - // a platform-dependent version of OnInit(): the code here is likely to - // depend on the toolkit. default version does nothing. - // - // Override: rarely. - virtual bool OnInitGui(); -#endif // wxUSE_GUI - - // called to start program execution - the default version just enters - // the main GUI loop in which events are received and processed until - // the last window is not deleted (if GetExitOnFrameDelete) or - // ExitMainLoop() is called. In console mode programs, the execution - // of the program really starts here - // - // Override: rarely in GUI applications, always in console ones. -#if wxUSE_GUI - virtual int OnRun(); -#else // !GUI + // This is the replacement for the normal main(): all program work should + // be done here. When OnRun() returns, the programs starts shutting down. virtual int OnRun() = 0; -#endif // wxUSE_GUI - // called after the main loop termination. This is a good place for - // cleaning up (it may be too late in dtor) and is also useful if you - // want to return some non-default exit code - this is just the return - // value of this method. - // - // Override: often. + // This is only called if OnInit() returned true so it's a good place to do + // any cleanup matching the initializations done there. virtual int OnExit(); - // called when a fatal exception occurs, this function should take care - // not to do anything which might provoke a nested exception! It may be - // overridden if you wish to react somehow in non-default way (core - // dump under Unix, application crash under Windows) to fatal program - // errors, however extreme care should be taken if you don't want this - // function to crash. - // - // Override: rarely. + // Called when a fatal exception occurs, this function should take care not + // to do anything which might provoke a nested exception! It may be + // overridden if you wish to react somehow in non-default way (core dump + // under Unix, application crash under Windows) to fatal program errors, + // however extreme care should be taken if you don't want this function to + // crash. virtual void OnFatalException() { } - virtual bool ProcessIdle() = 0; + // Called from wxExit() function, should terminate the application a.s.a.p. + virtual void Exit(); - // the worker functions - usually not used directly by the user code - // ----------------------------------------------------------------- - -#if wxUSE_GUI - // execute the main GUI loop, the function returns when the loop ends - virtual int MainLoop() = 0; - - // exit the main GUI loop during the next iteration (i.e. it does not - // stop the program immediately!) - virtual void ExitMainLoop() = 0; - - // returns TRUE if the program is initialized - virtual bool Initialized() = 0; - - // returns TRUE if there are unprocessed events in the event queue - virtual bool Pending() = 0; - - // process the first event in the event queue (blocks until an event - // apperas if there are none currently) - virtual void Dispatch() = 0; - - // process all currently pending events right now - // - // it is an error to call Yield() recursively unless the value of - // onlyIfNeeded is TRUE - // - // WARNING: this function is dangerous as it can lead to unexpected - // reentrancies (i.e. when called from an event handler it - // may result in calling the same event handler again), use - // with _extreme_ care or, better, don't use at all! - virtual bool Yield(bool onlyIfNeeded = FALSE) = 0; -#endif // wxUSE_GUI // application info: name, description, vendor // ------------------------------------------- @@ -191,10 +125,7 @@ public: // set/get the application name wxString GetAppName() const { - if ( !m_appName ) - return m_className; - else - return m_appName; + return m_appName.empty() ? m_className : m_appName; } void SetAppName(const wxString& name) { m_appName = name; } @@ -206,40 +137,6 @@ public: const wxString& GetVendorName() const { return m_vendorName; } void SetVendorName(const wxString& name) { m_vendorName = name; } -#if wxUSE_GUI - // top level window functions - // -------------------------- - - // return TRUE if our app has focus - virtual bool IsActive() const { return m_isActive; } - - // set the "main" top level window - void SetTopWindow(wxWindow *win) { m_topWindow = win; } - - // return the "main" top level window (if it hadn't been set previously - // with SetTopWindow(), will return just some top level window and, if - // there are none, will return NULL) - virtual wxWindow *GetTopWindow() const - { - if (m_topWindow) - return m_topWindow; - else if (wxTopLevelWindows.GetCount() > 0) - return wxTopLevelWindows.GetFirst()->GetData(); - else - return (wxWindow *)NULL; - } - - // control the exit behaviour: by default, the program will exit the - // main loop (and so, usually, terminate) when the last top-level - // program window is deleted. Beware that if you disable this behaviour - // (with SetExitOnFrameDelete(FALSE)), you'll have to call - // ExitMainLoop() explicitly from somewhere. - void SetExitOnFrameDelete(bool flag) - { m_exitOnFrameDelete = flag ? Yes : No; } - bool GetExitOnFrameDelete() const - { return m_exitOnFrameDelete == Yes; } - -#endif // wxUSE_GUI // cmd line parsing stuff // ---------------------- @@ -269,13 +166,24 @@ public: virtual bool OnCmdLineError(wxCmdLineParser& parser); #endif // wxUSE_CMDLINE_PARSER + // miscellaneous customization functions // ------------------------------------- + // create the app traits object to which we delegate for everything which + // either should be configurable by the user (then he can change the + // default behaviour simply by overriding CreateTraits() and returning his + // own traits object) or which is GUI/console dependent as then wxAppTraits + // allows us to abstract the differences behind the common façade + wxAppTraits *GetTraits(); + + // the functions below shouldn't be used now that we have wxAppTraits +#if WXWIN_COMPATIBILITY_2_4 + #if wxUSE_LOG // override this function to create default log target of arbitrary // user-defined class (default implementation creates a wxLogGui - // object) - this log object is used by default by all wxLogXXX() + // object) -- this log object is used by default by all wxLogXXX() // functions. virtual wxLog *CreateLogTarget(); #endif // wxUSE_LOG @@ -284,38 +192,11 @@ public: // object virtual wxMessageOutput *CreateMessageOutput(); -#if wxUSE_GUI - -#if WXWIN_COMPATIBILITY_2_2 - // get the standard icon used by wxWin dialogs - this allows the user - // to customize the standard dialogs. The 'which' parameter is one of - // wxICON_XXX values - virtual wxIcon GetStdIcon(int WXUNUSED(which)) const { return wxNullIcon; } -#endif - - // Get display mode that is used use. This is only used in framebuffer wxWin ports - // (such as wxMGL). - virtual wxDisplayModeInfo GetDisplayMode() const { return wxDisplayModeInfo(); } - // Set display mode to use. This is only used in framebuffer wxWin ports - // (such as wxMGL). This method should be called from wxApp:OnInitGui - virtual bool SetDisplayMode(const wxDisplayModeInfo& WXUNUSED(info)) { return TRUE; } - - // set use of best visual flag (see below) - void SetUseBestVisual( bool flag ) { m_useBestVisual = flag; } - bool GetUseBestVisual() const { return m_useBestVisual; } +#endif // WXWIN_COMPATIBILITY_2_4 - // set/get printing mode: see wxPRINT_XXX constants. - // - // default behaviour is the normal one for Unix: always use PostScript - // printing. - virtual void SetPrintMode(int WXUNUSED(mode)) { } - int GetPrintMode() const { return wxPRINT_POSTSCRIPT; } - // called by toolkit-specific code to set the app status: active (we have - // focus) or not and also the last window which had focus before we were - // deactivated - virtual void SetActive(bool isActive, wxWindow *lastFocus); -#endif // wxUSE_GUI + // event processing functions + // -------------------------- // this method allows to filter all the events processed by the program, so // you should try to return quickly from it to avoid slowing down the @@ -326,6 +207,19 @@ public: // had been already processed or won't be processed at all, respectively virtual int FilterEvent(wxEvent& event); + // process all events in the wxPendingEvents list -- it is necessary to + // call this function to process posted events. This happens during each + // event loop iteration in GUI mode but if there is no main loop, it may be + // also called directly. + virtual void ProcessPendingEvents(); + + // doesn't do anything in this class, just a hook for GUI wxApp + virtual bool Yield(bool WXUNUSED(onlyIfNeeded) = false) { return true; } + + // make sure that idle events are sent again + virtual void WakeUpIdle() { } + + // debugging support // ----------------- @@ -347,45 +241,189 @@ public: // options of the library and abort if it doesn't static bool CheckBuildOptions(const wxBuildOptions& buildOptions); - // deprecated functions, please updae your code to not use them! - // ------------------------------------------------------------- - -#if WXWIN_COMPATIBILITY_2_2 - // used by obsolete wxDebugMsg only - void SetWantDebugOutput( bool flag ) { m_wantDebugOutput = flag; } - bool GetWantDebugOutput() const { return m_wantDebugOutput; } - - // TRUE if the application wants to get debug output - bool m_wantDebugOutput; -#endif // WXWIN_COMPATIBILITY_2_2 // implementation only from now on // ------------------------------- // helpers for dynamic wxApp construction static void SetInitializerFunction(wxAppInitializerFunction fn) - { m_appInitFn = fn; } + { ms_appInitFn = fn; } static wxAppInitializerFunction GetInitializerFunction() - { return m_appInitFn; } + { return ms_appInitFn; } - // process all events in the wxPendingEvents list - virtual void ProcessPendingEvents(); - // access to the command line arguments + // command line arguments (public for backwards compatibility) int argc; wxChar **argv; protected: + // the function which creates the traits object when GetTraits() needs it + // for the first time + virtual wxAppTraits *CreateTraits(); + + // function used for dynamic wxApp creation - static wxAppInitializerFunction m_appInitFn; + static wxAppInitializerFunction ms_appInitFn; // application info (must be set from the user code) wxString m_vendorName, // vendor name (ACME Inc) m_appName, // app name m_className; // class name + // the class defining the application behaviour, NULL initially and created + // by GetTraits() when first needed + wxAppTraits *m_traits; + + + // the application object is a singleton anyhow, there is no sense in + // copying it + DECLARE_NO_COPY_CLASS(wxAppConsole) +}; + +// ---------------------------------------------------------------------------- +// wxAppBase: the common part of wxApp implementations for all platforms +// ---------------------------------------------------------------------------- + #if wxUSE_GUI - // the main top level window - may be NULL + +class WXDLLEXPORT wxAppBase : public wxAppConsole +{ +public: + wxAppBase(); + virtual ~wxAppBase(); + + // the virtual functions which may/must be overridden in the derived class + // ----------------------------------------------------------------------- + + // a platform-dependent version of OnInit(): the code here is likely to + // depend on the toolkit. default version does nothing. + // + // Override: rarely. + virtual bool OnInitGui(); + + // called to start program execution - the default version just enters + // the main GUI loop in which events are received and processed until + // the last window is not deleted (if GetExitOnFrameDelete) or + // ExitMainLoop() is called. In console mode programs, the execution + // of the program really starts here + // + // Override: rarely in GUI applications, always in console ones. + virtual int OnRun(); + + // exit the main loop thus terminating the application + virtual void Exit(); + + + // the worker functions - usually not used directly by the user code + // ----------------------------------------------------------------- + + // execute the main GUI loop, the function returns when the loop ends + virtual int MainLoop() = 0; + + // exit the main GUI loop during the next iteration (i.e. it does not + // stop the program immediately!) + virtual void ExitMainLoop() = 0; + + // returns TRUE if the program is initialized + virtual bool Initialized() = 0; + + // returns TRUE if there are unprocessed events in the event queue + virtual bool Pending() = 0; + + // process the first event in the event queue (blocks until an event + // apperas if there are none currently) + virtual void Dispatch() = 0; + + // process all currently pending events right now + // + // it is an error to call Yield() recursively unless the value of + // onlyIfNeeded is TRUE + // + // WARNING: this function is dangerous as it can lead to unexpected + // reentrancies (i.e. when called from an event handler it + // may result in calling the same event handler again), use + // with _extreme_ care or, better, don't use at all! + virtual bool Yield(bool onlyIfNeeded = FALSE) = 0; + + // this virtual function is called in the GUI mode when the application + // becomes idle and normally just sends wxIdleEvent to all interested + // parties + // + // it should return TRUE if more idle events are needed, FALSE if not + virtual bool ProcessIdle() = 0; + + + // top level window functions + // -------------------------- + + // return TRUE if our app has focus + virtual bool IsActive() const { return m_isActive; } + + // set the "main" top level window + void SetTopWindow(wxWindow *win) { m_topWindow = win; } + + // return the "main" top level window (if it hadn't been set previously + // with SetTopWindow(), will return just some top level window and, if + // there are none, will return NULL) + virtual wxWindow *GetTopWindow() const + { + if (m_topWindow) + return m_topWindow; + else if (wxTopLevelWindows.GetCount() > 0) + return wxTopLevelWindows.GetFirst()->GetData(); + else + return (wxWindow *)NULL; + } + + // control the exit behaviour: by default, the program will exit the + // main loop (and so, usually, terminate) when the last top-level + // program window is deleted. Beware that if you disable this behaviour + // (with SetExitOnFrameDelete(FALSE)), you'll have to call + // ExitMainLoop() explicitly from somewhere. + void SetExitOnFrameDelete(bool flag) + { m_exitOnFrameDelete = flag ? Yes : No; } + bool GetExitOnFrameDelete() const + { return m_exitOnFrameDelete == Yes; } + + + // display mode, visual, printing mode, ... + // ------------------------------------------------------------------------ + + // Get display mode that is used use. This is only used in framebuffer + // wxWin ports (such as wxMGL). + virtual wxDisplayModeInfo GetDisplayMode() const { return wxDisplayModeInfo(); } + // Set display mode to use. This is only used in framebuffer wxWin + // ports (such as wxMGL). This method should be called from + // wxApp::OnInitGui + virtual bool SetDisplayMode(const wxDisplayModeInfo& WXUNUSED(info)) { return TRUE; } + + // set use of best visual flag (see below) + void SetUseBestVisual( bool flag ) { m_useBestVisual = flag; } + bool GetUseBestVisual() const { return m_useBestVisual; } + + // set/get printing mode: see wxPRINT_XXX constants. + // + // default behaviour is the normal one for Unix: always use PostScript + // printing. + virtual void SetPrintMode(int WXUNUSED(mode)) { } + int GetPrintMode() const { return wxPRINT_POSTSCRIPT; } + + + // miscellaneous other stuff + // ------------------------------------------------------------------------ + + // called by toolkit-specific code to set the app status: active (we have + // focus) or not and also the last window which had focus before we were + // deactivated + virtual void SetActive(bool isActive, wxWindow *lastFocus); + + +protected: + // override base class method to use GUI traits + virtual wxAppTraits *CreateTraits(); + + + // the main top level window (may be NULL) wxWindow *m_topWindow; // if Yes, exit the main loop when the last top level window is deleted, if @@ -405,9 +443,13 @@ protected: // does any of our windows has focus? bool m_isActive; -#endif // wxUSE_GUI + + + DECLARE_NO_COPY_CLASS(wxAppBase) }; +#endif // wxUSE_GUI + // ---------------------------------------------------------------------------- // now include the declaration of the real class // ---------------------------------------------------------------------------- @@ -425,14 +467,14 @@ protected: #include "wx/x11/app.h" #elif defined(__WXMAC__) #include "wx/mac/app.h" + #elif defined(__WXCOCOA__) + #include "wx/cocoa/app.h" #elif defined(__WXPM__) #include "wx/os2/app.h" - #elif defined(__WXSTUBS__) - #include "wx/stubs/app.h" #endif #else // !GUI // can't use typedef because wxApp forward declared as a class - class WXDLLEXPORT wxApp : public wxAppBase + class WXDLLEXPORT wxApp : public wxAppConsole { }; #endif // GUI/!GUI @@ -463,18 +505,6 @@ extern bool WXDLLEXPORT wxYield(); // Yield to other apps/messages extern void WXDLLEXPORT wxWakeUpIdle(); -// Post a message to the given eventhandler which will be processed during the -// next event loop iteration -inline void wxPostEvent(wxEvtHandler *dest, wxEvent& event) -{ - wxCHECK_RET( dest, wxT("need an object to post event to in wxPostEvent") ); - -#if wxUSE_GUI - dest->AddPendingEvent(event); -#else - dest->ProcessEvent(event); -#endif // wxUSE_GUI -} // console applications may avoid using DECLARE_APP and IMPLEMENT_APP macros // and call these functions instead at the program startup and termination @@ -532,15 +562,15 @@ public: // be in your main program (e.g. hello.cpp). Now IMPLEMENT_APP should add this // code if required. -#if !wxUSE_GUI || defined(__WXMOTIF__) || defined(__WXGTK__) || defined(__WXPM__) || defined(__WXMGL__) +#if !wxUSE_GUI || defined(__WXMOTIF__) || defined(__WXGTK__) || defined(__WXPM__) || defined(__WXMGL__) || defined(__WXCOCOA__) #define IMPLEMENT_WXWIN_MAIN \ - extern int wxEntry( int argc, char *argv[] ); \ - int main(int argc, char *argv[]) { return wxEntry(argc, argv); } -#elif defined(__WXMAC__) && defined(__UNIX__) + extern int wxEntry( int argc, char **argv ); \ + int main(int argc, char **argv) { return wxEntry(argc, argv); } +#elif defined(__WXMAC__) // wxMac seems to have a specific wxEntry prototype #define IMPLEMENT_WXWIN_MAIN \ - extern int wxEntry( int argc, char *argv[], bool enterLoop = 1 ); \ - int main(int argc, char *argv[]) { return wxEntry(argc, argv); } + extern int wxEntry( int argc, char **argv, bool enterLoop = TRUE ); \ + int main(int argc, char **argv) { return wxEntry(argc, argv); } #elif defined(__WXMSW__) && defined(WXUSINGDLL) // NT defines APIENTRY, 3.x not #if !defined(WXAPIENTRY)