]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/palmos/app.cpp
Merge in from trunk r67662 to r64801
[wxWidgets.git] / src / palmos / app.cpp
... / ...
CommitLineData
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
69const wxChar *wxCanvasClassName = wxT("wxWindowClass");
70const wxChar *wxCanvasClassNameNR = wxT("wxWindowClassNR");
71const wxChar *wxMDIFrameClassName = wxT("wxMDIFrameClass");
72const wxChar *wxMDIFrameClassNameNoRedraw = wxT("wxMDIFrameClassNR");
73const wxChar *wxMDIChildFrameClassName = wxT("wxMDIChildFrameClass");
74const 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()
86struct 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
98void *wxGUIAppTraits::BeforeChildWaitLoop()
99{
100 return NULL;
101}
102
103void wxGUIAppTraits::AfterChildWaitLoop(void *dataOrig)
104{
105}
106
107#if wxUSE_THREADS
108bool wxGUIAppTraits::DoMessageFromThreadWait()
109{
110 return false;
111}
112#endif // wxUSE_THREADS
113
114wxPortId wxGUIAppTraits::GetToolkitVersion(int *majVer, int *minVer) const
115{
116 // TODO: how to get PalmOS GUI system version ?
117 return wxPORT_PALMOS;
118}
119
120#if wxUSE_TIMER
121wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
122{
123 return new wxPalmOSTimerImpl(timer);
124};
125#endif // wxUSE_TIMER
126
127wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
128{
129 return new wxEventLoop;
130}
131// ===========================================================================
132// wxApp implementation
133// ===========================================================================
134
135int wxApp::m_nCmdShow = 0;
136
137// ---------------------------------------------------------------------------
138// wxWin macros
139// ---------------------------------------------------------------------------
140
141IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
142
143BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
144 EVT_END_SESSION(wxApp::OnEndSession)
145 EVT_QUERY_END_SESSION(wxApp::OnQueryEndSession)
146END_EVENT_TABLE()
147
148// class to ensure that wxAppBase::CleanUp() is called if our Initialize()
149// fails
150class wxCallBaseCleanup
151{
152public:
153 wxCallBaseCleanup(wxApp *app) : m_app(app) { }
154 ~wxCallBaseCleanup() { if ( m_app ) m_app->wxAppBase::CleanUp(); }
155
156 void Dismiss() { m_app = NULL; }
157
158private:
159 wxApp *m_app;
160};
161
162//// Initialize
163bool wxApp::Initialize(int& argc, wxChar **argv)
164{
165 if ( !wxAppBase::Initialize(argc, argv) )
166 return false;
167
168 // ensure that base cleanup is done if we return too early
169 wxCallBaseCleanup callBaseCleanup(this);
170
171 wxWinHandleHash = new wxWinHashTable(wxKEY_INTEGER, 100);
172
173 callBaseCleanup.Dismiss();
174
175 return true;
176}
177
178// ---------------------------------------------------------------------------
179// RegisterWindowClasses
180// ---------------------------------------------------------------------------
181
182// TODO we should only register classes really used by the app. For this it
183// would be enough to just delay the class registration until an attempt
184// to create a window of this class is made.
185bool wxApp::RegisterWindowClasses()
186{
187 return true;
188}
189
190// ---------------------------------------------------------------------------
191// UnregisterWindowClasses
192// ---------------------------------------------------------------------------
193
194bool wxApp::UnregisterWindowClasses()
195{
196 bool retval = true;
197 return retval;
198}
199
200void wxApp::CleanUp()
201{
202 // all objects pending for deletion must be deleted first, otherwise we
203 // would crash when they use wxWinHandleHash (and UnregisterWindowClasses()
204 // call wouldn't succeed as long as any windows still exist), so call the
205 // base class method first and only then do our clean up
206 wxAppBase::CleanUp();
207
208 // for an EXE the classes are unregistered when it terminates but DLL may
209 // be loaded several times (load/unload/load) into the same process in
210 // which case the registration will fail after the first time if we don't
211 // unregister the classes now
212 UnregisterWindowClasses();
213
214 wxDELETE(wxWinHandleHash);
215}
216
217// ----------------------------------------------------------------------------
218// wxApp ctor/dtor
219// ----------------------------------------------------------------------------
220
221wxApp::wxApp()
222{
223 m_printMode = wxPRINT_WINDOWS;
224}
225
226wxApp::~wxApp()
227{
228 wxChar **argv_tmp;
229 argv_tmp = argv;
230 // src/palmos/main.cpp
231 // our cmd line arguments are allocated inside wxEntry(HINSTANCE), they
232 // don't come from main(), so we have to free them
233 while ( argc )
234 {
235 // m_argv elements were allocated by wxStrdup()
236 if (argv_tmp[--argc]) {
237 free((void *)(argv_tmp[--argc]));
238 }
239 }
240 // but m_argv itself -- using new[]
241 delete [] argv_tmp;
242 //argv = NULL;
243}
244
245// ----------------------------------------------------------------------------
246// wxApp idle handling
247// ----------------------------------------------------------------------------
248
249void wxApp::WakeUpIdle()
250{
251}
252
253// ----------------------------------------------------------------------------
254// other wxApp event hanlders
255// ----------------------------------------------------------------------------
256
257void wxApp::OnEndSession(wxCloseEvent& WXUNUSED(event))
258{
259 if (GetTopWindow())
260 GetTopWindow()->Close(true);
261}
262
263// Default behaviour: close the application with prompts. The
264// user can veto the close, and therefore the end session.
265void wxApp::OnQueryEndSession(wxCloseEvent& event)
266{
267 if (GetTopWindow())
268 {
269 if (!GetTopWindow()->Close(!event.CanVeto()))
270 event.Veto(true);
271 }
272}
273
274// ----------------------------------------------------------------------------
275// miscellaneous
276// ----------------------------------------------------------------------------
277
278/* static */
279int wxApp::GetComCtl32Version()
280{
281 return 0;
282}
283
284#if wxUSE_EXCEPTIONS
285
286// ----------------------------------------------------------------------------
287// exception handling
288// ----------------------------------------------------------------------------
289
290bool wxApp::OnExceptionInMainLoop()
291{
292 return true;
293}
294
295#endif // wxUSE_EXCEPTIONS