X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e77138c0e2871600956d3186ce046454a6fbce21..0a470e5ea537237f0562c3b2182ee293dec36eb3:/src/common/dpycmn.cpp diff --git a/src/common/dpycmn.cpp b/src/common/dpycmn.cpp index 6527fc64de..0087b7d09f 100644 --- a/src/common/dpycmn.cpp +++ b/src/common/dpycmn.cpp @@ -1,12 +1,12 @@ /////////////////////////////////////////////////////////////////////////////// // Name: src/common/dpycmn.cpp -// Purpose: wxDisplayBase implementation +// Purpose: wxDisplay and wxDisplayImplSingle implementation // Author: Vadim Zeitlin // Modified by: // Created: 01.03.03 // RCS-ID: $Id$ -// Copyright: (c) 2003 Vadim Zeitlin -// License: wxWindows licence +// Copyright: (c) 2003-2006 Vadim Zeitlin +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -24,43 +24,242 @@ #pragma hdrstop #endif -#if wxUSE_DISPLAY - #ifndef WX_PRECOMP #include "wx/gdicmn.h" #include "wx/window.h" + #include "wx/module.h" #endif //WX_PRECOMP #include "wx/display.h" +#include "wx/display_impl.h" + +#if wxUSE_DISPLAY #include "wx/arrimpl.cpp" WX_DEFINE_OBJARRAY(wxArrayVideoModes) const wxVideoMode wxDefaultVideoMode; +#endif // wxUSE_DISPLAY + +// ---------------------------------------------------------------------------- +// globals +// ---------------------------------------------------------------------------- + +// the factory object used by wxDisplay +// +// created on demand and destroyed by wxDisplayModule +static wxDisplayFactory *gs_factory = NULL; + +// ---------------------------------------------------------------------------- +// wxDisplayImplSingle: trivial implementation working for main display only +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDisplayImplSingle : public wxDisplayImpl +{ +public: + wxDisplayImplSingle() : wxDisplayImpl(0) { } + + virtual wxRect GetGeometry() const + { + wxRect r; + wxDisplaySize(&r.width, &r.height); + return r; + } + + virtual wxRect GetClientArea() const { return wxGetClientDisplayRect(); } + + virtual wxString GetName() const { return wxString(); } + +#if wxUSE_DISPLAY + // no video modes support for us, provide just the stubs + + virtual wxArrayVideoModes GetModes(const wxVideoMode& WXUNUSED(mode)) const + { + return wxArrayVideoModes(); + } + + virtual wxVideoMode GetCurrentMode() const { return wxVideoMode(); } + + virtual bool ChangeMode(const wxVideoMode& WXUNUSED(mode)) { return false; } +#endif // wxUSE_DISPLAY + + + wxDECLARE_NO_COPY_CLASS(wxDisplayImplSingle); +}; + +// ---------------------------------------------------------------------------- +// wxDisplayModule is used to cleanup gs_factory +// ---------------------------------------------------------------------------- + +class wxDisplayModule : public wxModule +{ +public: + virtual bool OnInit() { return true; } + virtual void OnExit() + { + wxDELETE(gs_factory); + } + + DECLARE_DYNAMIC_CLASS(wxDisplayModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxDisplayModule, wxModule) + // ============================================================================ -// implementation +// wxDisplay implementation // ============================================================================ -wxDisplayBase::wxDisplayBase(size_t index) - : m_index (index) +// ---------------------------------------------------------------------------- +// ctor/dtor +// ---------------------------------------------------------------------------- + +wxDisplay::wxDisplay(unsigned n) { - wxASSERT_MSG( m_index < GetCount(), + wxASSERT_MSG( n < GetCount(), wxT("An invalid index was passed to wxDisplay") ); + + m_impl = Factory().CreateDisplay(n); } -// MSW has its own specific implementation of this -#ifndef __WXMSW__ +wxDisplay::~wxDisplay() +{ + delete m_impl; +} + +// ---------------------------------------------------------------------------- +// static functions forwarded to wxDisplayFactory +// ---------------------------------------------------------------------------- -int wxDisplayBase::GetFromWindow(wxWindow *window) +/* static */ unsigned wxDisplay::GetCount() { - wxCHECK_MSG( window, wxNOT_FOUND, _T("NULL window") ); + return Factory().GetCount(); +} - // consider that the window belong to the display containing its centre - const wxRect r(window->GetRect()); - return GetFromPoint(wxPoint(r.x + r.width/2, r.y + r.height/2)); +/* static */ int wxDisplay::GetFromPoint(const wxPoint& pt) +{ + return Factory().GetFromPoint(pt); +} + +/* static */ int wxDisplay::GetFromWindow(const wxWindow *window) +{ + wxCHECK_MSG( window, wxNOT_FOUND, wxT("invalid window") ); + + return Factory().GetFromWindow(window); +} + +// ---------------------------------------------------------------------------- +// functions forwarded to wxDisplayImpl +// ---------------------------------------------------------------------------- + +wxRect wxDisplay::GetGeometry() const +{ + wxCHECK_MSG( IsOk(), wxRect(), wxT("invalid wxDisplay object") ); + + return m_impl->GetGeometry(); +} + +wxRect wxDisplay::GetClientArea() const +{ + wxCHECK_MSG( IsOk(), wxRect(), wxT("invalid wxDisplay object") ); + + return m_impl->GetClientArea(); +} + +wxString wxDisplay::GetName() const +{ + wxCHECK_MSG( IsOk(), wxString(), wxT("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(), wxT("invalid wxDisplay object") ); + + return m_impl->GetModes(mode); +} + +wxVideoMode wxDisplay::GetCurrentMode() const +{ + wxCHECK_MSG( IsOk(), wxVideoMode(), wxT("invalid wxDisplay object") ); + + return m_impl->GetCurrentMode(); } -#endif // !__WXMSW__ +bool wxDisplay::ChangeMode(const wxVideoMode& mode) +{ + wxCHECK_MSG( IsOk(), false, wxT("invalid wxDisplay object") ); + + return m_impl->ChangeMode(mode); +} #endif // wxUSE_DISPLAY + +// ---------------------------------------------------------------------------- +// 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(const wxWindow *window) +{ + // consider that the window belongs to the display containing its centre + const wxRect r(window->GetScreenRect()); + return GetFromPoint(wxPoint(r.x + r.width/2, r.y + r.height/2)); +} + +// ============================================================================ +// wxDisplayFactorySingle implementation +// ============================================================================ + +/* static */ +wxDisplayImpl *wxDisplayFactorySingle::CreateDisplay(unsigned 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; +}