+wxDisplay::~wxDisplay()
+{
+ delete m_impl;
+}
+
+// ----------------------------------------------------------------------------
+// static functions forwarded to wxDisplayFactory
+// ----------------------------------------------------------------------------
+
+/* static */ size_t wxDisplay::GetCount()
+{
+ return Factory().GetCount();
+}
+
+/* static */ int wxDisplay::GetFromPoint(const wxPoint& pt)
+{
+ return Factory().GetFromPoint(pt);
+}
+
+/* static */ int wxDisplay::GetFromWindow(wxWindow *window)
+{
+ wxCHECK_MSG( window, wxNOT_FOUND, _T("invalid window") );
+
+ return Factory().GetFromWindow(window);
+}
+
+// ----------------------------------------------------------------------------
+// functions forwarded to wxDisplayImpl
+// ----------------------------------------------------------------------------
+
+wxRect wxDisplay::GetGeometry() const
+{
+ wxCHECK_MSG( IsOk(), wxRect(), _T("invalid wxDisplay object") );
+
+ return m_impl->GetGeometry();
+}
+
+wxRect wxDisplay::GetClientArea() const
+{
+ wxCHECK_MSG( IsOk(), wxRect(), _T("invalid wxDisplay object") );
+
+ return m_impl->GetClientArea();
+}
+
+wxString wxDisplay::GetName() const
+{
+ wxCHECK_MSG( IsOk(), wxString(), _T("invalid wxDisplay object") );
+
+ return m_impl->GetName();
+}
+
+bool wxDisplay::IsPrimary() const
+{
+ return m_impl && m_impl->GetIndex() == 0;
+}
+
+#if wxUSE_DISPLAY
+
+wxArrayVideoModes wxDisplay::GetModes(const wxVideoMode& mode) const
+{
+ wxCHECK_MSG( IsOk(), wxArrayVideoModes(), _T("invalid wxDisplay object") );
+
+ return m_impl->GetModes(mode);
+}
+
+wxVideoMode wxDisplay::GetCurrentMode() const
+{
+ wxCHECK_MSG( IsOk(), wxVideoMode(), _T("invalid wxDisplay object") );
+
+ return m_impl->GetCurrentMode();
+}
+
+bool wxDisplay::ChangeMode(const wxVideoMode& mode)
+{
+ wxCHECK_MSG( IsOk(), false, _T("invalid wxDisplay object") );
+
+ return m_impl->ChangeMode(mode);
+}
+
+#endif // wxUSE_DIRECTDRAW
+
+// ----------------------------------------------------------------------------
+// static functions implementation
+// ----------------------------------------------------------------------------
+
+// if wxUSE_DISPLAY == 1 this is implemented in port-specific code
+#if !wxUSE_DISPLAY
+
+/* static */ wxDisplayFactory *wxDisplay::CreateFactory()
+{
+ return new wxDisplayFactorySingle;
+}
+
+#endif // !wxUSE_DISPLAY
+
+/* static */ wxDisplayFactory& wxDisplay::Factory()
+{
+ if ( !gs_factory )
+ {
+ gs_factory = CreateFactory();
+ }
+
+ return *gs_factory;
+}
+
+// ============================================================================
+// wxDisplayFactory implementation
+// ============================================================================
+
+int wxDisplayFactory::GetFromWindow(wxWindow *window)
+{
+ // consider that the window belongs to the display containing its centre
+ const wxRect r(window->GetRect());
+ return GetFromPoint(wxPoint(r.x + r.width/2, r.y + r.height/2));
+}
+
+// ============================================================================
+// wxDisplayFactorySingle implementation
+// ============================================================================
+
+/* static */
+wxDisplayImpl *wxDisplayFactorySingle::CreateDisplay(size_t n)
+{
+ // we recognize the main display only
+ return n != 0 ? NULL : new wxDisplayImplSingle;
+}
+
+int wxDisplayFactorySingle::GetFromPoint(const wxPoint& pt)
+{
+ if ( pt.x >= 0 && pt.y >= 0 )
+ {
+ int w, h;
+ wxDisplaySize(&w, &h);
+
+ if ( pt.x < w && pt.y < h )
+ return 0;
+ }
+
+ // the point is outside of the screen
+ return wxNOT_FOUND;
+}