diff options
Diffstat (limited to 'src/win/gui/TimerManager.hpp')
| -rw-r--r-- | src/win/gui/TimerManager.hpp | 61 | 
1 files changed, 61 insertions, 0 deletions
diff --git a/src/win/gui/TimerManager.hpp b/src/win/gui/TimerManager.hpp new file mode 100644 index 00000000..a8db1075 --- /dev/null +++ b/src/win/gui/TimerManager.hpp @@ -0,0 +1,61 @@ +#pragma once +#include "cru/common/Event.hpp" +#include "cru/win/WinPreConfig.hpp" + +#include "cru/common/Base.hpp" +#include "cru/win/gui/GodWindow.hpp" +#include "cru/win/gui/WindowNativeMessageEventArgs.hpp" + +#include <chrono> +#include <functional> +#include <optional> +#include <unordered_map> + +namespace cru::platform::gui::win { +enum class TimerType { Immediate, Timeout, Interval }; + +struct TimerInfo { +  TimerInfo(long long id, TimerType type, int period, +            std::function<void()> action, UINT_PTR native_timer_id = 0) +      : id(id), +        type(type), +        period(period), +        action(std::move(action)), +        native_timer_id(native_timer_id) {} + +  long long id; +  TimerType type; +  int period;  // in milliseconds +  std::function<void()> action; +  UINT_PTR native_timer_id; +}; + +class TimerManager : public Object { + public: +  TimerManager(GodWindow* god_window); + +  CRU_DELETE_COPY(TimerManager) +  CRU_DELETE_MOVE(TimerManager) + +  ~TimerManager() override = default; + +  // Period is in milliseconds. When type is immediate, it is not checked and +  // used. +  long long SetTimer(TimerType type, int period, std::function<void()> action); +  void CancelTimer(long long id); + + private: +  void HandleGodWindowMessage(WindowNativeMessageEventArgs& args); + +  void CreateNativeTimer(TimerInfo* info); +  void KillNativeTimer(TimerInfo* info); + + private: +  GodWindow* god_window_; + +  EventRevokerListGuard event_guard_; + +  long long next_id_ = 1; +  std::unordered_map<long long, TimerInfo> info_map_; +}; +}  // namespace cru::platform::gui::win  | 
