This repository was archived by the owner on Feb 25, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6k
Expose DPI helper functions for Runner apps to use #16313
Merged
Merged
Changes from 9 commits
Commits
Show all changes
39 commits
Select commit
Hold shift + click to select a range
4afaff0
Refactor helper and expose it
franciscojma86 f133955
mostly works but with two helpers
franciscojma86 098a89b
Now with scaling
franciscojma86 0ac5ce5
Now with scaling
franciscojma86 3bc93ab
Format
franciscojma86 1990c7b
Clean
franciscojma86 5d53cb2
Commetns
franciscojma86 869725a
Clean
franciscojma86 e6aa604
Comment
franciscojma86 ed6d9a2
Address comments
franciscojma86 186f56c
Comment
franciscojma86 7954dbd
Review comments
franciscojma86 c883807
GN
franciscojma86 6762376
Add test
franciscojma86 3b1ffc5
Clean
franciscojma86 31c39d2
Clean
franciscojma86 fc9c47c
Merge tests
franciscojma86 226581e
Comments and format
franciscojma86 c9e38c8
license
franciscojma86 9e8ccfb
Comments
franciscojma86 efa8fcc
Virtual destructors
franciscojma86 9dfbad6
Move tests
franciscojma86 6e16a11
Add on font change
franciscojma86 a4144e7
Remove onclose
franciscojma86 d693ebb
Remove dpi changed and primary monitor change
franciscojma86 747b614
Merge branch 'master' into dpi-get
franciscojma86 5899237
Fix
franciscojma86 f4a225a
monitor type enum
franciscojma86 93c1aeb
Use MonitorFromWindow
franciscojma86 688580c
space
franciscojma86 838a9c2
Default to primary correctly
franciscojma86 2a98f8c
License
franciscojma86 4ba92ef
Most comments
franciscojma86 57c11aa
Comment
franciscojma86 20dcea8
Add test
franciscojma86 6b06bb2
Add test
franciscojma86 c379a98
Remove test line
franciscojma86 d8bce83
Format
franciscojma86 86ebe6c
Clean tests
franciscojma86 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,124 @@ | ||
| #include "dpi_utils.h" | ||
|
|
||
| #include <ShellScalingApi.h> | ||
|
|
||
| namespace flutter { | ||
|
|
||
| namespace { | ||
|
|
||
| constexpr UINT kDefaultDpi = 96; | ||
|
|
||
| template <typename T> | ||
| bool AssignProcAddress(HMODULE comBaseModule, const char* name, T*& outProc) { | ||
| outProc = reinterpret_cast<T*>(GetProcAddress(comBaseModule, name)); | ||
| return *outProc != nullptr; | ||
| } | ||
|
|
||
| } // namespace | ||
|
|
||
| /// A helper class for abstracting various Windows DPI related functions across | ||
| /// Windows OS versions. | ||
| class Win32DpiHelper { | ||
| public: | ||
| Win32DpiHelper(); | ||
|
|
||
| ~Win32DpiHelper(); | ||
|
|
||
| /// Returns the current DPI. Supports all DPI awareness modes, and is backward | ||
| /// compatible down to Windows Vista. If |hwnd| is nullptr, returns the DPI | ||
| /// for the nearest monitor is available. Otherwise, returns the system's DPI. | ||
franciscojma86 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| UINT GetDpi(HWND); | ||
|
|
||
| /// Enables scaling of non-client UI (scrolling bars, title bars, etc). Only | ||
| /// supported on Per-Monitor V1 DPI awareness mode. | ||
| BOOL EnableNonClientDpiScaling(HWND hwnd); | ||
|
|
||
| private: | ||
| using GetDpiForWindow_ = UINT __stdcall(HWND); | ||
| using GetDpiForMonitor_ = HRESULT __stdcall(HMONITOR hmonitor, | ||
| MONITOR_DPI_TYPE dpiType, | ||
| UINT* dpiX, | ||
| UINT* dpiY); | ||
| using MonitorFromWindow_ = HMONITOR __stdcall(HWND hwnd, DWORD dwFlags); | ||
| using EnableNonClientDpiScaling_ = BOOL __stdcall(HWND hwnd); | ||
|
|
||
| GetDpiForWindow_* get_dpi_for_window_ = nullptr; | ||
| GetDpiForMonitor_* get_dpi_for_monitor_ = nullptr; | ||
| MonitorFromWindow_* monitor_from_window_ = nullptr; | ||
| EnableNonClientDpiScaling_* enable_non_client_dpi_scaling_ = nullptr; | ||
|
|
||
| HMODULE user32_module_ = nullptr; | ||
| HMODULE shlib_module_ = nullptr; | ||
| bool dpi_for_window_supported_ = false; | ||
| bool dpi_for_monitor_supported_ = false; | ||
| }; | ||
|
|
||
| Win32DpiHelper::Win32DpiHelper() { | ||
| user32_module_ = LoadLibraryA("User32.dll"); | ||
| shlib_module_ = LoadLibraryA("Shcore.dll"); | ||
| if (shlib_module_ == nullptr && user32_module_ == nullptr) { | ||
franciscojma86 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| return; | ||
| } | ||
|
|
||
| dpi_for_window_supported_ = | ||
| (AssignProcAddress(user32_module_, "GetDpiForWindow", | ||
| get_dpi_for_window_) && | ||
| AssignProcAddress(user32_module_, "EnableNonClientDpiScaling", | ||
| enable_non_client_dpi_scaling_)); | ||
| dpi_for_monitor_supported_ = | ||
| (AssignProcAddress(shlib_module_, "GetDpiForMonitor", | ||
| get_dpi_for_monitor_) && | ||
| AssignProcAddress(user32_module_, "MonitorFromWindow", | ||
| monitor_from_window_)); | ||
| } | ||
|
|
||
| Win32DpiHelper::~Win32DpiHelper() { | ||
| if (user32_module_ != nullptr) { | ||
| FreeLibrary(user32_module_); | ||
| } | ||
| if (shlib_module_ != nullptr) { | ||
| FreeLibrary(shlib_module_); | ||
| } | ||
| } | ||
|
|
||
| BOOL Win32DpiHelper::EnableNonClientDpiScaling(HWND hwnd) { | ||
| if (enable_non_client_dpi_scaling_ == nullptr) { | ||
| return false; | ||
| } | ||
| return enable_non_client_dpi_scaling_(hwnd); | ||
| } | ||
|
|
||
| UINT Win32DpiHelper::GetDpi(HWND hwnd) { | ||
| // GetDpiForWindow returns the DPI for any awareness mode. If not available, | ||
| // or no |hwnd| is provided. fallback to a per monitor, system, or default | ||
franciscojma86 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| // DPI. | ||
| if (dpi_for_window_supported_ && hwnd != nullptr) { | ||
| return get_dpi_for_window_(hwnd); | ||
| } | ||
|
|
||
| if (dpi_for_monitor_supported_) { | ||
| HMONITOR monitor = monitor_from_window_(hwnd, MONITOR_DEFAULTTONEAREST); | ||
| UINT dpi_x = 0, dpi_y = 0; | ||
| HRESULT result = | ||
| get_dpi_for_monitor_(monitor, MDT_EFFECTIVE_DPI, &dpi_x, &dpi_y); | ||
| return SUCCEEDED(result) ? dpi_x : kDefaultDpi; | ||
| } | ||
| HDC hdc = GetDC(hwnd); | ||
| UINT dpi = GetDeviceCaps(hdc, LOGPIXELSX); | ||
| ReleaseDC(hwnd, hdc); | ||
| return dpi; | ||
| } | ||
|
|
||
| Win32DpiHelper* GetHelper() { | ||
franciscojma86 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| static Win32DpiHelper* dpi_helper = new Win32DpiHelper(); | ||
| return dpi_helper; | ||
| } | ||
|
|
||
| UINT GetDpiForHWND(HWND hwnd) { | ||
| return GetHelper()->GetDpi(hwnd); | ||
| } | ||
|
|
||
| BOOL EnableNonClientDpiScaling(HWND hwnd) { | ||
franciscojma86 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| return GetHelper()->EnableNonClientDpiScaling(hwnd); | ||
| } | ||
| } // namespace flutter | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| // Copyright 2013 The Flutter Authors. All rights reserved. | ||
| // Use of this source code is governed by a BSD-style license that can be | ||
| // found in the LICENSE file. | ||
|
|
||
| #include "Windows.h" | ||
|
|
||
| #ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_DPI_UTILS_H_ | ||
| #define FLUTTER_SHELL_PLATFORM_WINDOWS_DPI_UTILS_H_ | ||
|
|
||
| namespace flutter { | ||
|
|
||
| /// Returns the current DPI. Supports all DPI awareness modes, and is backward | ||
| /// compatible down to Windows Vista. If |hwnd| is nullptr, returns the DPI for | ||
| /// the nearest monitor is available. Otherwise, returns the system's DPI. | ||
franciscojma86 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| UINT GetDpiForHWND(HWND hwnd); | ||
|
|
||
| /// Enables scaling of non-client UI (scrolling bars, title bars, etc). Only | ||
| /// supported on Per-Monitor V1 DPI awareness mode. | ||
| BOOL EnableNonClientDpiScaling(HWND hwnd); | ||
|
|
||
franciscojma86 marked this conversation as resolved.
Show resolved
Hide resolved
franciscojma86 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| } // namespace flutter | ||
|
|
||
| #endif // FLUTTER_SHELL_PLATFORM_WINDOWS_DPI_UTILS_H_ | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -4,9 +4,16 @@ | |
|
|
||
| #include "flutter/shell/platform/windows/win32_window.h" | ||
|
|
||
| #include "dpi_utils.h" | ||
|
|
||
| namespace flutter { | ||
|
|
||
| Win32Window::Win32Window() {} | ||
| Win32Window::Win32Window() { | ||
| // Calling GetDpiForHWND with no HNWD returns the DPI from the nearest | ||
|
||
| // monitor, which is the best option as an initial DPI. If Per-Monitor V2 is | ||
| // supported, |current_dpi_| should be updated in the WM_DPICHANGED message. | ||
| current_dpi_ = GetDpiForHWND(nullptr); | ||
| } | ||
|
|
||
| Win32Window::~Win32Window() { | ||
| Destroy(); | ||
|
|
@@ -74,7 +81,7 @@ LRESULT CALLBACK Win32Window::WndProc(HWND const window, | |
| reinterpret_cast<LONG_PTR>(cs->lpCreateParams)); | ||
|
|
||
| auto that = static_cast<Win32Window*>(cs->lpCreateParams); | ||
| that->current_dpi_ = that->dpi_helper_->GetDpi(window); | ||
|
|
||
franciscojma86 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| that->window_handle_ = window; | ||
| } else if (Win32Window* that = GetThisFromHandle(window)) { | ||
| return that->MessageHandler(window, message, wparam, lparam); | ||
|
|
@@ -267,7 +274,7 @@ Win32Window::HandleDpiChange(HWND hwnd, | |
| // The DPI is only passed for DPI change messages on top level windows, | ||
| // hence call function to get DPI if needed. | ||
| if (uDpi == 0) { | ||
| uDpi = dpi_helper_->GetDpi(hwnd); | ||
| uDpi = GetDpiForHWND(hwnd); | ||
| } | ||
| current_dpi_ = uDpi; | ||
| window->OnDpiScale(uDpi); | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.