diff --git a/CMakeLists.txt b/CMakeLists.txt index f05d9f6ec..2bb3196b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -344,6 +344,10 @@ ENDIF() IF(WIN32 AND NOT ANDROID) + # Check window version + INCLUDE (OsgDetermineWinVersion) + get_WIN32_WINNT(WIN_VERSION) + ADD_DEFINITIONS(-D_WIN32_WINNT=${WIN_VERSION}) IF(MSVC) # This option is to enable the /MP switch for Visual Studio 2005 and above compilers diff --git a/CMakeModules/OsgDetermineWinVersion.cmake b/CMakeModules/OsgDetermineWinVersion.cmake new file mode 100644 index 000000000..9d7a0619d --- /dev/null +++ b/CMakeModules/OsgDetermineWinVersion.cmake @@ -0,0 +1,22 @@ +# - If Windows is used, this script sets the variable WIN32_WINNT to the corresponding windows version + +if (WIN32) + message(STATUS "Checking windows version...") + macro(get_WIN32_WINNT version) + if (CMAKE_SYSTEM_VERSION) + set(ver ${CMAKE_SYSTEM_VERSION}) + string(REGEX MATCH "^([0-9]+).([0-9])" ver ${ver}) + string(REGEX MATCH "^([0-9]+)" verMajor ${ver}) + # Check for Windows 10, b/c we'll need to convert to hex 'A'. + if ("${verMajor}" MATCHES "10") + set(verMajor "A") + string(REGEX REPLACE "^([0-9]+)" ${verMajor} ver ${ver}) + endif ("${verMajor}" MATCHES "10") + # Remove all remaining '.' characters. + string(REPLACE "." "" ver ${ver}) + # Prepend each digit with a zero. + string(REGEX REPLACE "([0-9A-Z])" "0\\1" ver ${ver}) + set(${version} "0x${ver}") + endif(CMAKE_SYSTEM_VERSION) + endmacro(get_WIN32_WINNT) +endif(WIN32) diff --git a/include/osgViewer/api/Win32/GraphicsHandleWin32 b/include/osgViewer/api/Win32/GraphicsHandleWin32 index f6ac8fa28..5959e6bf2 100644 --- a/include/osgViewer/api/Win32/GraphicsHandleWin32 +++ b/include/osgViewer/api/Win32/GraphicsHandleWin32 @@ -16,8 +16,17 @@ #include +// Fallback if not correctly detected in CMake macro #ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0500 +//#define _WIN32_WINNT 0x0A00 // Windows 10 +//#define _WIN32_WINNT 0x0603 // Windows 8.1 +//#define _WIN32_WINNT 0x0602 // Windows 8 +//#define _WIN32_WINNT 0x0601 // Windows 7 +//#define _WIN32_WINNT 0x0600 // Windows Server 2008 +//#define _WIN32_WINNT 0x0600 // Windows Vista +//#define _WIN32_WINNT 0x0502 // Windows Server 2003 with SP1, Windows XP with SP2 +//#define _WIN32_WINNT 0x0501 // Windows Server 2003, Windows XP +#define _WIN32_WINNT 0x0500 // Windows NT #endif #include diff --git a/src/osgDB/FileNameUtils.cpp b/src/osgDB/FileNameUtils.cpp index 383638e93..34b740a86 100644 --- a/src/osgDB/FileNameUtils.cpp +++ b/src/osgDB/FileNameUtils.cpp @@ -19,9 +19,6 @@ #include #ifdef WIN32 -#if !defined(__MINGW32__) - #define _WIN32_WINNT 0x0500 -#endif #include #endif diff --git a/src/osgViewer/GraphicsWindowWin32.cpp b/src/osgViewer/GraphicsWindowWin32.cpp index b1cb6ce9d..6905a8856 100644 --- a/src/osgViewer/GraphicsWindowWin32.cpp +++ b/src/osgViewer/GraphicsWindowWin32.cpp @@ -144,6 +144,26 @@ static CloseTouchInputHandleFunc *closeTouchInputHandleFunc = NULL; static GetTouchInputInfoFunc *getTouchInputInfoFunc = NULL; static GetPointerTypeFunc *getPointerTypeFunc = NULL; +// DPI Awareness +#if(WINVER >= 0x0603) + +#ifndef DPI_ENUMS_DECLARED + +typedef enum PROCESS_DPI_AWARENESS { + PROCESS_DPI_UNAWARE = 0, + PROCESS_SYSTEM_DPI_AWARE = 1, + PROCESS_PER_MONITOR_DPI_AWARE = 2 +} PROCESS_DPI_AWARENESS; + +#endif // DPI_ENUMS_DECLARED + +typedef +BOOL +(WINAPI SetProcessDpiAwarenessFunc( + PROCESS_DPI_AWARENESS dpi_awareness)); + +static SetProcessDpiAwarenessFunc *setProcessDpiAwareness = NULL; +#endif @@ -765,6 +785,21 @@ Win32WindowingSystem::Win32WindowingSystem() FreeLibrary( hModule); } } + + +#if(WINVER >= 0x0603) + // For Windows 8.1 and higher + // + // Per monitor DPI aware.This app checks for the DPI when it is created and adjusts the scale factor + // whenever the DPI changes.These applications are not automatically scaled by the system. + HMODULE hModuleShore = LoadLibrary("Shcore"); + if (hModuleShore) { + setProcessDpiAwareness = (SetProcessDpiAwarenessFunc *) GetProcAddress(hModuleShore, "SetProcessDpiAwareness"); + if (setProcessDpiAwareness) { + (*setProcessDpiAwareness)(PROCESS_DPI_AWARENESS::PROCESS_PER_MONITOR_DPI_AWARE); + } + } +#endif } Win32WindowingSystem::~Win32WindowingSystem()