]> git.saurik.com Git - wxWidgets.git/commitdiff
add wxAppConsoleBase::OnEventLoopEnter/Exit callbacks; add wxEventLoopBase::IsMain...
authorFrancesco Montorsi <f18m_cpp217828@yahoo.it>
Wed, 25 Feb 2009 13:23:12 +0000 (13:23 +0000)
committerFrancesco Montorsi <f18m_cpp217828@yahoo.it>
Wed, 25 Feb 2009 13:23:12 +0000 (13:23 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59132 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/app.h
include/wx/evtloop.h
interface/wx/app.h
interface/wx/evtloop.h
src/common/evtloopcmn.cpp

index 2aa047d3a9784874079df472dfebd15485fbac59..10a99bf981e0f59e74b1117b0f899c0b1e86556c 100644 (file)
@@ -87,10 +87,21 @@ public:
     // be done here. When OnRun() returns, the programs starts shutting down.
     virtual int OnRun();
 
+    // This is called by wxEventLoopBase::SetActive(): you should put the code
+    // which needs an active event loop here.
+    // Note that this function is called whenever an event loop is activated;
+    // you may want to use wxEventLoopBase::IsMain() to perform initialization
+    // specific for the app's main event loop.
+    virtual void OnEventLoopEnter(wxEventLoopBase* WXUNUSED(loop)) {}
+
     // 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();
 
+    // This is called by wxEventLoopBase::OnExit() for each event loop which
+    // is exited.
+    virtual void OnEventLoopExit(wxEventLoopBase* WXUNUSED(loop)) {}
+
     // This is the very last function called on wxApp object before it is
     // destroyed. If you override it (instead of overriding OnExit() as usual)
     // do not forget to call the base class version!
@@ -206,6 +217,15 @@ public:
     // for it
     static wxAppTraits *GetTraitsIfExists();
 
+    // returns the main event loop instance, i.e. the event loop which is started
+    // by OnRun() and which dispatches all events sent from the native toolkit
+    // to the application (except when new event loops are temporarily set-up).
+    // The returned value maybe NULL. Put initialization code which needs a
+    // non-NULL main event loop into OnEventLoopEnter().
+    wxEventLoopBase* GetMainLoop() const
+        { return m_mainLoop; }
+
+
     // event processing functions
     // --------------------------
 
index 82d81c331af9935b58e489ad334b95e9523a2449..df144fb97aaf60452455f4f351f276844cf94368 100644 (file)
@@ -61,6 +61,9 @@ public:
     // using it
     virtual bool IsOk() const { return true; }
 
+    // returns true if this is the main loop
+    bool IsMain() const;
+
 
     // dispatch&processing
     // -------------------
@@ -173,14 +176,14 @@ public:
     static wxEventLoopBase *GetActive() { return ms_activeLoop; }
 
     // set currently active (running) event loop
-    static void SetActive(wxEventLoopBase* loop) { ms_activeLoop = loop; }
+    static void SetActive(wxEventLoopBase* loop);
 
 
 protected:
     // this function should be called before the event loop terminates, whether
     // this happens normally (because of Exit() call) or abnormally (because of
     // an exception thrown from inside the loop)
-    virtual void OnExit() { }
+    virtual void OnExit();
 
     // the pointer to currently active loop
     static wxEventLoopBase *ms_activeLoop;
index 9037103381b94379583649e9c39e7f22e2e5f34a..f664be76f9a942d1c0ebeb6757f420c86bdf09b1 100644 (file)
@@ -91,6 +91,14 @@ public:
     */
     virtual int FilterEvent(wxEvent& event);
 
+    /**
+        Returns the main event loop instance, i.e. the event loop which is started
+        by OnRun() and which dispatches all events sent from the native toolkit
+        to the application (except when new event loops are temporarily set-up).
+        The returned value maybe @NULL. Put initialization code which needs a
+        non-@NULL main event loop into OnEventLoopEnter().
+    */
+    wxEventLoopBase* GetMainLoop() const;
 
     /**
         This function simply invokes the given method @a func of the specified
@@ -254,6 +262,22 @@ public:
     */
     virtual bool OnCmdLineParsed(wxCmdLineParser& parser);
 
+    /**
+        Called by wxEventLoopBase::SetActive(): you can override this function
+        and put here the code which needs an active event loop.
+
+        Note that this function is called whenever an event loop is activated;
+        you may want to use wxEventLoopBase::IsMain() to perform initialization
+        specific for the app's main event loop.
+    */
+    virtual void OnEventLoopEnter(wxEventLoopBase* loop);
+
+    /**
+        Called by wxEventLoopBase::OnExit() for each event loop which
+        is exited.
+    */
+    virtual void OnEventLoopExit(wxEventLoopBase* loop);
+
     /**
         This function is called if an unhandled exception occurs inside the main
         application event loop. It can return @true to ignore the exception and to
index 659a6b964e2e8aedbd6e1e3e4a2bf3c1afafadfb..41e4316355a25489bf18a42fe218cdf2f3982f9c 100644 (file)
 
     Base class for all event loop implementations.
 
+    An event loop is a class which queries the queue of native events sent
+    to the wxWidgets application and dispatches them to the appropriate
+    wxEvtHandlers.
+
     An object of this class is created by wxAppTraits::CreateEventLoop() and
     used by wxApp to run the main application event loop.
 
+    You can create your own event loop if you need, provided that you restore
+    the main event loop once yours is destroyed (see wxEventLoopActivator).
+
     @library{wxbase}
     @category{appmanagement}
 
@@ -37,9 +44,16 @@ public:
         Called by wxEventLoopActivator, use an instance of this class instead
         of calling this method directly to ensure that the previously active
         event loop is restored.
+
+        Results in a call to wxAppConsole::OnEventLoopEnter.
      */
     static void SetActive(wxEventLoopBase* loop);
 
+    /**
+        Returns @true if this is the main loop executed by wxApp::OnRun().
+    */
+    bool IsMain() const;
+
 
     /**
         @name Dispatch and processing
@@ -193,7 +207,7 @@ public:
     //@{
 
     /**
-        Returns @true if called from inside Yield().
+        Returns @true if called from inside Yield() or from inside YieldFor().
     */
     virtual bool IsYielding() const;
 
@@ -261,7 +275,7 @@ protected:
         happens normally (because of Exit() call) or abnormally (because of an
         exception thrown from inside the loop).
 
-        Default version does nothing.
+        The default implementation calls wxAppConsole::OnEventLoopExit.
      */
     virtual void OnExit();
 };
index 29e2d7c4235340c05e4e8eb746ab49fd4cd52404..863946f59db59b75f87ae23331cded03f02e06ad 100644 (file)
@@ -34,6 +34,28 @@ wxEventLoopBase::wxEventLoopBase()
     m_eventsToProcessInsideYield = wxEVT_CATEGORY_ALL;
 }
 
+bool wxEventLoopBase::IsMain() const
+{
+    if (wxTheApp)
+        return wxTheApp->GetMainLoop() == this;
+    return false;
+}
+
+/* static */
+void wxEventLoopBase::SetActive(wxEventLoopBase* loop)
+{
+    ms_activeLoop = loop;
+
+    if (wxTheApp)
+        wxTheApp->OnEventLoopEnter(loop);
+}
+
+void wxEventLoopBase::OnExit()
+{
+    if (wxTheApp)
+        wxTheApp->OnEventLoopExit(this);
+}
+
 void wxEventLoopBase::DelayPendingEventHandler(wxEvtHandler* toDelay)
 {
     wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker);