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