Use wxDELETE() and wxDELETEA() when possible.
[wxWidgets.git] / src / dfb / app.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/dfb/app.cpp
3 // Purpose: wxApp implementation
4 // Author: Vaclav Slavik
5 // based on MGL implementation
6 // Created: 2006-08-16
7 // RCS-ID: $Id$
8 // Copyright: (c) 2006 REA Elektronik GmbH
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
14
15 #ifdef __BORLANDC__
16 #pragma hdrstop
17 #endif
18
19 #include "wx/app.h"
20
21 #include "wx/evtloop.h"
22 #include "wx/thread.h"
23 #include "wx/dfb/private.h"
24 #include "wx/private/fontmgr.h"
25
26 //-----------------------------------------------------------------------------
27 // wxApp initialization
28 //-----------------------------------------------------------------------------
29
30 IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
31
32 wxApp::wxApp()
33 {
34 }
35
36 wxApp::~wxApp()
37 {
38 }
39
40 bool wxApp::Initialize(int& argc, wxChar **argv)
41 {
42 if ( !wxAppBase::Initialize(argc, argv) )
43 return false;
44
45 // FIXME-UTF8: This code is taken from wxGTK and duplicated here. This
46 // is just a temporary fix to make wxDFB compile in Unicode
47 // build, the real fix is to change Initialize()'s signature
48 // to use char* on Unix.
49 #if wxUSE_UNICODE
50 // DirectFBInit() wants UTF-8, not wchar_t, so convert
51 int i;
52 char **argvDFB = new char *[argc + 1];
53 for ( i = 0; i < argc; i++ )
54 {
55 argvDFB[i] = strdup(wxConvUTF8.cWX2MB(argv[i]));
56 }
57
58 argvDFB[argc] = NULL;
59
60 int argcDFB = argc;
61
62 if ( !wxDfbCheckReturn(DirectFBInit(&argcDFB, &argvDFB)) )
63 return false;
64
65 if ( argcDFB != argc )
66 {
67 // we have to drop the parameters which were consumed by DFB+
68 for ( i = 0; i < argcDFB; i++ )
69 {
70 while ( strcmp(wxConvUTF8.cWX2MB(argv[i]), argvDFB[i]) != 0 )
71 {
72 memmove(argv + i, argv + i + 1, (argc - i)*sizeof(*argv));
73 }
74 }
75
76 argc = argcDFB;
77 }
78 //else: DirectFBInit() didn't modify our parameters
79
80 // free our copy
81 for ( i = 0; i < argcDFB; i++ )
82 {
83 free(argvDFB[i]);
84 }
85
86 delete [] argvDFB;
87
88 #else // ANSI
89
90 if ( !wxDfbCheckReturn(DirectFBInit(&argc, &argv)) )
91 return false;
92
93 #endif // Unicode/ANSI
94
95 // update internal arg[cv] as DFB may have removed processed options:
96 this->argc = argc;
97 this->argv = argv;
98
99 if ( !wxIDirectFB::Get() )
100 return false;
101
102 return true;
103 }
104
105 void wxApp::CleanUp()
106 {
107 wxAppBase::CleanUp();
108
109 wxFontsManager::CleanUp();
110
111 wxEventLoop::CleanUp();
112 wxIDirectFB::CleanUp();
113 }
114
115 //-----------------------------------------------------------------------------
116 // display mode
117 //-----------------------------------------------------------------------------
118
119 static wxVideoMode GetCurrentVideoMode()
120 {
121 wxIDirectFBDisplayLayerPtr layer(wxIDirectFB::Get()->GetDisplayLayer());
122 if ( !layer )
123 return wxVideoMode(); // invalid
124
125 return layer->GetVideoMode();
126 }
127
128 wxVideoMode wxApp::GetDisplayMode() const
129 {
130 if ( !m_videoMode.IsOk() )
131 wxConstCast(this, wxApp)->m_videoMode = GetCurrentVideoMode();
132
133 return m_videoMode;
134 }
135
136 bool wxApp::SetDisplayMode(const wxVideoMode& mode)
137 {
138 if ( !wxIDirectFB::Get()->SetVideoMode(mode.w, mode.h, mode.bpp) )
139 return false;
140
141 m_videoMode = mode;
142 return true;
143 }
144
145 //-----------------------------------------------------------------------------
146 // events processing related
147 //-----------------------------------------------------------------------------
148
149 void wxApp::WakeUpIdle()
150 {
151 // we don't need a mutex here, since we use the wxConsoleEventLoop
152 // and wxConsoleEventLoop::WakeUp() is thread-safe
153 wxEventLoopBase * const loop = wxEventLoop::GetActive();
154 if ( loop )
155 loop->WakeUp();
156 }