Skip to content

Commit 02c04cb

Browse files
committed
win: gfx::EnableHighDPISupport is dropped
1 parent 5523938 commit 02c04cb

File tree

1 file changed

+50
-2
lines changed

1 file changed

+50
-2
lines changed

atom/app/atom_main.cc

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,14 @@
1313
#include <fcntl.h>
1414

1515
#include <windows.h>
16+
#include <shellscalingapi.h>
17+
#include <tchar.h>
1618
#include <shellapi.h>
1719

1820
#include "atom/app/atom_main_delegate.h"
1921
#include "atom/common/crash_reporter/win/crash_service_main.h"
2022
#include "base/environment.h"
23+
#include "base/win/windows_version.h"
2124
#include "content/public/app/startup_helper_win.h"
2225
#include "sandbox/win/src/sandbox_types.h"
2326
#include "ui/gfx/win/dpi.h"
@@ -37,6 +40,48 @@ int Start(int argc, char *argv[]);
3740

3841
#if defined(OS_WIN)
3942

43+
namespace {
44+
45+
// Win8.1 supports monitor-specific DPI scaling.
46+
bool SetProcessDpiAwarenessWrapper(PROCESS_DPI_AWARENESS value) {
47+
typedef HRESULT(WINAPI *SetProcessDpiAwarenessPtr)(PROCESS_DPI_AWARENESS);
48+
SetProcessDpiAwarenessPtr set_process_dpi_awareness_func =
49+
reinterpret_cast<SetProcessDpiAwarenessPtr>(
50+
GetProcAddress(GetModuleHandleA("user32.dll"),
51+
"SetProcessDpiAwarenessInternal"));
52+
if (set_process_dpi_awareness_func) {
53+
HRESULT hr = set_process_dpi_awareness_func(value);
54+
if (SUCCEEDED(hr)) {
55+
VLOG(1) << "SetProcessDpiAwareness succeeded.";
56+
return true;
57+
} else if (hr == E_ACCESSDENIED) {
58+
LOG(ERROR) << "Access denied error from SetProcessDpiAwareness. "
59+
"Function called twice, or manifest was used.";
60+
}
61+
}
62+
return false;
63+
}
64+
65+
// This function works for Windows Vista through Win8. Win8.1 must use
66+
// SetProcessDpiAwareness[Wrapper].
67+
BOOL SetProcessDPIAwareWrapper() {
68+
typedef BOOL(WINAPI *SetProcessDPIAwarePtr)(VOID);
69+
SetProcessDPIAwarePtr set_process_dpi_aware_func =
70+
reinterpret_cast<SetProcessDPIAwarePtr>(
71+
GetProcAddress(GetModuleHandleA("user32.dll"),
72+
"SetProcessDPIAware"));
73+
return set_process_dpi_aware_func &&
74+
set_process_dpi_aware_func();
75+
}
76+
77+
void EnableHighDPISupport() {
78+
if (!SetProcessDpiAwarenessWrapper(PROCESS_SYSTEM_DPI_AWARE)) {
79+
SetProcessDPIAwareWrapper();
80+
}
81+
}
82+
83+
} // namespace
84+
4085
int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
4186
int argc = 0;
4287
wchar_t** wargv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
@@ -103,8 +148,11 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
103148
content::InitializeSandboxInfo(&sandbox_info);
104149
atom::AtomMainDelegate delegate;
105150

106-
// Now chrome relies on a regkey to enable high dpi support.
107-
gfx::EnableHighDPISupport();
151+
// We don't want to set DPI awareness on pre-Win7 because we don't support
152+
// DirectWrite there. GDI fonts are kerned very badly, so better to leave
153+
// DPI-unaware and at effective 1.0. See also ShouldUseDirectWrite().
154+
if (base::win::GetVersion() >= base::win::VERSION_WIN7)
155+
EnableHighDPISupport();
108156

109157
content::ContentMainParams params(&delegate);
110158
params.instance = instance;

0 commit comments

Comments
 (0)