check in the 'selective yield' patch (see ticket #10320):
[wxWidgets.git] / src / palmos / app.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/palmos/app.cpp
3 // Purpose: wxApp
4 // Author: William Osborne - minimal working wxPalmOS port
5 // Modified by:
6 // Created: 10/08/04
7 // RCS-ID: $Id$
8 // Copyright: (c) William Osborne
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ===========================================================================
13 // declarations
14 // ===========================================================================
15
16 // ---------------------------------------------------------------------------
17 // headers
18 // ---------------------------------------------------------------------------
19
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
22
23 #if defined(__BORLANDC__)
24 #pragma hdrstop
25 #endif
26
27 #ifndef WX_PRECOMP
28 #include "wx/dynarray.h"
29 #include "wx/frame.h"
30 #include "wx/app.h"
31 #include "wx/utils.h"
32 #include "wx/gdicmn.h"
33 #include "wx/pen.h"
34 #include "wx/brush.h"
35 #include "wx/cursor.h"
36 #include "wx/icon.h"
37 #include "wx/palette.h"
38 #include "wx/dc.h"
39 #include "wx/dialog.h"
40 #include "wx/msgdlg.h"
41 #include "wx/intl.h"
42 #include "wx/crt.h"
43 #include "wx/log.h"
44 #include "wx/module.h"
45 #endif
46
47 #include "wx/apptrait.h"
48 #include "wx/filename.h"
49 #include "wx/dynlib.h"
50 #include "wx/evtloop.h"
51
52 #if wxUSE_TOOLTIPS
53 #include "wx/tooltip.h"
54 #endif // wxUSE_TOOLTIPS
55
56 // We don't support OLE
57 #undef wxUSE_OLE
58 #define wxUSE_OLE 0
59
60 #include <string.h>
61 #include <ctype.h>
62
63 // ---------------------------------------------------------------------------
64 // global variables
65 // ---------------------------------------------------------------------------
66
67 // NB: all "NoRedraw" classes must have the same names as the "normal" classes
68 // with NR suffix - wxWindow::MSWCreate() supposes this
69 const wxChar *wxCanvasClassName = wxT("wxWindowClass");
70 const wxChar *wxCanvasClassNameNR = wxT("wxWindowClassNR");
71 const wxChar *wxMDIFrameClassName = wxT("wxMDIFrameClass");
72 const wxChar *wxMDIFrameClassNameNoRedraw = wxT("wxMDIFrameClassNR");
73 const wxChar *wxMDIChildFrameClassName = wxT("wxMDIChildFrameClass");
74 const wxChar *wxMDIChildFrameClassNameNoRedraw = wxT("wxMDIChildFrameClassNR");
75
76 // ----------------------------------------------------------------------------
77 // private functions
78 // ----------------------------------------------------------------------------
79
80 // ===========================================================================
81 // wxGUIAppTraits implementation
82 // ===========================================================================
83
84 // private class which we use to pass parameters from BeforeChildWaitLoop() to
85 // AfterChildWaitLoop()
86 struct ChildWaitLoopData
87 {
88 ChildWaitLoopData(wxWindowDisabler *wd_, wxWindow *winActive_)
89 {
90 wd = wd_;
91 winActive = winActive_;
92 }
93
94 wxWindowDisabler *wd;
95 wxWindow *winActive;
96 };
97
98 void *wxGUIAppTraits::BeforeChildWaitLoop()
99 {
100 return NULL;
101 }
102
103 void wxGUIAppTraits::AlwaysYield()
104 {
105 wxYield();
106 }
107
108 void wxGUIAppTraits::AfterChildWaitLoop(void *dataOrig)
109 {
110 }
111
112 bool wxGUIAppTraits::DoMessageFromThreadWait()
113 {
114 return false;
115 }
116
117 wxPortId wxGUIAppTraits::GetToolkitVersion(int *majVer, int *minVer) const
118 {
119 // TODO: how to get PalmOS GUI system version ?
120 return wxPORT_PALMOS;
121 }
122
123 #if wxUSE_TIMER
124 wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
125 {
126 return new wxPalmOSTimerImpl(timer);
127 };
128 #endif // wxUSE_TIMER
129
130 wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
131 {
132 return new wxEventLoop;
133 }
134 // ===========================================================================
135 // wxApp implementation
136 // ===========================================================================
137
138 int wxApp::m_nCmdShow = 0;
139
140 // ---------------------------------------------------------------------------
141 // wxWin macros
142 // ---------------------------------------------------------------------------
143
144 IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
145
146 BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
147 EVT_END_SESSION(wxApp::OnEndSession)
148 EVT_QUERY_END_SESSION(wxApp::OnQueryEndSession)
149 END_EVENT_TABLE()
150
151 // class to ensure that wxAppBase::CleanUp() is called if our Initialize()
152 // fails
153 class wxCallBaseCleanup
154 {
155 public:
156 wxCallBaseCleanup(wxApp *app) : m_app(app) { }
157 ~wxCallBaseCleanup() { if ( m_app ) m_app->wxAppBase::CleanUp(); }
158
159 void Dismiss() { m_app = NULL; }
160
161 private:
162 wxApp *m_app;
163 };
164
165 //// Initialize
166 bool wxApp::Initialize(int& argc, wxChar **argv)
167 {
168 if ( !wxAppBase::Initialize(argc, argv) )
169 return false;
170
171 // ensure that base cleanup is done if we return too early
172 wxCallBaseCleanup callBaseCleanup(this);
173
174 wxWinHandleHash = new wxWinHashTable(wxKEY_INTEGER, 100);
175
176 callBaseCleanup.Dismiss();
177
178 return true;
179 }
180
181 // ---------------------------------------------------------------------------
182 // RegisterWindowClasses
183 // ---------------------------------------------------------------------------
184
185 // TODO we should only register classes really used by the app. For this it
186 // would be enough to just delay the class registration until an attempt
187 // to create a window of this class is made.
188 bool wxApp::RegisterWindowClasses()
189 {
190 return true;
191 }
192
193 // ---------------------------------------------------------------------------
194 // UnregisterWindowClasses
195 // ---------------------------------------------------------------------------
196
197 bool wxApp::UnregisterWindowClasses()
198 {
199 bool retval = true;
200 return retval;
201 }
202
203 void wxApp::CleanUp()
204 {
205 // all objects pending for deletion must be deleted first, otherwise we
206 // would crash when they use wxWinHandleHash (and UnregisterWindowClasses()
207 // call wouldn't succeed as long as any windows still exist), so call the
208 // base class method first and only then do our clean up
209 wxAppBase::CleanUp();
210
211 // for an EXE the classes are unregistered when it terminates but DLL may
212 // be loaded several times (load/unload/load) into the same process in
213 // which case the registration will fail after the first time if we don't
214 // unregister the classes now
215 UnregisterWindowClasses();
216
217 delete wxWinHandleHash;
218 wxWinHandleHash = NULL;
219 }
220
221 // ----------------------------------------------------------------------------
222 // wxApp ctor/dtor
223 // ----------------------------------------------------------------------------
224
225 wxApp::wxApp()
226 {
227 m_printMode = wxPRINT_WINDOWS;
228 }
229
230 wxApp::~wxApp()
231 {
232 wxChar **argv_tmp;
233 argv_tmp = argv;
234 // src/palmos/main.cpp
235 // our cmd line arguments are allocated inside wxEntry(HINSTANCE), they
236 // don't come from main(), so we have to free them
237 while ( argc )
238 {
239 // m_argv elements were allocated by wxStrdup()
240 if (argv_tmp[--argc]) {
241 free((void *)(argv_tmp[--argc]));
242 }
243 }
244 // but m_argv itself -- using new[]
245 delete [] argv_tmp;
246 //argv = NULL;
247 }
248
249 // ----------------------------------------------------------------------------
250 // wxApp idle handling
251 // ----------------------------------------------------------------------------
252
253 void wxApp::WakeUpIdle()
254 {
255 }
256
257 // ----------------------------------------------------------------------------
258 // other wxApp event hanlders
259 // ----------------------------------------------------------------------------
260
261 void wxApp::OnEndSession(wxCloseEvent& WXUNUSED(event))
262 {
263 if (GetTopWindow())
264 GetTopWindow()->Close(true);
265 }
266
267 // Default behaviour: close the application with prompts. The
268 // user can veto the close, and therefore the end session.
269 void wxApp::OnQueryEndSession(wxCloseEvent& event)
270 {
271 if (GetTopWindow())
272 {
273 if (!GetTopWindow()->Close(!event.CanVeto()))
274 event.Veto(true);
275 }
276 }
277
278 // ----------------------------------------------------------------------------
279 // miscellaneous
280 // ----------------------------------------------------------------------------
281
282 /* static */
283 int wxApp::GetComCtl32Version()
284 {
285 return 0;
286 }
287
288 // Yield to incoming messages
289
290 bool wxApp::DoYield(bool onlyIfNeeded, long eventsToProcess)
291 {
292 return true;
293 }
294
295 #if wxUSE_EXCEPTIONS
296
297 // ----------------------------------------------------------------------------
298 // exception handling
299 // ----------------------------------------------------------------------------
300
301 bool wxApp::OnExceptionInMainLoop()
302 {
303 return true;
304 }
305
306 #endif // wxUSE_EXCEPTIONS