add a GetFromWindow implementation to wxDisplayFactory
on displays with different resolutions we must make sure we pick one that matches the frame’s contentScale
This commit is contained in:
committed by
Vadim Zeitlin
parent
16ff1f8f7c
commit
d5180d3604
@@ -29,6 +29,7 @@
|
|||||||
#include "wx/log.h"
|
#include "wx/log.h"
|
||||||
#include "wx/string.h"
|
#include "wx/string.h"
|
||||||
#include "wx/gdicmn.h"
|
#include "wx/gdicmn.h"
|
||||||
|
#include "wx/nonownedwnd.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "wx/osx/private.h"
|
#include "wx/osx/private.h"
|
||||||
@@ -126,6 +127,7 @@ public:
|
|||||||
virtual wxDisplayImpl *CreateDisplay(unsigned n) wxOVERRIDE;
|
virtual wxDisplayImpl *CreateDisplay(unsigned n) wxOVERRIDE;
|
||||||
virtual unsigned GetCount() wxOVERRIDE;
|
virtual unsigned GetCount() wxOVERRIDE;
|
||||||
virtual int GetFromPoint(const wxPoint& pt) wxOVERRIDE;
|
virtual int GetFromPoint(const wxPoint& pt) wxOVERRIDE;
|
||||||
|
virtual int GetFromWindow(const wxWindow *window) wxOVERRIDE;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
wxDECLARE_NO_COPY_CLASS(wxDisplayFactoryMacOSX);
|
wxDECLARE_NO_COPY_CLASS(wxDisplayFactoryMacOSX);
|
||||||
@@ -178,29 +180,14 @@ static CGDisplayErr wxOSXGetDisplayList(CGDisplayCount maxDisplays,
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned wxDisplayFactoryMacOSX::GetCount()
|
static int wxOSXGetDisplayFromID( CGDirectDisplayID theID )
|
||||||
{
|
{
|
||||||
CGDisplayCount count;
|
|
||||||
CGDisplayErr err = wxOSXGetDisplayList(0, NULL, &count);
|
|
||||||
|
|
||||||
wxCHECK_MSG( err == CGDisplayNoErr, 0, "wxOSXGetDisplayList() failed" );
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
int wxDisplayFactoryMacOSX::GetFromPoint(const wxPoint& p)
|
|
||||||
{
|
|
||||||
CGPoint thePoint = {(float)p.x, (float)p.y};
|
|
||||||
CGDirectDisplayID theID;
|
|
||||||
CGDisplayCount theCount;
|
|
||||||
CGDisplayErr err = CGGetDisplaysWithPoint(thePoint, 1, &theID, &theCount);
|
|
||||||
wxASSERT(err == CGDisplayNoErr);
|
|
||||||
|
|
||||||
int nWhich = wxNOT_FOUND;
|
int nWhich = wxNOT_FOUND;
|
||||||
|
CGDisplayCount theCount;
|
||||||
|
CGDisplayErr err = wxOSXGetDisplayList(0, NULL, &theCount);
|
||||||
|
|
||||||
if (theCount)
|
if (err == CGDisplayNoErr && theCount > 0 )
|
||||||
{
|
{
|
||||||
theCount = GetCount();
|
|
||||||
CGDirectDisplayID* theIDs = new CGDirectDisplayID[theCount];
|
CGDirectDisplayID* theIDs = new CGDirectDisplayID[theCount];
|
||||||
err = wxOSXGetDisplayList(theCount, theIDs, &theCount);
|
err = wxOSXGetDisplayList(theCount, theIDs, &theCount);
|
||||||
wxASSERT(err == CGDisplayNoErr);
|
wxASSERT(err == CGDisplayNoErr);
|
||||||
@@ -223,6 +210,64 @@ int wxDisplayFactoryMacOSX::GetFromPoint(const wxPoint& p)
|
|||||||
return nWhich;
|
return nWhich;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned wxDisplayFactoryMacOSX::GetCount()
|
||||||
|
{
|
||||||
|
CGDisplayCount count;
|
||||||
|
CGDisplayErr err = wxOSXGetDisplayList(0, NULL, &count);
|
||||||
|
|
||||||
|
wxCHECK_MSG( err == CGDisplayNoErr, 0, "wxOSXGetDisplayList() failed" );
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxDisplayFactoryMacOSX::GetFromPoint(const wxPoint& p)
|
||||||
|
{
|
||||||
|
CGPoint thePoint = {(float)p.x, (float)p.y};
|
||||||
|
CGDirectDisplayID theID;
|
||||||
|
CGDisplayCount theCount;
|
||||||
|
CGDisplayErr err = CGGetDisplaysWithPoint(thePoint, 1, &theID, &theCount);
|
||||||
|
wxASSERT(err == CGDisplayNoErr);
|
||||||
|
|
||||||
|
if (theCount)
|
||||||
|
return wxOSXGetDisplayFromID(theID);
|
||||||
|
|
||||||
|
return wxNOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxDisplayFactoryMacOSX::GetFromWindow(const wxWindow *window)
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( window, wxNOT_FOUND, "window can't be NULL" );
|
||||||
|
|
||||||
|
wxNonOwnedWindow* const tlw = window->MacGetTopLevelWindow();
|
||||||
|
int x,y,w,h;
|
||||||
|
|
||||||
|
tlw->GetPosition(&x, &y);
|
||||||
|
tlw->GetSize(&w, &h);
|
||||||
|
|
||||||
|
CGRect r = CGRectMake(x, y, w, h);
|
||||||
|
CGDisplayCount theCount;
|
||||||
|
CGDisplayErr err = CGGetDisplaysWithRect(r, 0, NULL, &theCount);
|
||||||
|
wxASSERT(err == CGDisplayNoErr);
|
||||||
|
|
||||||
|
wxScopedArray<CGDirectDisplayID> theIDs(theCount);
|
||||||
|
err = CGGetDisplaysWithRect(r, theCount, theIDs.get(), &theCount);
|
||||||
|
wxASSERT(err == CGDisplayNoErr);
|
||||||
|
|
||||||
|
for ( int i = 0 ; i < theCount; ++i )
|
||||||
|
{
|
||||||
|
// find a screen intersecting having the same contentScale as the window itself
|
||||||
|
wxCFRef<CGDisplayModeRef> mode = CGDisplayCopyDisplayMode(theIDs[i]);
|
||||||
|
size_t width = CGDisplayModeGetWidth(mode);
|
||||||
|
size_t pixelsw = CGDisplayModeGetPixelWidth(mode);
|
||||||
|
if ( fabs( (double)pixelsw / width - tlw->GetContentScaleFactor() ) < 0.01 )
|
||||||
|
{
|
||||||
|
return wxOSXGetDisplayFromID(theIDs[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxNOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
wxDisplayImpl *wxDisplayFactoryMacOSX::CreateDisplay(unsigned n)
|
wxDisplayImpl *wxDisplayFactoryMacOSX::CreateDisplay(unsigned n)
|
||||||
{
|
{
|
||||||
CGDisplayCount theCount = GetCount();
|
CGDisplayCount theCount = GetCount();
|
||||||
|
Reference in New Issue
Block a user