diff --git a/include/wx/display.h b/include/wx/display.h index f05c0c8451..b9fec42aba 100644 --- a/include/wx/display.h +++ b/include/wx/display.h @@ -42,12 +42,14 @@ class WXDLLIMPEXP_FWD_CORE wxDisplayImpl; class WXDLLIMPEXP_CORE wxDisplay { public: + // default ctor creates the object corresponding to the primary display + wxDisplay(); + // initialize the object containing all information about the given // display // - // the displays are numbered from 0 to GetCount() - 1, 0 is always the - // primary display and the only one which is always supported - wxDisplay(unsigned n = 0); + // the displays are numbered from 0 to GetCount() - 1 + explicit wxDisplay(unsigned n); // create display object corresponding to the display of the given window // or the default one if the window display couldn't be found diff --git a/include/wx/private/display.h b/include/wx/private/display.h index e7358f6e18..36f5985fbb 100644 --- a/include/wx/private/display.h +++ b/include/wx/private/display.h @@ -37,6 +37,9 @@ public: return m_impls[n]; } + // Return the primary display object, creating it if necessary. + wxDisplayImpl* GetPrimaryDisplay(); + // get the total number of displays virtual unsigned GetCount() = 0; diff --git a/interface/wx/display.h b/interface/wx/display.h index 3c4e28f4bb..2085ff15db 100644 --- a/interface/wx/display.h +++ b/interface/wx/display.h @@ -16,6 +16,12 @@ class wxDisplay { public: + /** + Default constructor creating wxDisplay object representing the primary + display. + */ + wxDisplay(); + /** Constructor, setting up a wxDisplay instance with the specified display. @@ -24,7 +30,7 @@ public: The index of the display to use. This must be non-negative and lower than the value returned by GetCount(). */ - wxDisplay(unsigned int index = 0); + explicit wxDisplay(unsigned int index); /** Constructor creating the display object associated with the given diff --git a/src/common/dpycmn.cpp b/src/common/dpycmn.cpp index 24e77f237f..4f0d537ef1 100644 --- a/src/common/dpycmn.cpp +++ b/src/common/dpycmn.cpp @@ -77,6 +77,11 @@ wxIMPLEMENT_DYNAMIC_CLASS(wxDisplayModule, wxModule); // ctor/dtor // ---------------------------------------------------------------------------- +wxDisplay::wxDisplay() +{ + m_impl = Factory().GetPrimaryDisplay(); +} + wxDisplay::wxDisplay(unsigned n) { wxASSERT_MSG( n == 0 || n < GetCount(), @@ -89,7 +94,8 @@ wxDisplay::wxDisplay(const wxWindow* window) { const int n = GetFromWindow(window); - m_impl = Factory().GetDisplay(n != wxNOT_FOUND ? n : 0); + m_impl = n != wxNOT_FOUND ? Factory().GetDisplay(n) + : Factory().GetPrimaryDisplay(); } // ---------------------------------------------------------------------------- @@ -245,6 +251,24 @@ void wxDisplayFactory::ClearImpls() m_impls.clear(); } +wxDisplayImpl* wxDisplayFactory::GetPrimaryDisplay() +{ + // Just use dumb linear search -- there seems to be the most reliable way + // to do this in general. In particular, primary monitor is not guaranteed + // to be the first one and it's not obvious if it always contains (0, 0). + const unsigned count = GetCount(); + for ( unsigned n = 0; n < count; ++n ) + { + wxDisplayImpl* const d = GetDisplay(n); + if ( d && d->IsPrimary() ) + return d; + } + + // This is not supposed to happen, but what else can we do if it + // somehow does? + return NULL; +} + int wxDisplayFactory::GetFromWindow(const wxWindow *window) { wxCHECK_MSG( window, wxNOT_FOUND, "window can't be NULL" );