mirror of https://github.com/encounter/SDL.git
SDL_windowsvideo.c: add HIGHDPI_DEBUG ifdef, print DPI awareness at startup if defined
document some additional quirks
This commit is contained in:
parent
1488c40812
commit
1b797957c1
|
@ -35,6 +35,8 @@
|
|||
#include "SDL_windowsshape.h"
|
||||
#include "SDL_windowsvulkan.h"
|
||||
|
||||
/* #define HIGHDPI_DEBUG */
|
||||
|
||||
/* Initialization/Query functions */
|
||||
static int WIN_VideoInit(_THIS);
|
||||
static void WIN_VideoQuit(_THIS);
|
||||
|
@ -304,7 +306,20 @@ WIN_DeclareDPIAwarePerMonitorV2(_THIS)
|
|||
/* Windows 10, version 1607 */
|
||||
|
||||
/* NOTE: SetThreadDpiAwarenessContext doesn't work here with OpenGL - the OpenGL contents
|
||||
end up still getting OS scaled. (tested on Windows 10 21H1 19043.1348, NVIDIA 496.49) */
|
||||
end up still getting OS scaled. (tested on Windows 10 21H1 19043.1348, NVIDIA 496.49)
|
||||
|
||||
NOTE: Enabling DPI awareness through Windows Explorer
|
||||
(right click .exe -> Properties -> Compatibility -> High DPI Settings ->
|
||||
check "Override high DPI Scaling behaviour", select Application) gives
|
||||
a DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE context (at least on Windows 10 21H1), and
|
||||
setting DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 will fail.
|
||||
|
||||
NOTE: Entering exclusive fullscreen in a DPI_AWARENESS_CONTEXT_UNAWARE process
|
||||
appears to cause Windows to change the .exe manifest to DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE
|
||||
on future launches. This means attempting to use DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
|
||||
will fail in the future until you manually clear the "Override high DPI Scaling behaviour"
|
||||
setting in Windows Explorer (tested on Windows 10 21H2).
|
||||
*/
|
||||
if (data->SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)) {
|
||||
return TRUE;
|
||||
} else {
|
||||
|
@ -316,6 +331,30 @@ WIN_DeclareDPIAwarePerMonitorV2(_THIS)
|
|||
}
|
||||
}
|
||||
|
||||
static const char*
|
||||
WIN_GetDPIAwareness(_THIS)
|
||||
{
|
||||
SDL_VideoData* data = (SDL_VideoData*)_this->driverdata;
|
||||
|
||||
if (data->GetThreadDpiAwarenessContext && data->AreDpiAwarenessContextsEqual) {
|
||||
DPI_AWARENESS_CONTEXT context = data->GetThreadDpiAwarenessContext();
|
||||
|
||||
if (data->AreDpiAwarenessContextsEqual(context, DPI_AWARENESS_CONTEXT_UNAWARE)) {
|
||||
return "unaware";
|
||||
} else if (data->AreDpiAwarenessContextsEqual(context, DPI_AWARENESS_CONTEXT_SYSTEM_AWARE)) {
|
||||
return "system";
|
||||
} else if (data->AreDpiAwarenessContextsEqual(context, DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE)) {
|
||||
return "permonitor";
|
||||
} else if (data->AreDpiAwarenessContextsEqual(context, DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)) {
|
||||
return "permonitorv2";
|
||||
} else if (data->AreDpiAwarenessContextsEqual(context, DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED)) {
|
||||
return "unaware_gdiscaled";
|
||||
}
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
static void
|
||||
WIN_InitDPIAwareness(_THIS)
|
||||
{
|
||||
|
@ -341,6 +380,10 @@ WIN_VideoInit(_THIS)
|
|||
|
||||
WIN_InitDPIAwareness(_this);
|
||||
|
||||
#ifdef HIGHDPI_DEBUG
|
||||
SDL_Log("DPI awareness: %s", WIN_GetDPIAwareness(_this));
|
||||
#endif
|
||||
|
||||
if (WIN_InitModes(_this) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue