blob: c31044ce2c7675126bcf8ad383a33b3eac2c9420 [file]
#include "flutter/shell/platform/windows/win32_dpi_helper.h"
namespace flutter {
namespace {
template <typename T>
bool AssignProcAddress(HMODULE comBaseModule, const char* name, T*& outProc) {
outProc = reinterpret_cast<T*>(GetProcAddress(comBaseModule, name));
return *outProc != nullptr;
}
} // namespace
Win32DpiHelper::Win32DpiHelper() {
// TODO ensure that this helper works correctly on downlevel builds.
user32_module_ = LoadLibraryA("User32.dll");
if (user32_module_ == nullptr) {
return;
}
if (!AssignProcAddress(user32_module_, "EnableNonClientDpiScaling",
enable_non_client_dpi_scaling_)) {
return;
}
if (!AssignProcAddress(user32_module_, "GetDpiForWindow",
get_dpi_for_window_)) {
return;
}
if (!AssignProcAddress(user32_module_, "SetProcessDpiAwarenessContext",
set_process_dpi_awareness_context_)) {
return;
}
permonitorv2_supported_ = true;
}
Win32DpiHelper::~Win32DpiHelper() {
if (user32_module_ != nullptr) {
FreeLibrary(user32_module_);
}
}
bool Win32DpiHelper::IsPerMonitorV2Available() {
return permonitorv2_supported_;
}
BOOL Win32DpiHelper::EnableNonClientDpiScaling(HWND hwnd) {
if (!permonitorv2_supported_) {
return false;
}
return enable_non_client_dpi_scaling_(hwnd);
}
UINT Win32DpiHelper::GetDpiForWindow(HWND hwnd) {
if (!permonitorv2_supported_) {
return false;
}
return get_dpi_for_window_(hwnd);
}
BOOL Win32DpiHelper::SetProcessDpiAwarenessContext(
DPI_AWARENESS_CONTEXT context) {
if (!permonitorv2_supported_) {
return false;
}
return set_process_dpi_awareness_context_(context);
}
} // namespace flutter