]> git.saurik.com Git - wxWidgets.git/blame - src/gtk1/evtloop.cpp
Change wxNotebook selection before sending page changed event in wxMSW.
[wxWidgets.git] / src / gtk1 / evtloop.cpp
CommitLineData
8000ae7f 1///////////////////////////////////////////////////////////////////////////////
670f9935 2// Name: src/gtk1/evtloop.cpp
8000ae7f
VZ
3// Purpose: implements wxEventLoop for GTK+
4// Author: Vadim Zeitlin
5// Modified by:
6// Created: 10.07.01
7// RCS-ID: $Id$
8// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
526954c5 9// Licence: wxWindows licence
8000ae7f
VZ
10///////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
8000ae7f
VZ
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
24 #pragma hdrstop
25#endif
26
8000ae7f 27#include "wx/evtloop.h"
670f9935
WS
28
29#ifndef WX_PRECOMP
30 #include "wx/app.h"
6918257d 31 #include "wx/log.h"
670f9935 32#endif // WX_PRECOMP
8000ae7f
VZ
33
34#include <gtk/gtk.h>
35
36// ----------------------------------------------------------------------------
37// wxEventLoopImpl
38// ----------------------------------------------------------------------------
39
40class WXDLLEXPORT wxEventLoopImpl
41{
42public:
43 // ctor
44 wxEventLoopImpl() { SetExitCode(0); }
45
46 // set/get the exit code
47 void SetExitCode(int exitcode) { m_exitcode = exitcode; }
48 int GetExitCode() const { return m_exitcode; }
49
50private:
51 // the exit code of the event loop
52 int m_exitcode;
53};
54
55// ============================================================================
b46b1d59 56// wxGUIEventLoop implementation
8000ae7f
VZ
57// ============================================================================
58
59// ----------------------------------------------------------------------------
b46b1d59 60// wxGUIEventLoop running and exiting
8000ae7f
VZ
61// ----------------------------------------------------------------------------
62
b46b1d59 63wxGUIEventLoop::~wxGUIEventLoop()
8000ae7f 64{
9a83f860 65 wxASSERT_MSG( !m_impl, wxT("should have been deleted in Run()") );
8000ae7f
VZ
66}
67
b46b1d59 68int wxGUIEventLoop::Run()
8000ae7f
VZ
69{
70 // event loops are not recursive, you need to create another loop!
9a83f860 71 wxCHECK_MSG( !IsRunning(), -1, wxT("can't reenter a message loop") );
8000ae7f 72
77fb1a02 73 wxEventLoopActivator activate(this);
b9f246f7 74
8000ae7f
VZ
75 m_impl = new wxEventLoopImpl;
76
77 gtk_main();
78
16d17da6
VZ
79 OnExit();
80
8000ae7f 81 int exitcode = m_impl->GetExitCode();
5276b0a5 82 wxDELETE(m_impl);
8000ae7f
VZ
83
84 return exitcode;
85}
86
b46b1d59 87void wxGUIEventLoop::Exit(int rc)
8000ae7f 88{
9a83f860 89 wxCHECK_RET( IsRunning(), wxT("can't call Exit() if not running") );
8000ae7f
VZ
90
91 m_impl->SetExitCode(rc);
92
93 gtk_main_quit();
94}
95
96// ----------------------------------------------------------------------------
97// wxEventLoop message processing dispatching
98// ----------------------------------------------------------------------------
99
b46b1d59 100bool wxGUIEventLoop::Pending() const
8000ae7f 101{
c263eb03 102 if (wxTheApp)
9213ca5d
RD
103 {
104 // We need to remove idle callbacks or gtk_events_pending will
105 // never return false.
fe593cc5 106 wxTheApp->RemoveIdleTag();
9213ca5d
RD
107 }
108
109 return gtk_events_pending();
8000ae7f
VZ
110}
111
b46b1d59 112bool wxGUIEventLoop::Dispatch()
8000ae7f 113{
9a83f860 114 wxCHECK_MSG( IsRunning(), false, wxT("can't call Dispatch() if not running") );
8000ae7f
VZ
115
116 gtk_main_iteration();
117
670f9935 118 return true;
8000ae7f 119}
dde19c21
FM
120
121//-----------------------------------------------------------------------------
122// wxYield
123//-----------------------------------------------------------------------------
124
125bool wxGUIEventLoop::YieldFor(long eventsToProcess)
126{
127#if wxUSE_THREADS
128 if ( !wxThread::IsMain() )
129 {
130 // can't call gtk_main_iteration() from other threads like this
131 return true;
132 }
133#endif // wxUSE_THREADS
134
135 m_isInsideYield = true;
136 m_eventsToProcessInsideYield = eventsToProcess;
137
138 // We need to remove idle callbacks or the loop will
139 // never finish.
140 wxTheApp->RemoveIdleTag();
141
142#if wxUSE_LOG
143 // disable log flushing from here because a call to wxYield() shouldn't
144 // normally result in message boxes popping up &c
145 wxLog::Suspend();
146#endif
147
148 // TODO: implement event filtering using the eventsToProcess mask
149 while (gtk_events_pending())
150 gtk_main_iteration();
151
152 // It's necessary to call ProcessIdle() to update the frames sizes which
153 // might have been changed (it also will update other things set from
154 // OnUpdateUI() which is a nice (and desired) side effect). But we
155 // call ProcessIdle() only once since this is not meant for longish
156 // background jobs (controlled by wxIdleEvent::RequestMore() and the
157 // return value of Processidle().
158 ProcessIdle();
159
160#if wxUSE_LOG
161 // let the logs be flashed again
162 wxLog::Resume();
163#endif
164
165 m_isInsideYield = false;
166
167 return true;
168}