Add wxDisplay::GetPPI() to use instead of wxGetDisplayPPI()
While this is not done for all the ports yet, the new API allows returning different PPI values for different monitors, unlike the old (and still existing, but implemented in terms of the new one) global function.
This commit is contained in:
@@ -127,6 +127,7 @@ All (GUI):
|
|||||||
- Allow binding to events generated by their items in submenus too.
|
- Allow binding to events generated by their items in submenus too.
|
||||||
- Add wxGrid::SetCornerLabelValue() (Pavel Kalugin).
|
- Add wxGrid::SetCornerLabelValue() (Pavel Kalugin).
|
||||||
- Add strikethrough support for fonts defined in XRC.
|
- Add strikethrough support for fonts defined in XRC.
|
||||||
|
- Add wxDisplay::GetPPI().
|
||||||
|
|
||||||
wxGTK:
|
wxGTK:
|
||||||
|
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#define _WX_DISPLAY_H_BASE_
|
#define _WX_DISPLAY_H_BASE_
|
||||||
|
|
||||||
#include "wx/defs.h"
|
#include "wx/defs.h"
|
||||||
|
#include "wx/gdicmn.h" // wxSize
|
||||||
|
|
||||||
// NB: no #if wxUSE_DISPLAY here, the display geometry part of this class (but
|
// NB: no #if wxUSE_DISPLAY here, the display geometry part of this class (but
|
||||||
// not the video mode stuff) is always available but if wxUSE_DISPLAY == 0
|
// not the video mode stuff) is always available but if wxUSE_DISPLAY == 0
|
||||||
@@ -77,6 +78,9 @@ public:
|
|||||||
// get the depth, i.e. number of bits per pixel (0 if unknown)
|
// get the depth, i.e. number of bits per pixel (0 if unknown)
|
||||||
int GetDepth() const;
|
int GetDepth() const;
|
||||||
|
|
||||||
|
// get the resolution of this monitor in pixels per inch
|
||||||
|
wxSize GetPPI() const;
|
||||||
|
|
||||||
// name may be empty
|
// name may be empty
|
||||||
wxString GetName() const;
|
wxString GetName() const;
|
||||||
|
|
||||||
|
@@ -1080,6 +1080,9 @@ extern WXDLLIMPEXP_DATA_CORE(const wxPoint) wxDefaultPosition;
|
|||||||
extern void WXDLLIMPEXP_CORE wxInitializeStockLists();
|
extern void WXDLLIMPEXP_CORE wxInitializeStockLists();
|
||||||
extern void WXDLLIMPEXP_CORE wxDeleteStockLists();
|
extern void WXDLLIMPEXP_CORE wxDeleteStockLists();
|
||||||
|
|
||||||
|
// Note: all the display-related functions here exist for compatibility only,
|
||||||
|
// please use wxDisplay class in the new code
|
||||||
|
|
||||||
// is the display colour (or monochrome)?
|
// is the display colour (or monochrome)?
|
||||||
extern bool WXDLLIMPEXP_CORE wxColourDisplay();
|
extern bool WXDLLIMPEXP_CORE wxColourDisplay();
|
||||||
|
|
||||||
|
@@ -81,6 +81,15 @@ public:
|
|||||||
// return the depth or 0 if unknown
|
// return the depth or 0 if unknown
|
||||||
virtual int GetDepth() const = 0;
|
virtual int GetDepth() const = 0;
|
||||||
|
|
||||||
|
// return the resolution of the display, uses GetSizeMM() by default but
|
||||||
|
// can be also overridden directly
|
||||||
|
virtual wxSize GetPPI() const;
|
||||||
|
|
||||||
|
// return the physical size of the display or (0, 0) if unknown: this is
|
||||||
|
// only used by GetPPI() implementation in the base class, so if GetPPI()
|
||||||
|
// is overridden, this one doesn't have to be implemented
|
||||||
|
virtual wxSize GetSizeMM() const { return wxSize(0, 0); }
|
||||||
|
|
||||||
// return the name (may be empty)
|
// return the name (may be empty)
|
||||||
virtual wxString GetName() const { return wxString(); }
|
virtual wxString GetName() const { return wxString(); }
|
||||||
|
|
||||||
|
@@ -12,8 +12,6 @@
|
|||||||
|
|
||||||
@library{wxcore}
|
@library{wxcore}
|
||||||
@category{cfg}
|
@category{cfg}
|
||||||
|
|
||||||
@see wxClientDisplayRect(), wxDisplaySize(), wxDisplaySizeMM()
|
|
||||||
*/
|
*/
|
||||||
class wxDisplay
|
class wxDisplay
|
||||||
{
|
{
|
||||||
@@ -109,6 +107,19 @@ public:
|
|||||||
*/
|
*/
|
||||||
wxString GetName() const;
|
wxString GetName() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns display resolution in pixels per inch.
|
||||||
|
|
||||||
|
Horizontal and vertical resolution are returned in @c x and @c y
|
||||||
|
components of the wxSize object respectively.
|
||||||
|
|
||||||
|
If the resolution information is not available, returns @code wxSize(0,
|
||||||
|
0) @endcode.
|
||||||
|
|
||||||
|
@since 3.1.2
|
||||||
|
*/
|
||||||
|
wxSize GetPPI() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns @true if the display is the primary display. The primary
|
Returns @true if the display is the primary display. The primary
|
||||||
display is the one whose index is 0.
|
display is the one whose index is 0.
|
||||||
|
@@ -1256,6 +1256,10 @@ wxRect wxGetClientDisplayRect();
|
|||||||
The @c x component of the returned wxSize object contains the horizontal
|
The @c x component of the returned wxSize object contains the horizontal
|
||||||
resolution and the @c y one -- the vertical resolution.
|
resolution and the @c y one -- the vertical resolution.
|
||||||
|
|
||||||
|
@note Use of this function is not recommended in the new code as it only
|
||||||
|
works for the primary display. Use wxDisplay::GetPPI() to retrieve
|
||||||
|
the resolution of the appropriate display instead.
|
||||||
|
|
||||||
@header{wx/gdicmn.h}
|
@header{wx/gdicmn.h}
|
||||||
|
|
||||||
@see wxDisplay
|
@see wxDisplay
|
||||||
|
@@ -15,8 +15,6 @@
|
|||||||
|
|
||||||
@stdobjects
|
@stdobjects
|
||||||
::wxDefaultVideoMode
|
::wxDefaultVideoMode
|
||||||
|
|
||||||
@see wxClientDisplayRect(), wxDisplaySize(), wxDisplaySizeMM()
|
|
||||||
*/
|
*/
|
||||||
struct wxVideoMode
|
struct wxVideoMode
|
||||||
{
|
{
|
||||||
|
@@ -275,6 +275,11 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size,
|
|||||||
rc.x, rc.y, rc.width, rc.height)
|
rc.x, rc.y, rc.width, rc.height)
|
||||||
));
|
));
|
||||||
|
|
||||||
|
sizer->Add(new wxStaticText(page, wxID_ANY, "Resolution: "));
|
||||||
|
const wxSize ppi = display.GetPPI();
|
||||||
|
sizer->Add(new wxStaticText(page, wxID_ANY,
|
||||||
|
wxString::Format("%d*%d", ppi.x, ppi.y)));
|
||||||
|
|
||||||
sizer->Add(new wxStaticText(page, wxID_ANY, "Depth: "));
|
sizer->Add(new wxStaticText(page, wxID_ANY, "Depth: "));
|
||||||
sizer->Add(new wxStaticText(page, wxID_ANY,
|
sizer->Add(new wxStaticText(page, wxID_ANY,
|
||||||
wxString::Format("%d", display.GetDepth())));
|
wxString::Format("%d", display.GetDepth())));
|
||||||
|
@@ -29,6 +29,8 @@
|
|||||||
#include "wx/module.h"
|
#include "wx/module.h"
|
||||||
#endif //WX_PRECOMP
|
#endif //WX_PRECOMP
|
||||||
|
|
||||||
|
#include "wx/math.h"
|
||||||
|
|
||||||
#include "wx/private/display.h"
|
#include "wx/private/display.h"
|
||||||
|
|
||||||
#if wxUSE_DISPLAY
|
#if wxUSE_DISPLAY
|
||||||
@@ -122,6 +124,13 @@ wxRect wxDisplay::GetClientArea() const
|
|||||||
return m_impl->GetClientArea();
|
return m_impl->GetClientArea();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxSize wxDisplay::GetPPI() const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( IsOk(), wxSize(), wxT("invalid wxDisplay object") );
|
||||||
|
|
||||||
|
return m_impl->GetPPI();
|
||||||
|
}
|
||||||
|
|
||||||
int wxDisplay::GetDepth() const
|
int wxDisplay::GetDepth() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( IsOk(), 0, wxT("invalid wxDisplay object") );
|
wxCHECK_MSG( IsOk(), 0, wxT("invalid wxDisplay object") );
|
||||||
@@ -180,6 +189,26 @@ bool wxDisplay::ChangeMode(const wxVideoMode& mode)
|
|||||||
return *gs_factory;
|
return *gs_factory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// wxDisplayImpl implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
wxSize wxDisplayImpl::GetPPI() const
|
||||||
|
{
|
||||||
|
const wxSize pixels = GetGeometry().GetSize();
|
||||||
|
const wxSize mm = GetSizeMM();
|
||||||
|
|
||||||
|
if ( !mm.x || !mm.y )
|
||||||
|
{
|
||||||
|
// Physical size is unknown, return a special value indicating that we
|
||||||
|
// can't compute the resolution -- what else can we do?
|
||||||
|
return wxSize(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxSize(wxRound((pixels.x * inches2mm) / mm.x),
|
||||||
|
wxRound((pixels.y * inches2mm) / mm.y));
|
||||||
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// wxDisplayFactory implementation
|
// wxDisplayFactory implementation
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
@@ -889,20 +889,29 @@ wxRect wxGetClientDisplayRect()
|
|||||||
return wxDisplay().GetClientArea();
|
return wxDisplay().GetClientArea();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxDisplaySizeMM(int *width, int *height)
|
||||||
|
{
|
||||||
|
const wxSize size = wxGetDisplaySizeMM();
|
||||||
|
if ( width )
|
||||||
|
*width = size.x;
|
||||||
|
if ( height )
|
||||||
|
*height = size.y;
|
||||||
|
}
|
||||||
|
|
||||||
wxSize wxGetDisplaySizeMM()
|
wxSize wxGetDisplaySizeMM()
|
||||||
{
|
{
|
||||||
int x, y;
|
const wxSize ppi = wxGetDisplayPPI();
|
||||||
wxDisplaySizeMM(& x, & y);
|
if ( !ppi.x || !ppi.y )
|
||||||
return wxSize(x, y);
|
return wxSize(0, 0);
|
||||||
|
|
||||||
|
const wxSize pixels = wxGetDisplaySize();
|
||||||
|
return wxSize(wxRound(pixels.x * inches2mm / ppi.x),
|
||||||
|
wxRound(pixels.y * inches2mm / ppi.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
wxSize wxGetDisplayPPI()
|
wxSize wxGetDisplayPPI()
|
||||||
{
|
{
|
||||||
const wxSize pixels = wxGetDisplaySize();
|
return wxDisplay().GetPPI();
|
||||||
const wxSize mm = wxGetDisplaySizeMM();
|
|
||||||
|
|
||||||
return wxSize((int)((pixels.x * inches2mm) / mm.x),
|
|
||||||
(int)((pixels.y * inches2mm) / mm.y));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wxResourceCache::~wxResourceCache ()
|
wxResourceCache::~wxResourceCache ()
|
||||||
|
@@ -73,6 +73,13 @@ public:
|
|||||||
{
|
{
|
||||||
return wxTheApp->GetDisplayMode().bpp;
|
return wxTheApp->GetDisplayMode().bpp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual wxSize GetPPI() const wxOVERRIDE
|
||||||
|
{
|
||||||
|
// FIXME: there's no way to get physical resolution using the DirectDB
|
||||||
|
// API, we hardcode a commonly used value of 72dpi
|
||||||
|
return wxSize(72, 72);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class wxDisplayFactorySingleDFB : public wxDisplayFactorySingle
|
class wxDisplayFactorySingleDFB : public wxDisplayFactorySingle
|
||||||
@@ -89,21 +96,6 @@ wxDisplayFactory* wxDisplay::CreateFactory()
|
|||||||
return new wxDisplayFactorySingleDFB;
|
return new wxDisplayFactorySingleDFB;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxDisplaySizeMM(int *width, int *height)
|
|
||||||
{
|
|
||||||
// FIXME: there's no way to get physical resolution using the DirectDB
|
|
||||||
// API, we hardcode a commonly used value of 72dpi
|
|
||||||
#define DPI 72.0
|
|
||||||
#define PX_TO_MM(x) (int(((x) / DPI) * inches2mm))
|
|
||||||
|
|
||||||
wxDisplaySize(width, height);
|
|
||||||
if ( width ) *width = PX_TO_MM(*width);
|
|
||||||
if ( height ) *height = PX_TO_MM(*height);
|
|
||||||
|
|
||||||
#undef DPI
|
|
||||||
#undef PX_TO_MM
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// mouse
|
// mouse
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@@ -46,6 +46,7 @@ public:
|
|||||||
virtual wxRect GetGeometry() const wxOVERRIDE;
|
virtual wxRect GetGeometry() const wxOVERRIDE;
|
||||||
virtual wxRect GetClientArea() const wxOVERRIDE;
|
virtual wxRect GetClientArea() const wxOVERRIDE;
|
||||||
virtual int GetDepth() const wxOVERRIDE;
|
virtual int GetDepth() const wxOVERRIDE;
|
||||||
|
virtual wxSize GetSizeMM() const wxOVERRIDE;
|
||||||
|
|
||||||
#if wxUSE_DISPLAY
|
#if wxUSE_DISPLAY
|
||||||
virtual bool IsPrimary() const wxOVERRIDE;
|
virtual bool IsPrimary() const wxOVERRIDE;
|
||||||
@@ -120,6 +121,15 @@ int wxDisplayImplGTK::GetDepth() const
|
|||||||
return 24;
|
return 24;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxSize wxDisplayImplGTK::GetSizeMM() const
|
||||||
|
{
|
||||||
|
return wxSize
|
||||||
|
(
|
||||||
|
gdk_monitor_get_width_mm(m_monitor),
|
||||||
|
gdk_monitor_get_height_mm(m_monitor)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#if wxUSE_DISPLAY
|
#if wxUSE_DISPLAY
|
||||||
bool wxDisplayImplGTK::IsPrimary() const
|
bool wxDisplayImplGTK::IsPrimary() const
|
||||||
{
|
{
|
||||||
@@ -212,6 +222,7 @@ public:
|
|||||||
virtual wxRect GetGeometry() const wxOVERRIDE;
|
virtual wxRect GetGeometry() const wxOVERRIDE;
|
||||||
virtual wxRect GetClientArea() const wxOVERRIDE;
|
virtual wxRect GetClientArea() const wxOVERRIDE;
|
||||||
virtual int GetDepth() const wxOVERRIDE;
|
virtual int GetDepth() const wxOVERRIDE;
|
||||||
|
virtual wxSize GetSizeMM() const wxOVERRIDE;
|
||||||
|
|
||||||
#if wxUSE_DISPLAY
|
#if wxUSE_DISPLAY
|
||||||
virtual bool IsPrimary() const wxOVERRIDE;
|
virtual bool IsPrimary() const wxOVERRIDE;
|
||||||
@@ -282,6 +293,34 @@ int wxDisplayImplGTK::GetDepth() const
|
|||||||
return gdk_visual_get_depth(gdk_window_get_visual(wxGetTopLevelGDK()));
|
return gdk_visual_get_depth(gdk_window_get_visual(wxGetTopLevelGDK()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxSize wxDisplayImplGTK::GetSizeMM() const
|
||||||
|
{
|
||||||
|
// At least in some configurations, gdk_screen_xxx_mm() functions return
|
||||||
|
// valid values when gdk_screen_get_monitor_xxx_mm() only return -1, so
|
||||||
|
// handle this case specially.
|
||||||
|
if ( IsPrimary() )
|
||||||
|
{
|
||||||
|
return wxSize(gdk_screen_width_mm(), gdk_screen_height_mm());
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize sizeMM;
|
||||||
|
#if GTK_CHECK_VERSION(2,14,0)
|
||||||
|
if ( wx_is_at_least_gtk2(14) )
|
||||||
|
{
|
||||||
|
// Take care not to return (-1, -1) from here, the caller expects us to
|
||||||
|
// return (0, 0) if we can't retrieve this information.
|
||||||
|
int rc = gdk_screen_get_monitor_width_mm(m_screen, m_index);
|
||||||
|
if ( rc != -1 )
|
||||||
|
sizeMM.x = rc;
|
||||||
|
|
||||||
|
rc = gdk_screen_get_monitor_height_mm(m_screen, m_index);
|
||||||
|
if ( rc != -1 )
|
||||||
|
sizeMM.y = rc;
|
||||||
|
}
|
||||||
|
#endif // GTK+ 2.14
|
||||||
|
return sizeMM;
|
||||||
|
}
|
||||||
|
|
||||||
#if wxUSE_DISPLAY
|
#if wxUSE_DISPLAY
|
||||||
bool wxDisplayImplGTK::IsPrimary() const
|
bool wxDisplayImplGTK::IsPrimary() const
|
||||||
{
|
{
|
||||||
|
@@ -76,20 +76,6 @@ void *wxGetDisplay()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void wxDisplaySizeMM( int *width, int *height )
|
|
||||||
{
|
|
||||||
#ifdef __WXGTK4__
|
|
||||||
GdkMonitor* monitor = gdk_display_get_primary_monitor(gdk_display_get_default());
|
|
||||||
if (width) *width = gdk_monitor_get_width_mm(monitor);
|
|
||||||
if (height) *height = gdk_monitor_get_height_mm(monitor);
|
|
||||||
#else
|
|
||||||
wxGCC_WARNING_SUPPRESS(deprecated-declarations)
|
|
||||||
if (width) *width = gdk_screen_width_mm();
|
|
||||||
if (height) *height = gdk_screen_height_mm();
|
|
||||||
wxGCC_WARNING_RESTORE()
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
|
wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
|
||||||
{
|
{
|
||||||
return wxGenericFindWindowAtPoint(pt);
|
return wxGenericFindWindowAtPoint(pt);
|
||||||
|
@@ -86,12 +86,6 @@ void *wxGetDisplay()
|
|||||||
return GDK_DISPLAY();
|
return GDK_DISPLAY();
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxDisplaySizeMM( int *width, int *height )
|
|
||||||
{
|
|
||||||
if (width) *width = gdk_screen_width_mm();
|
|
||||||
if (height) *height = gdk_screen_height_mm();
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxGetMousePosition( int* x, int* y )
|
void wxGetMousePosition( int* x, int* y )
|
||||||
{
|
{
|
||||||
gdk_window_get_pointer( NULL, x, y, NULL );
|
gdk_window_get_pointer( NULL, x, y, NULL );
|
||||||
|
@@ -225,16 +225,6 @@ void wxGetMousePosition( int* x, int* y )
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxDisplaySizeMM(int *width, int *height)
|
|
||||||
{
|
|
||||||
Display *dpy = wxGlobalDisplay();
|
|
||||||
|
|
||||||
if ( width )
|
|
||||||
*width = DisplayWidthMM(dpy, DefaultScreen (dpy));
|
|
||||||
if ( height )
|
|
||||||
*height = DisplayHeightMM(dpy, DefaultScreen (dpy));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configurable display in wxX11 and wxMotif
|
// Configurable display in wxX11 and wxMotif
|
||||||
static WXDisplay *gs_currentDisplay = NULL;
|
static WXDisplay *gs_currentDisplay = NULL;
|
||||||
static wxString gs_displayName;
|
static wxString gs_displayName;
|
||||||
|
@@ -26,9 +26,14 @@
|
|||||||
|
|
||||||
#include "wx/private/display.h"
|
#include "wx/private/display.h"
|
||||||
|
|
||||||
|
#include "wx/dynlib.h"
|
||||||
|
|
||||||
#include "wx/msw/private.h"
|
#include "wx/msw/private.h"
|
||||||
#include "wx/msw/wrapwin.h"
|
#include "wx/msw/wrapwin.h"
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
|
||||||
int wxGetHDCDepth(HDC hdc)
|
int wxGetHDCDepth(HDC hdc)
|
||||||
{
|
{
|
||||||
return ::GetDeviceCaps(hdc, PLANES) * GetDeviceCaps(hdc, BITSPIXEL);
|
return ::GetDeviceCaps(hdc, PLANES) * GetDeviceCaps(hdc, BITSPIXEL);
|
||||||
@@ -62,6 +67,13 @@ public:
|
|||||||
{
|
{
|
||||||
return wxGetHDCDepth(ScreenHDC());
|
return wxGetHDCDepth(ScreenHDC());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual wxSize GetSizeMM() const wxOVERRIDE
|
||||||
|
{
|
||||||
|
ScreenHDC dc;
|
||||||
|
|
||||||
|
return wxSize(::GetDeviceCaps(dc, HORZSIZE), ::GetDeviceCaps(dc, VERTSIZE));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class wxDisplayFactorySingleMSW : public wxDisplayFactorySingle
|
class wxDisplayFactorySingleMSW : public wxDisplayFactorySingle
|
||||||
@@ -73,6 +85,8 @@ protected:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
#if wxUSE_DISPLAY
|
#if wxUSE_DISPLAY
|
||||||
|
|
||||||
#ifndef WX_PRECOMP
|
#ifndef WX_PRECOMP
|
||||||
@@ -87,6 +101,10 @@ protected:
|
|||||||
#include "wx/msw/missing.h"
|
#include "wx/msw/missing.h"
|
||||||
#include "wx/msw/private/hiddenwin.h"
|
#include "wx/msw/private/hiddenwin.h"
|
||||||
|
|
||||||
|
#ifndef DPI_ENUMS_DECLARED
|
||||||
|
#define MDT_EFFECTIVE_DPI 0
|
||||||
|
#endif
|
||||||
|
|
||||||
static const wxChar displayDllName[] = wxT("user32.dll");
|
static const wxChar displayDllName[] = wxT("user32.dll");
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@@ -119,6 +137,8 @@ public:
|
|||||||
virtual wxRect GetGeometry() const wxOVERRIDE;
|
virtual wxRect GetGeometry() const wxOVERRIDE;
|
||||||
virtual wxRect GetClientArea() const wxOVERRIDE;
|
virtual wxRect GetClientArea() const wxOVERRIDE;
|
||||||
virtual int GetDepth() const wxOVERRIDE;
|
virtual int GetDepth() const wxOVERRIDE;
|
||||||
|
virtual wxSize GetPPI() const wxOVERRIDE;
|
||||||
|
|
||||||
virtual wxString GetName() const wxOVERRIDE;
|
virtual wxString GetName() const wxOVERRIDE;
|
||||||
virtual bool IsPrimary() const wxOVERRIDE;
|
virtual bool IsPrimary() const wxOVERRIDE;
|
||||||
|
|
||||||
@@ -176,6 +196,13 @@ public:
|
|||||||
// handles.
|
// handles.
|
||||||
static void RefreshMonitors() { ms_factory->DoRefreshMonitors(); }
|
static void RefreshMonitors() { ms_factory->DoRefreshMonitors(); }
|
||||||
|
|
||||||
|
// Declare the second argument as int to avoid problems with older SDKs not
|
||||||
|
// declaring MONITOR_DPI_TYPE enum.
|
||||||
|
typedef HRESULT (WINAPI *GetDpiForMonitor_t)(HMONITOR, int, UINT*, UINT*);
|
||||||
|
|
||||||
|
// Return the pointer to GetDpiForMonitor() function which may be null if
|
||||||
|
// not running under new enough Windows version.
|
||||||
|
static GetDpiForMonitor_t GetDpiForMonitorPtr();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// EnumDisplayMonitors() callback
|
// EnumDisplayMonitors() callback
|
||||||
@@ -197,6 +224,48 @@ private:
|
|||||||
// variable (also making it of correct type for us) here).
|
// variable (also making it of correct type for us) here).
|
||||||
static wxDisplayFactoryMSW* ms_factory;
|
static wxDisplayFactoryMSW* ms_factory;
|
||||||
|
|
||||||
|
// The pointer to GetDpiForMonitorPtr(), retrieved on demand, and the
|
||||||
|
// related data, including the DLL containing the function that we must
|
||||||
|
// keep loaded.
|
||||||
|
struct GetDpiForMonitorData
|
||||||
|
{
|
||||||
|
GetDpiForMonitorData()
|
||||||
|
{
|
||||||
|
m_pfnGetDpiForMonitor = NULL;
|
||||||
|
m_initialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TryLoad()
|
||||||
|
{
|
||||||
|
if ( !m_dllShcore.Load("shcore.dll", wxDL_VERBATIM | wxDL_QUIET) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
wxDL_INIT_FUNC(m_pfn, GetDpiForMonitor, m_dllShcore);
|
||||||
|
|
||||||
|
if ( !m_pfnGetDpiForMonitor )
|
||||||
|
{
|
||||||
|
m_dllShcore.Unload();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnloadIfNecessary()
|
||||||
|
{
|
||||||
|
if ( m_dllShcore.IsLoaded() )
|
||||||
|
{
|
||||||
|
m_dllShcore.Unload();
|
||||||
|
m_pfnGetDpiForMonitor = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDynamicLibrary m_dllShcore;
|
||||||
|
GetDpiForMonitor_t m_pfnGetDpiForMonitor;
|
||||||
|
bool m_initialized;
|
||||||
|
};
|
||||||
|
static GetDpiForMonitorData ms_getDpiForMonitorData;
|
||||||
|
|
||||||
|
|
||||||
// the array containing information about all available displays, filled by
|
// the array containing information about all available displays, filled by
|
||||||
// MultimonEnumProc()
|
// MultimonEnumProc()
|
||||||
@@ -211,6 +280,8 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
wxDisplayFactoryMSW* wxDisplayFactoryMSW::ms_factory = NULL;
|
wxDisplayFactoryMSW* wxDisplayFactoryMSW::ms_factory = NULL;
|
||||||
|
wxDisplayFactoryMSW::GetDpiForMonitorData
|
||||||
|
wxDisplayFactoryMSW::ms_getDpiForMonitorData;
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxDisplay implementation
|
// wxDisplay implementation
|
||||||
@@ -272,6 +343,24 @@ int wxDisplayMSW::GetDepth() const
|
|||||||
return m_info.depth;
|
return m_info.depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxSize wxDisplayMSW::GetPPI() const
|
||||||
|
{
|
||||||
|
if ( const wxDisplayFactoryMSW::GetDpiForMonitor_t
|
||||||
|
getFunc = wxDisplayFactoryMSW::GetDpiForMonitorPtr() )
|
||||||
|
{
|
||||||
|
UINT dpiX = 0,
|
||||||
|
dpiY = 0;
|
||||||
|
const HRESULT
|
||||||
|
hr = (*getFunc)(m_info.hmon, MDT_EFFECTIVE_DPI, &dpiX, &dpiY);
|
||||||
|
if ( SUCCEEDED(hr) )
|
||||||
|
return wxSize(dpiX, dpiY);
|
||||||
|
|
||||||
|
wxLogApiError("GetDpiForMonitor", hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return IsPrimary() ? wxDisplayImplSingleMSW().GetPPI() : wxSize(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
wxString wxDisplayMSW::GetName() const
|
wxString wxDisplayMSW::GetName() const
|
||||||
{
|
{
|
||||||
WinStruct<MONITORINFOEX> monInfo;
|
WinStruct<MONITORINFOEX> monInfo;
|
||||||
@@ -492,9 +581,28 @@ wxDisplayFactoryMSW::~wxDisplayFactoryMSW()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( ms_getDpiForMonitorData.m_initialized )
|
||||||
|
{
|
||||||
|
ms_getDpiForMonitorData.UnloadIfNecessary();
|
||||||
|
ms_getDpiForMonitorData.m_initialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
ms_factory = NULL;
|
ms_factory = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* static */
|
||||||
|
wxDisplayFactoryMSW::GetDpiForMonitor_t
|
||||||
|
wxDisplayFactoryMSW::GetDpiForMonitorPtr()
|
||||||
|
{
|
||||||
|
if ( !ms_getDpiForMonitorData.m_initialized )
|
||||||
|
{
|
||||||
|
ms_getDpiForMonitorData.m_initialized = true;
|
||||||
|
ms_getDpiForMonitorData.TryLoad();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ms_getDpiForMonitorData.m_pfnGetDpiForMonitor;
|
||||||
|
}
|
||||||
|
|
||||||
void wxDisplayFactoryMSW::DoRefreshMonitors()
|
void wxDisplayFactoryMSW::DoRefreshMonitors()
|
||||||
{
|
{
|
||||||
m_displays.clear();
|
m_displays.clear();
|
||||||
|
@@ -117,16 +117,6 @@ void wxGetMousePosition( int* x, int* y )
|
|||||||
if ( y ) *y = pt.y;
|
if ( y ) *y = pt.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxDisplaySizeMM(int *width, int *height)
|
|
||||||
{
|
|
||||||
ScreenHDC dc;
|
|
||||||
|
|
||||||
if ( width )
|
|
||||||
*width = ::GetDeviceCaps(dc, HORZSIZE);
|
|
||||||
if ( height )
|
|
||||||
*height = ::GetDeviceCaps(dc, VERTSIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// window information functions
|
// window information functions
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
@@ -75,6 +75,12 @@ int wxGetDisplayDepth(CGDirectDisplayID id)
|
|||||||
return theDepth;
|
return theDepth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxSize wxGetDisplaySizeMM(CGDirectDisplayID id)
|
||||||
|
{
|
||||||
|
const CGSize size = CGDisplayScreenSize(id);
|
||||||
|
return wxSize(wxRound(size.width), wxRound(size.height));
|
||||||
|
}
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
||||||
#if wxUSE_DISPLAY
|
#if wxUSE_DISPLAY
|
||||||
@@ -97,6 +103,7 @@ public:
|
|||||||
virtual wxRect GetGeometry() const wxOVERRIDE;
|
virtual wxRect GetGeometry() const wxOVERRIDE;
|
||||||
virtual wxRect GetClientArea() const wxOVERRIDE;
|
virtual wxRect GetClientArea() const wxOVERRIDE;
|
||||||
virtual int GetDepth() const wxOVERRIDE;
|
virtual int GetDepth() const wxOVERRIDE;
|
||||||
|
virtual wxSize GetSizeMM() const wxOVERRIDE;
|
||||||
|
|
||||||
virtual wxArrayVideoModes GetModes(const wxVideoMode& mode) const wxOVERRIDE;
|
virtual wxArrayVideoModes GetModes(const wxVideoMode& mode) const wxOVERRIDE;
|
||||||
virtual wxVideoMode GetCurrentMode() const wxOVERRIDE;
|
virtual wxVideoMode GetCurrentMode() const wxOVERRIDE;
|
||||||
@@ -258,6 +265,11 @@ int wxDisplayImplMacOSX::GetDepth() const
|
|||||||
return wxGetDisplayDepth(m_id);
|
return wxGetDisplayDepth(m_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxSize wxDisplayImplMacOSX::GetSizeMM() const
|
||||||
|
{
|
||||||
|
return wxGetDisplaySizeMM(m_id);
|
||||||
|
}
|
||||||
|
|
||||||
static int wxOSXCGDisplayModeGetBitsPerPixel( CGDisplayModeRef theValue )
|
static int wxOSXCGDisplayModeGetBitsPerPixel( CGDisplayModeRef theValue )
|
||||||
{
|
{
|
||||||
wxCFRef<CFStringRef> pixelEncoding( CGDisplayModeCopyPixelEncoding(theValue) );
|
wxCFRef<CFStringRef> pixelEncoding( CGDisplayModeCopyPixelEncoding(theValue) );
|
||||||
@@ -373,6 +385,11 @@ public:
|
|||||||
{
|
{
|
||||||
return wxGetDisplayDepth(CGMainDisplayID());
|
return wxGetDisplayDepth(CGMainDisplayID());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual wxSize GetSizeMM() const wxOVERRIDE
|
||||||
|
{
|
||||||
|
return wxGetDisplaySizeMM(CGMainDisplayID());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class wxDisplayFactorySingleMacOSX : public wxDisplayFactorySingle
|
class wxDisplayFactorySingleMacOSX : public wxDisplayFactorySingle
|
||||||
|
@@ -160,6 +160,11 @@ public:
|
|||||||
{
|
{
|
||||||
return 32; // TODO can we determine this ?
|
return 32; // TODO can we determine this ?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual wxSize GetPPI() const wxOVERRIDE
|
||||||
|
{
|
||||||
|
return wxSize(72, 72);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class wxDisplayFactorySingleiOS : public wxDisplayFactorySingle
|
class wxDisplayFactorySingleiOS : public wxDisplayFactorySingle
|
||||||
|
@@ -106,28 +106,6 @@ bool wxDoLaunchDefaultBrowser(const wxLaunchBrowserParams& params)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void wxDisplaySizeMM(int *width, int *height)
|
|
||||||
{
|
|
||||||
#if wxOSX_USE_IPHONE
|
|
||||||
wxDisplaySize(width, height);
|
|
||||||
// on mac 72 is fixed (at least now;-)
|
|
||||||
double cvPt2Mm = 25.4 / 72;
|
|
||||||
|
|
||||||
if (width != NULL)
|
|
||||||
*width = int( *width * cvPt2Mm );
|
|
||||||
|
|
||||||
if (height != NULL)
|
|
||||||
*height = int( *height * cvPt2Mm );
|
|
||||||
#else
|
|
||||||
CGSize size = CGDisplayScreenSize(CGMainDisplayID());
|
|
||||||
if ( width )
|
|
||||||
*width = (int)size.width ;
|
|
||||||
if ( height )
|
|
||||||
*height = (int)size.height;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj,
|
wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj,
|
||||||
int *verMin,
|
int *verMin,
|
||||||
int *verMicro) const
|
int *verMicro) const
|
||||||
|
@@ -22,6 +22,7 @@ public:
|
|||||||
virtual wxRect GetGeometry() const wxOVERRIDE;
|
virtual wxRect GetGeometry() const wxOVERRIDE;
|
||||||
virtual wxRect GetClientArea() const wxOVERRIDE;
|
virtual wxRect GetClientArea() const wxOVERRIDE;
|
||||||
virtual int GetDepth() const wxOVERRIDE;
|
virtual int GetDepth() const wxOVERRIDE;
|
||||||
|
virtual wxSize GetSizeMM() const wxOVERRIDE;
|
||||||
|
|
||||||
#if wxUSE_DISPLAY
|
#if wxUSE_DISPLAY
|
||||||
virtual wxArrayVideoModes GetModes(const wxVideoMode& mode) const wxOVERRIDE;
|
virtual wxArrayVideoModes GetModes(const wxVideoMode& mode) const wxOVERRIDE;
|
||||||
@@ -50,6 +51,13 @@ int wxDisplayImplQt::GetDepth() const
|
|||||||
return IsPrimary() ? QApplication::desktop()->depth() : 0;
|
return IsPrimary() ? QApplication::desktop()->depth() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxSize wxDisplayImplQt::GetSizeMM() const
|
||||||
|
{
|
||||||
|
return IsPrimary() ? wxSize(QApplication::desktop()->widthMM(),
|
||||||
|
QApplication::desktop()->heightMM())
|
||||||
|
: wxSize(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
#if wxUSE_DISPLAY
|
#if wxUSE_DISPLAY
|
||||||
wxArrayVideoModes wxDisplayImplQt::GetModes(const wxVideoMode& WXUNUSED(mode)) const
|
wxArrayVideoModes wxDisplayImplQt::GetModes(const wxVideoMode& WXUNUSED(mode)) const
|
||||||
{
|
{
|
||||||
|
@@ -110,14 +110,6 @@ bool wxGetKeyState(wxKeyCode key)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxDisplaySizeMM(int *width, int *height)
|
|
||||||
{
|
|
||||||
if ( width != NULL )
|
|
||||||
*width = QApplication::desktop()->widthMM();
|
|
||||||
if ( height != NULL )
|
|
||||||
*height = QApplication::desktop()->heightMM();
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxBell()
|
void wxBell()
|
||||||
{
|
{
|
||||||
QApplication::beep();
|
QApplication::beep();
|
||||||
|
@@ -44,6 +44,17 @@ inline int wxGetMainScreenDepth()
|
|||||||
return DefaultDepth(dpy, DefaultScreen (dpy));
|
return DefaultDepth(dpy, DefaultScreen (dpy));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline wxSize wxGetMainScreenSizeMM()
|
||||||
|
{
|
||||||
|
Display* const dpy = wxGetX11Display();
|
||||||
|
|
||||||
|
return wxSize
|
||||||
|
(
|
||||||
|
DisplayWidthMM(dpy, DefaultScreen(dpy)),
|
||||||
|
DisplayHeightMM(dpy, DefaultScreen(dpy))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
class wxDisplayImplSingleX11 : public wxDisplayImplSingle
|
class wxDisplayImplSingleX11 : public wxDisplayImplSingle
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -65,6 +76,11 @@ public:
|
|||||||
{
|
{
|
||||||
return wxGetMainScreenDepth();
|
return wxGetMainScreenDepth();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual wxSize GetSizeMM() const wxOVERRIDE
|
||||||
|
{
|
||||||
|
return wxGetMainScreenSizeMM();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class wxDisplayFactorySingleX11 : public wxDisplayFactorySingle
|
class wxDisplayFactorySingleX11 : public wxDisplayFactorySingle
|
||||||
@@ -143,6 +159,11 @@ public:
|
|||||||
|
|
||||||
return wxGetMainScreenDepth();
|
return wxGetMainScreenDepth();
|
||||||
}
|
}
|
||||||
|
virtual wxSize GetSizeMM() const wxOVERRIDE
|
||||||
|
{
|
||||||
|
// TODO: how to get physical size or resolution of the other monitors?
|
||||||
|
return IsPrimary() ? wxGetMainScreenSizeMM() : wxSize(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
virtual wxArrayVideoModes GetModes(const wxVideoMode& mode) const wxOVERRIDE;
|
virtual wxArrayVideoModes GetModes(const wxVideoMode& mode) const wxOVERRIDE;
|
||||||
virtual wxVideoMode GetCurrentMode() const wxOVERRIDE;
|
virtual wxVideoMode GetCurrentMode() const wxOVERRIDE;
|
||||||
|
@@ -148,16 +148,6 @@ void wxGetMousePosition( int* x, int* y )
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
void wxDisplaySizeMM(int *width, int *height)
|
|
||||||
{
|
|
||||||
Display *dpy = (Display*) wxGetDisplay();
|
|
||||||
|
|
||||||
if ( width )
|
|
||||||
*width = DisplayWidthMM(dpy, DefaultScreen (dpy));
|
|
||||||
if ( height )
|
|
||||||
*height = DisplayHeightMM(dpy, DefaultScreen (dpy));
|
|
||||||
}
|
|
||||||
|
|
||||||
wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
|
wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
|
||||||
{
|
{
|
||||||
return wxGenericFindWindowAtPoint(pt);
|
return wxGenericFindWindowAtPoint(pt);
|
||||||
|
Reference in New Issue
Block a user