12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- // Copyright (c) 2022 Microsoft Inc. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE-CHROMIUM file.
- #include "shell/browser/win/dark_mode.h"
- #include <dwmapi.h> // DwmSetWindowAttribute()
- #include "base/win/windows_version.h"
- // This flag works since Win10 20H1 but is not documented until Windows 11
- #define DWMWA_USE_IMMERSIVE_DARK_MODE 20
- // This namespace contains code originally from
- // https://github.com/microsoft/terminal
- // governed by the MIT license and (c) Microsoft Corporation.
- namespace {
- // https://docs.microsoft.com/en-us/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute
- HRESULT TrySetWindowTheme(HWND hWnd, bool dark) {
- const BOOL isDarkMode = dark;
- HRESULT result = DwmSetWindowAttribute(hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE,
- &isDarkMode, sizeof(isDarkMode));
- if (FAILED(result))
- return result;
- auto* os_info = base::win::OSInfo::GetInstance();
- auto const version = os_info->version();
- // Toggle the nonclient area active state to force a redraw (Win10 workaround)
- if (version < base::win::Version::WIN11) {
- HWND activeWindow = GetActiveWindow();
- SendMessage(hWnd, WM_NCACTIVATE, hWnd != activeWindow, 0);
- SendMessage(hWnd, WM_NCACTIVATE, hWnd == activeWindow, 0);
- }
- return S_OK;
- }
- } // namespace
- namespace electron {
- namespace win {
- bool IsDarkModeSupported() {
- auto* os_info = base::win::OSInfo::GetInstance();
- auto const version = os_info->version();
- return version >= base::win::Version::WIN10_20H1;
- }
- void SetDarkModeForWindow(HWND hWnd) {
- ui::NativeTheme* theme = ui::NativeTheme::GetInstanceForNativeUi();
- bool dark =
- theme->ShouldUseDarkColors() && !theme->UserHasContrastPreference();
- TrySetWindowTheme(hWnd, dark);
- }
- } // namespace win
- } // namespace electron
|