]> git.saurik.com Git - wxWidgets.git/blob - src/common/dpycmn.cpp
wxDisplay cleanup/rewrite:
[wxWidgets.git] / src / common / dpycmn.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/common/dpycmn.cpp
3 // Purpose: wxDisplay and wxDisplayImplSingle implementation
4 // Author: Vadim Zeitlin
5 // Modified by:
6 // Created: 01.03.03
7 // RCS-ID: $Id$
8 // Copyright: (c) 2003-2006 Vadim Zeitlin <vadim@wxwindows.org>
9 // License: 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 #ifdef __BORLANDC__
24 #pragma hdrstop
25 #endif
26
27 #ifndef WX_PRECOMP
28 #include "wx/gdicmn.h"
29 #include "wx/window.h"
30 #endif //WX_PRECOMP
31
32 #include "wx/display.h"
33 #include "wx/display_impl.h"
34 #include "wx/module.h"
35 #include "wx/gdicmn.h" // for wxDisplaySize()
36
37 #if wxUSE_DISPLAY
38
39 #include "wx/arrimpl.cpp"
40 WX_DEFINE_OBJARRAY(wxArrayVideoModes)
41
42 const wxVideoMode wxDefaultVideoMode;
43
44 #endif // wxUSE_DISPLAY
45
46 // ----------------------------------------------------------------------------
47 // globals
48 // ----------------------------------------------------------------------------
49
50 // the factory object used by wxDisplay
51 //
52 // created on demand and destroyed by wxDisplayModule
53 static wxDisplayFactory *gs_factory = NULL;
54
55 // ----------------------------------------------------------------------------
56 // wxDisplayImplSingle: trivial implementation working for main display only
57 // ----------------------------------------------------------------------------
58
59 class WXDLLEXPORT wxDisplayImplSingle : public wxDisplayImpl
60 {
61 public:
62 wxDisplayImplSingle() : wxDisplayImpl(0) { }
63
64 virtual wxRect GetGeometry() const
65 {
66 wxRect r;
67 wxDisplaySize(&r.width, &r.height);
68 return r;
69 }
70
71 virtual wxString GetName() const { return wxString(); }
72
73 #if wxUSE_DISPLAY
74 // no video modes support for us, provide just the stubs
75
76 virtual wxArrayVideoModes GetModes(const wxVideoMode& WXUNUSED(mode)) const
77 {
78 return wxArrayVideoModes();
79 }
80
81 virtual wxVideoMode GetCurrentMode() const { return wxVideoMode(); }
82
83 virtual bool ChangeMode(const wxVideoMode& WXUNUSED(mode)) { return false; }
84 #endif // wxUSE_DISPLAY
85
86
87 DECLARE_NO_COPY_CLASS(wxDisplayImplSingle)
88 };
89
90 // ----------------------------------------------------------------------------
91 // wxDisplayModule is used to cleanup gs_factory
92 // ----------------------------------------------------------------------------
93
94 class wxDisplayModule : public wxModule
95 {
96 public:
97 virtual bool OnInit() { return true; }
98 virtual void OnExit()
99 {
100 if ( gs_factory )
101 {
102 delete gs_factory;
103 gs_factory = NULL;
104 }
105 }
106
107 DECLARE_DYNAMIC_CLASS(wxDisplayModule)
108 };
109
110 IMPLEMENT_DYNAMIC_CLASS(wxDisplayModule, wxModule)
111
112 // ============================================================================
113 // wxDisplay implementation
114 // ============================================================================
115
116 // ----------------------------------------------------------------------------
117 // ctor/dtor
118 // ----------------------------------------------------------------------------
119
120 wxDisplay::wxDisplay(size_t n)
121 {
122 wxASSERT_MSG( n < GetCount(),
123 wxT("An invalid index was passed to wxDisplay") );
124
125 m_impl = Factory().CreateDisplay(n);
126 }
127
128 wxDisplay::~wxDisplay()
129 {
130 delete m_impl;
131 }
132
133 // ----------------------------------------------------------------------------
134 // static functions forwarded to wxDisplayFactory
135 // ----------------------------------------------------------------------------
136
137 /* static */ size_t wxDisplay::GetCount()
138 {
139 return Factory().GetCount();
140 }
141
142 /* static */ int wxDisplay::GetFromPoint(const wxPoint& pt)
143 {
144 return Factory().GetFromPoint(pt);
145 }
146
147 /* static */ int wxDisplay::GetFromWindow(wxWindow *window)
148 {
149 wxCHECK_MSG( window, wxNOT_FOUND, _T("invalid window") );
150
151 return Factory().GetFromWindow(window);
152 }
153
154 // ----------------------------------------------------------------------------
155 // functions forwarded to wxDisplayImpl
156 // ----------------------------------------------------------------------------
157
158 wxRect wxDisplay::GetGeometry() const
159 {
160 wxCHECK_MSG( IsOk(), wxRect(), _T("invalid wxDisplay object") );
161
162 return m_impl->GetGeometry();
163 }
164
165 wxString wxDisplay::GetName() const
166 {
167 wxCHECK_MSG( IsOk(), wxString(), _T("invalid wxDisplay object") );
168
169 return m_impl->GetName();
170 }
171
172 bool wxDisplay::IsPrimary() const
173 {
174 return m_impl && m_impl->GetIndex() == 0;
175 }
176
177 #if wxUSE_DISPLAY
178
179 wxArrayVideoModes wxDisplay::GetModes(const wxVideoMode& mode) const
180 {
181 wxCHECK_MSG( IsOk(), wxArrayVideoModes(), _T("invalid wxDisplay object") );
182
183 return m_impl->GetModes(mode);
184 }
185
186 wxVideoMode wxDisplay::GetCurrentMode() const
187 {
188 wxCHECK_MSG( IsOk(), wxVideoMode(), _T("invalid wxDisplay object") );
189
190 return m_impl->GetCurrentMode();
191 }
192
193 bool wxDisplay::ChangeMode(const wxVideoMode& mode)
194 {
195 wxCHECK_MSG( IsOk(), false, _T("invalid wxDisplay object") );
196
197 return m_impl->ChangeMode(mode);
198 }
199
200 #endif // wxUSE_DIRECTDRAW
201
202 // ----------------------------------------------------------------------------
203 // static functions implementation
204 // ----------------------------------------------------------------------------
205
206 // if wxUSE_DISPLAY == 1 this is implemented in port-specific code
207 #if !wxUSE_DISPLAY
208
209 /* static */ wxDisplayFactory *wxDisplay::CreateFactory()
210 {
211 return new wxDisplayFactorySingle;
212 }
213
214 #endif // !wxUSE_DISPLAY
215
216 /* static */ wxDisplayFactory& wxDisplay::Factory()
217 {
218 if ( !gs_factory )
219 {
220 gs_factory = CreateFactory();
221 }
222
223 return *gs_factory;
224 }
225
226 // ============================================================================
227 // wxDisplayFactory implementation
228 // ============================================================================
229
230 int wxDisplayFactory::GetFromWindow(wxWindow *window)
231 {
232 // consider that the window belongs to the display containing its centre
233 const wxRect r(window->GetRect());
234 return GetFromPoint(wxPoint(r.x + r.width/2, r.y + r.height/2));
235 }
236
237 // ============================================================================
238 // wxDisplayFactorySingle implementation
239 // ============================================================================
240
241 /* static */
242 wxDisplayImpl *wxDisplayFactorySingle::CreateDisplay(size_t n)
243 {
244 // we recognize the main display only
245 return n != 0 ? NULL : new wxDisplayImplSingle;
246 }
247
248 int wxDisplayFactorySingle::GetFromPoint(const wxPoint& pt)
249 {
250 if ( pt.x >= 0 && pt.y >= 0 )
251 {
252 int w, h;
253 wxDisplaySize(&w, &h);
254
255 if ( pt.x < w && pt.y < h )
256 return 0;
257 }
258
259 // the point is outside of the screen
260 return wxNOT_FOUND;
261 }
262