Merge branch 'primary-display'
Handle the situation when primary display is not the first one. See https://github.com/wxWidgets/wxWidgets/pull/1641
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
|
||||
|
@@ -327,9 +327,7 @@ void MyFrame::PopuplateWithDisplayInfo()
|
||||
page->SetSizer(sizerTop);
|
||||
page->Layout();
|
||||
|
||||
m_book->AddPage(page,
|
||||
wxString::Format("Display %lu",
|
||||
(unsigned long)nDpy));
|
||||
m_book->AddPage(page, wxString::Format("Display %zu", nDpy + 1));
|
||||
}
|
||||
|
||||
SetClientSize(m_book->GetBestSize());
|
||||
|
@@ -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();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -159,7 +165,7 @@ wxString wxDisplay::GetName() const
|
||||
|
||||
bool wxDisplay::IsPrimary() const
|
||||
{
|
||||
return m_impl && m_impl->GetIndex() == 0;
|
||||
return m_impl && m_impl->IsPrimary();
|
||||
}
|
||||
|
||||
#if wxUSE_DISPLAY
|
||||
@@ -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" );
|
||||
|
@@ -111,9 +111,14 @@ namespace
|
||||
// Simple struct storing the information needed by wxDisplayMSW.
|
||||
struct wxDisplayInfo
|
||||
{
|
||||
wxDisplayInfo(HMONITOR hmon_, int depth_) : hmon(hmon_), depth(depth_) {}
|
||||
wxDisplayInfo(HMONITOR hmon_,
|
||||
const MONITORINFOEX& monInfo_,
|
||||
int depth_)
|
||||
: hmon(hmon_), monInfo(monInfo_), depth(depth_)
|
||||
{}
|
||||
|
||||
HMONITOR hmon;
|
||||
MONITORINFOEX monInfo;
|
||||
int depth;
|
||||
};
|
||||
|
||||
@@ -157,10 +162,6 @@ protected:
|
||||
dm.dmDisplayFrequency > 1 ? dm.dmDisplayFrequency : 0);
|
||||
}
|
||||
|
||||
// Call GetMonitorInfo() and fill in the provided struct and return true if
|
||||
// it succeeded, otherwise return false.
|
||||
bool GetMonInfo(MONITORINFOEX& monInfo) const;
|
||||
|
||||
wxDisplayInfo m_info;
|
||||
|
||||
private:
|
||||
@@ -298,37 +299,14 @@ wxDisplayFactoryMSW::GetDpiForMonitorData
|
||||
// wxDisplayMSW implementation
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
bool wxDisplayMSW::GetMonInfo(MONITORINFOEX& monInfo) const
|
||||
{
|
||||
if ( !::GetMonitorInfo(m_info.hmon, &monInfo) )
|
||||
{
|
||||
wxLogLastError(wxT("GetMonitorInfo"));
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
wxRect wxDisplayMSW::GetGeometry() const
|
||||
{
|
||||
WinStruct<MONITORINFOEX> monInfo;
|
||||
|
||||
wxRect rect;
|
||||
if ( GetMonInfo(monInfo) )
|
||||
wxCopyRECTToRect(monInfo.rcMonitor, rect);
|
||||
|
||||
return rect;
|
||||
return wxRectFromRECT(m_info.monInfo.rcMonitor);
|
||||
}
|
||||
|
||||
wxRect wxDisplayMSW::GetClientArea() const
|
||||
{
|
||||
WinStruct<MONITORINFOEX> monInfo;
|
||||
|
||||
wxRect rectClient;
|
||||
if ( GetMonInfo(monInfo) )
|
||||
wxCopyRECTToRect(monInfo.rcWork, rectClient);
|
||||
|
||||
return rectClient;
|
||||
return wxRectFromRECT(m_info.monInfo.rcWork);
|
||||
}
|
||||
|
||||
int wxDisplayMSW::GetDepth() const
|
||||
@@ -356,23 +334,12 @@ wxSize wxDisplayMSW::GetPPI() const
|
||||
|
||||
wxString wxDisplayMSW::GetName() const
|
||||
{
|
||||
WinStruct<MONITORINFOEX> monInfo;
|
||||
|
||||
wxString name;
|
||||
if ( GetMonInfo(monInfo) )
|
||||
name = monInfo.szDevice;
|
||||
|
||||
return name;
|
||||
return m_info.monInfo.szDevice;
|
||||
}
|
||||
|
||||
bool wxDisplayMSW::IsPrimary() const
|
||||
{
|
||||
WinStruct<MONITORINFOEX> monInfo;
|
||||
|
||||
if ( !GetMonInfo(monInfo) )
|
||||
return false;
|
||||
|
||||
return (monInfo.dwFlags & MONITORINFOF_PRIMARY) != 0;
|
||||
return (m_info.monInfo.dwFlags & MONITORINFOF_PRIMARY) != 0;
|
||||
}
|
||||
|
||||
wxVideoMode wxDisplayMSW::GetCurrentMode() const
|
||||
@@ -623,7 +590,7 @@ wxDisplayFactoryMSW::MultimonEnumProc(
|
||||
const int hdcDepth = wxGetHDCDepth(hdcMonitor);
|
||||
::DeleteDC(hdcMonitor);
|
||||
|
||||
self->m_displays.push_back(wxDisplayInfo(hMonitor, hdcDepth));
|
||||
self->m_displays.push_back(wxDisplayInfo(hMonitor, monInfo, hdcDepth));
|
||||
|
||||
// continue the enumeration
|
||||
return TRUE;
|
||||
|
Reference in New Issue
Block a user