]> 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();
 
     // 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 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!
     // 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();
 
     // 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
     // --------------------------
 
     // event processing functions
     // --------------------------
 
index 82d81c331af9935b58e489ad334b95e9523a2449..df144fb97aaf60452455f4f351f276844cf94368 100644 (file)
@@ -61,6 +61,9 @@ public:
     // using it
     virtual bool IsOk() const { return true; }
 
     // using it
     virtual bool IsOk() const { return true; }
 
+    // returns true if this is the main loop
+    bool IsMain() const;
+
 
     // dispatch&processing
     // -------------------
 
     // dispatch&processing
     // -------------------
@@ -173,14 +176,14 @@ public:
     static wxEventLoopBase *GetActive() { return ms_activeLoop; }
 
     // set currently active (running) event loop
     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)
 
 
 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;
 
     // 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);
 
     */
     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
 
     /**
         This function simply invokes the given method @a func of the specified
@@ -254,6 +262,22 @@ public:
     */
     virtual bool OnCmdLineParsed(wxCmdLineParser& parser);
 
     */
     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
     /**
         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.
 
 
     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.
 
     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}
 
     @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.
         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);
 
      */
     static void SetActive(wxEventLoopBase* loop);
 
+    /**
+        Returns @true if this is the main loop executed by wxApp::OnRun().
+    */
+    bool IsMain() const;
+
 
     /**
         @name Dispatch and processing
 
     /**
         @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;
 
     */
     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).
 
         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();
 };
      */
     virtual void OnExit();
 };
index 29e2d7c4235340c05e4e8eb746ab49fd4cd52404..863946f59db59b75f87ae23331cded03f02e06ad 100644 (file)
@@ -34,6 +34,28 @@ wxEventLoopBase::wxEventLoopBase()
     m_eventsToProcessInsideYield = wxEVT_CATEGORY_ALL;
 }
 
     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);
 void wxEventLoopBase::DelayPendingEventHandler(wxEvtHandler* toDelay)
 {
     wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker);