/*++ Copyright (c) Microsoft Corporation Licensed under the MIT license. Module Name: - ApplicationState.h Abstract: - If the CascadiaSettings class were AppData, then this class would be LocalAppData. Put anything in here that you wouldn't want to be stored next to user-editable settings. - Modify ApplicationState.idl and MTSM_APPLICATION_STATE_FIELDS to add new fields. --*/ #pragma once #include "ApplicationState.g.h" #include "WindowLayout.g.h" #include #include #include #include "FileUtils.h" #include // This macro generates all getters and setters for ApplicationState. // It provides X with the following arguments: // (type, function name, JSON key, ...variadic construction arguments) namespace winrt::Microsoft::Terminal::Settings::Model::implementation { #define MTSM_APPLICATION_STATE_FIELDS(X) \ X(std::unordered_set, GeneratedProfiles, "generatedProfiles") \ X(Windows::Foundation::Collections::IVector, PersistedWindowLayouts, "persistedWindowLayouts") \ X(Windows::Foundation::Collections::IVector, RecentCommands, "recentCommands") \ X(Windows::Foundation::Collections::IVector, DismissedMessages, "dismissedMessages") struct WindowLayout : WindowLayoutT { static winrt::hstring ToJson(const Model::WindowLayout& layout); static Model::WindowLayout FromJson(const winrt::hstring& json); WINRT_PROPERTY(Windows::Foundation::Collections::IVector, TabLayout, nullptr); WINRT_PROPERTY(winrt::Windows::Foundation::IReference, InitialPosition, nullptr); WINRT_PROPERTY(winrt::Windows::Foundation::IReference, InitialSize, nullptr); friend ::Microsoft::Terminal::Settings::Model::JsonUtils::ConversionTrait; }; struct ApplicationState : ApplicationStateT { static Microsoft::Terminal::Settings::Model::ApplicationState SharedInstance(); ApplicationState(std::filesystem::path path) noexcept; ~ApplicationState(); // Methods void Reload() const noexcept; // General getters/setters winrt::hstring FilePath() const noexcept; // State getters/setters #define MTSM_APPLICATION_STATE_GEN(type, name, key, ...) \ type name() const noexcept; \ void name(const type& value) noexcept; MTSM_APPLICATION_STATE_FIELDS(MTSM_APPLICATION_STATE_GEN) #undef MTSM_APPLICATION_STATE_GEN private: struct state_t { #define MTSM_APPLICATION_STATE_GEN(type, name, key, ...) \ std::optional name{ __VA_ARGS__ }; \ bool name##Changed = false; MTSM_APPLICATION_STATE_FIELDS(MTSM_APPLICATION_STATE_GEN) #undef MTSM_APPLICATION_STATE_GEN }; Json::Value _getRoot(const winrt::Microsoft::Terminal::Settings::Model::locked_hfile& file) const noexcept; void _write() noexcept; void _read() const noexcept; std::filesystem::path _path; til::shared_mutex _state; til::throttled_func_trailing<> _throttler; }; } namespace winrt::Microsoft::Terminal::Settings::Model::factory_implementation { BASIC_FACTORY(WindowLayout) BASIC_FACTORY(ApplicationState); }