910e62b5创建于 1月15日历史提交
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_NATIVE_THEME_OS_SETTINGS_PROVIDER_WIN_H_
#define UI_NATIVE_THEME_OS_SETTINGS_PROVIDER_WIN_H_

#include "base/callback_list.h"
#include "base/component_export.h"
#include "base/containers/flat_map.h"
#include "base/functional/bind.h"
#include "base/win/registry.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/color/win/accent_color_observer.h"
#include "ui/gfx/win/singleton_hwnd.h"
#include "ui/native_theme/os_settings_provider.h"

namespace ui {

class COMPONENT_EXPORT(NATIVE_THEME) OsSettingsProviderWin
    : public OsSettingsProvider {
 public:
  OsSettingsProviderWin();
  OsSettingsProviderWin(const OsSettingsProviderWin&) = delete;
  OsSettingsProviderWin& operator=(const OsSettingsProviderWin&) = delete;
  ~OsSettingsProviderWin() override;

  bool DarkColorSchemeAvailable() const override;
  NativeTheme::PreferredColorScheme PreferredColorScheme() const override;
  ColorProviderKey::UserColorSource PreferredColorSource() const override;
  bool PrefersReducedTransparency() const override;
  bool PrefersInvertedColors() const override;
  bool ForcedColorsActive() const override;
  std::optional<SkColor> AccentColor() const override;
  std::optional<SkColor> Color(ColorId color_id) const override;
  base::TimeDelta CaretBlinkInterval() const override;

 private:
  // Registers an observer to monitor the respective registry keys.
  void RegisterThemesRegkeyObserver();
  void RegisterColorFilteringRegkeyObserver();

  // Updates values affected by the respective registry keys.
  void UpdateForThemesRegkey();
  void UpdateForColorFilteringRegkey();

  // Updates `accent_color_`. If it changed, notifies callbacks.
  void OnAccentColorMaybeChanged();

  // Updates the values in `colors_`.
  void UpdateColors();

  // Called by `singleton_hwnd_observer_`.
  void OnWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);

  // Color/high contrast mode change subscription.
  base::CallbackListSubscription hwnd_subscription_ =
      gfx::SingletonHwnd::GetInstance()->RegisterCallback(
          base::BindRepeating(&OsSettingsProviderWin::OnWndProc,
                              base::Unretained(this)));

  // Dark Mode/Transparency registry key.
  base::win::RegKey hkcu_themes_regkey_;

  // Inverted colors registry key.
  base::win::RegKey hkcu_color_filtering_regkey_;

  // Accent color subscription.
  base::CallbackListSubscription accent_color_subscription_ =
      AccentColorObserver::Get()->Subscribe(
          base::BindRepeating(&OsSettingsProviderWin::OnAccentColorMaybeChanged,
                              base::Unretained(this)));

  bool in_dark_mode_ = false;
  bool prefers_reduced_transparency_ = false;
  bool prefers_inverted_colors_ = false;
  bool forced_colors_active_ = false;
  std::optional<SkColor> accent_color_ =
      AccentColorObserver::Get()->accent_color();
  base::flat_map<ColorId, SkColor> colors_;
};

}  // namespace ui

#endif  // UI_NATIVE_THEME_OS_SETTINGS_PROVIDER_WIN_H_