#pragma once namespace xtr::ui { //! Keyboard layout handler class Keyboard { public: enum class Layout : uint32_t { ENG, RUS, MATH, }; private: Layout systemLayout{ Layout::ENG }; Layout currentLayout{ Layout::ENG }; std::set indicators; HKL russianHKL; HKL englishHKL; public: ~Keyboard() noexcept = default; Keyboard(const Keyboard&) = delete; Keyboard& operator=(const Keyboard&) = delete; private: Keyboard(); public: [[nodiscard]] static Keyboard& Instance(); [[nodiscard]] static inline BOOL IsPressed(int keyID) noexcept { return HIWORD(::GetKeyState(keyID)) != 0; } void SetLayout(Layout newLang); [[nodiscard]] Layout GetLayout() const noexcept; void ResetSystemLayout(); void ImportSystemLayout(); void RotateLayout(); void RegisterIndicator(CWnd* wnd); void UnregisterIndicator(CWnd* wnd); private: [[nodiscard]] static Layout GetKeybLang(); static void SetSystemLayout(HKL newLayout) noexcept; void UpdateIndicators(); void SetInternalLayout(Layout newLang); }; } // namespace xtr::ui