mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-02-24 04:00:02 +01:00
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary of the Pull Request This PR ensures that Light Switch detects changes to app/system theme from Windows Settings. This PR also introduces new behavior where switching the schedule will cause an instant update to the theme if necessary. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #42878 - [x] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx
96 lines
2.0 KiB
C++
96 lines
2.0 KiB
C++
#pragma once
|
|
|
|
#include <unordered_set>
|
|
#include <string>
|
|
#include <vector>
|
|
#include <memory>
|
|
#include <windows.h>
|
|
|
|
#include <common/SettingsAPI/FileWatcher.h>
|
|
#include <common/SettingsAPI/settings_objects.h>
|
|
#include <SettingsConstants.h>
|
|
|
|
class SettingsObserver;
|
|
|
|
enum class ScheduleMode
|
|
{
|
|
Off,
|
|
FixedHours,
|
|
SunsetToSunrise
|
|
// Add more in the future
|
|
};
|
|
|
|
inline std::wstring ToString(ScheduleMode mode)
|
|
{
|
|
switch (mode)
|
|
{
|
|
case ScheduleMode::FixedHours:
|
|
return L"FixedHours";
|
|
case ScheduleMode::SunsetToSunrise:
|
|
return L"SunsetToSunrise";
|
|
default:
|
|
return L"Off";
|
|
}
|
|
}
|
|
|
|
inline ScheduleMode FromString(const std::wstring& str)
|
|
{
|
|
if (str == L"SunsetToSunrise")
|
|
return ScheduleMode::SunsetToSunrise;
|
|
if (str == L"FixedHours")
|
|
return ScheduleMode::FixedHours;
|
|
else
|
|
return ScheduleMode::Off;
|
|
}
|
|
|
|
struct LightSwitchConfig
|
|
{
|
|
ScheduleMode scheduleMode = ScheduleMode::FixedHours;
|
|
|
|
std::wstring latitude = L"0.0";
|
|
std::wstring longitude = L"0.0";
|
|
|
|
// Stored as minutes since midnight
|
|
int lightTime = 8 * 60; // 08:00 default
|
|
int darkTime = 20 * 60; // 20:00 default
|
|
|
|
int sunrise_offset = 0;
|
|
int sunset_offset = 0;
|
|
|
|
bool changeSystem = false;
|
|
bool changeApps = false;
|
|
};
|
|
|
|
class LightSwitchSettings
|
|
{
|
|
public:
|
|
static LightSwitchSettings& instance();
|
|
|
|
static inline const LightSwitchConfig& settings()
|
|
{
|
|
return instance().m_settings;
|
|
}
|
|
|
|
void InitFileWatcher();
|
|
static std::wstring GetSettingsFileName();
|
|
|
|
void AddObserver(SettingsObserver& observer);
|
|
void RemoveObserver(SettingsObserver& observer);
|
|
|
|
void LoadSettings();
|
|
|
|
HANDLE GetSettingsChangedEvent() const;
|
|
|
|
private:
|
|
LightSwitchSettings();
|
|
~LightSwitchSettings() = default;
|
|
|
|
LightSwitchConfig m_settings;
|
|
std::unique_ptr<FileWatcher> m_settingsFileWatcher;
|
|
std::unordered_set<SettingsObserver*> m_observers;
|
|
|
|
void NotifyObservers(SettingId id) const;
|
|
|
|
HANDLE m_settingsChangedEvent = nullptr;
|
|
};
|