#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:
void RegisterThemesRegkeyObserver();
void RegisterColorFilteringRegkeyObserver();
void UpdateForThemesRegkey();
void UpdateForColorFilteringRegkey();
void OnAccentColorMaybeChanged();
void UpdateColors();
void OnWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
base::CallbackListSubscription hwnd_subscription_ =
gfx::SingletonHwnd::GetInstance()->RegisterCallback(
base::BindRepeating(&OsSettingsProviderWin::OnWndProc,
base::Unretained(this)));
base::win::RegKey hkcu_themes_regkey_;
base::win::RegKey hkcu_color_filtering_regkey_;
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_;
};
}
#endif