]> git.saurik.com Git - wxWidgets.git/blame - src/dfb/app.cpp
rebaked after listctrl/imagelist and wxUniv changes
[wxWidgets.git] / src / dfb / app.cpp
CommitLineData
b3c86150
VS
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/dfb/private.h"
23
24//-----------------------------------------------------------------------------
25// wxApp initialization
26//-----------------------------------------------------------------------------
27
28IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
29
30BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
31 EVT_IDLE(wxAppBase::OnIdle)
32END_EVENT_TABLE()
33
34wxApp::wxApp()
35{
36}
37
38wxApp::~wxApp()
39{
40}
41
b3c86150
VS
42bool wxApp::Initialize(int& argc, wxChar **argv)
43{
44 if ( !wxAppBase::Initialize(argc, argv) )
45 return false;
46
52c8d32a 47 if ( !wxDfbCheckReturn(DirectFBInit(&argc, &argv)) )
b3c86150
VS
48 return false;
49
52c8d32a 50 if ( !wxIDirectFB::Get() )
b3c86150
VS
51 return false;
52
53 #warning "FIXME: theme override is temporary"
54 wxTheme::Set(wxTheme::Create(_T("gtk")));
55
56 return true;
57}
58
59void wxApp::CleanUp()
60{
61 wxAppBase::CleanUp();
62
52c8d32a 63 wxIDirectFB::CleanUp();
b3c86150
VS
64}
65
66//-----------------------------------------------------------------------------
67// display mode
68//-----------------------------------------------------------------------------
69
70static wxVideoMode GetCurrentVideoMode()
71{
72 wxVideoMode m;
73
a5b31f4e 74 wxIDirectFBSurfacePtr surface(wxIDirectFB::Get()->GetPrimarySurface());
b3c86150
VS
75 if ( !surface )
76 return m; // invalid
77
52c8d32a 78 surface->GetSize(&m.w, &m.h);
a5b31f4e 79 m.bpp = surface->GetDepth();
b3c86150
VS
80
81 return m;
82}
83
84wxVideoMode wxApp::GetDisplayMode() const
85{
86 if ( !m_videoMode.IsOk() )
87 wxConstCast(this, wxApp)->m_videoMode = GetCurrentVideoMode();
88
89 return m_videoMode;
90}
91
92bool wxApp::SetDisplayMode(const wxVideoMode& mode)
93{
52c8d32a 94 if ( !wxIDirectFB::Get()->SetVideoMode(mode.w, mode.h, mode.bpp) )
b3c86150
VS
95 return false;
96
97 m_videoMode = mode;
98 return true;
99}
100
101//-----------------------------------------------------------------------------
102// events processing related
103//-----------------------------------------------------------------------------
104
105void wxApp::WakeUpIdle()
106{
107#if wxUSE_THREADS
108 if (!wxThread::IsMain())
109 wxMutexGuiEnter();
110#endif
111
112 wxEventLoop::GetActive()->WakeUp();
113
114#if wxUSE_THREADS
115 if (!wxThread::IsMain())
116 wxMutexGuiLeave();
117#endif
118}
119
120
121bool wxApp::Yield(bool onlyIfNeeded)
122{
123#if wxUSE_THREADS
124 if ( !wxThread::IsMain() )
125 return true; // can't process events from other threads
126#endif // wxUSE_THREADS
127
128 static bool s_inYield = false;
129
130 if ( s_inYield )
131 {
132 if ( !onlyIfNeeded )
133 {
134 wxFAIL_MSG( wxT("wxYield called recursively" ) );
135 }
136
137 return false;
138 }
139
140 s_inYield = true;
141
142 wxLog::Suspend();
143
144 if ( wxEventLoop::GetActive() )
145 {
146 while (wxEventLoop::GetActive()->Pending())
147 wxEventLoop::GetActive()->Dispatch();
148 }
149
150 // it's necessary to call ProcessIdle() to update the frames sizes which
151 // might have been changed (it also will update other things set from
152 // OnUpdateUI() which is a nice (and desired) side effect)
153 while ( ProcessIdle() ) {}
154
155 wxLog::Resume();
156
157 s_inYield = false;
158
159 return true;
160}