1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/gtk1/evtloop.cpp
3 // Purpose: implements wxEventLoop for GTK+
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
27 #include "wx/evtloop.h"
36 // ----------------------------------------------------------------------------
38 // ----------------------------------------------------------------------------
40 class WXDLLEXPORT wxEventLoopImpl
44 wxEventLoopImpl() { SetExitCode(0); }
46 // set/get the exit code
47 void SetExitCode(int exitcode
) { m_exitcode
= exitcode
; }
48 int GetExitCode() const { return m_exitcode
; }
51 // the exit code of the event loop
55 // ============================================================================
56 // wxGUIEventLoop implementation
57 // ============================================================================
59 // ----------------------------------------------------------------------------
60 // wxGUIEventLoop running and exiting
61 // ----------------------------------------------------------------------------
63 wxGUIEventLoop
::~wxGUIEventLoop()
65 wxASSERT_MSG( !m_impl
, wxT("should have been deleted in Run()") );
68 int wxGUIEventLoop
::DoRun()
70 m_impl
= new wxEventLoopImpl
;
76 int exitcode
= m_impl
->GetExitCode();
82 void wxGUIEventLoop
::Exit(int rc
)
84 wxCHECK_RET( IsRunning(), wxT("can't call Exit() if not running") );
86 m_impl
->SetExitCode(rc
);
91 // ----------------------------------------------------------------------------
92 // wxEventLoop message processing dispatching
93 // ----------------------------------------------------------------------------
95 bool wxGUIEventLoop
::Pending() const
99 // We need to remove idle callbacks or gtk_events_pending will
100 // never return false.
101 wxTheApp
->RemoveIdleTag();
104 return gtk_events_pending();
107 bool wxGUIEventLoop
::Dispatch()
109 wxCHECK_MSG( IsRunning(), false, wxT("can't call Dispatch() if not running") );
111 gtk_main_iteration();
116 //-----------------------------------------------------------------------------
118 //-----------------------------------------------------------------------------
120 bool wxGUIEventLoop
::YieldFor(long eventsToProcess
)
123 if ( !wxThread
::IsMain() )
125 // can't call gtk_main_iteration() from other threads like this
128 #endif // wxUSE_THREADS
130 m_isInsideYield
= true;
131 m_eventsToProcessInsideYield
= eventsToProcess
;
133 // We need to remove idle callbacks or the loop will
135 wxTheApp
->RemoveIdleTag();
138 // disable log flushing from here because a call to wxYield() shouldn't
139 // normally result in message boxes popping up &c
143 // TODO: implement event filtering using the eventsToProcess mask
144 while (gtk_events_pending())
145 gtk_main_iteration();
147 // It's necessary to call ProcessIdle() to update the frames sizes which
148 // might have been changed (it also will update other things set from
149 // OnUpdateUI() which is a nice (and desired) side effect). But we
150 // call ProcessIdle() only once since this is not meant for longish
151 // background jobs (controlled by wxIdleEvent::RequestMore() and the
152 // return value of Processidle().
156 // let the logs be flashed again
160 m_isInsideYield
= false;