Create primary monitor when using wxDisplay default ctor
Previously, the first monitor was created instead and while it was often also the primary one, this wasn't always the case. In particular, this makes wxGetDisplayPPI() always return something reasonable instead of returning (0, 0) when the first monitor is not the primary one, as expected by plenty of code, including our own printing sample, which divides by the values returned from wxGetDisplayPPI() without checking if they're zero.
This commit is contained in:
@@ -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
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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" );
|
||||
|
Reference in New Issue
Block a user