MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Win32Window.hpp
Go to the documentation of this file.
1#pragma once
2
3#ifdef MAYAFLUX_PLATFORM_WINDOWS
4
7
9
10#include <windows.h>
11
12#ifdef ERROR
13#undef ERROR
14#endif
15
16namespace MayaFlux::Core {
17
18/**
19 * @class Win32Window
20 * @brief Native Win32 window backend.
21 *
22 * The Win32 message loop runs on a dedicated UI thread spawned in the
23 * constructor. WndProc enqueues WindowEvents under m_event_mutex; poll()
24 * drains the queue on the graphics thread and signals m_event_source.
25 * WindowManager::process() calls poll() once per frame.
26 */
27class MAYAFLUX_API Win32Window : public Window {
28public:
29 Win32Window(const WindowCreateInfo& create_info,
30 const GlobalGraphicsConfig& graphics_config);
31
32 ~Win32Window() override;
33
34 Win32Window(const Win32Window&) = delete;
35 Win32Window& operator=(const Win32Window&) = delete;
36 Win32Window(Win32Window&&) = delete;
37 Win32Window& operator=(Win32Window&&) = delete;
38
39 void show() override;
40 void hide() override;
41 void destroy() override;
42 void poll() override;
43
44 [[nodiscard]] bool should_close() const override;
45 void request_close() override;
46
47 [[nodiscard]] const WindowState& get_state() const override { return m_state; }
48 [[nodiscard]] const WindowCreateInfo& get_create_info() const override { return m_create_info; }
49
50 void set_input_config(const InputConfig& config) override { m_input_config = config; }
51 [[nodiscard]] const InputConfig& get_input_config() const override { return m_input_config; }
52
53 void set_event_callback(WindowEventCallback callback) override;
54
55 [[nodiscard]] void* get_native_handle() const override { return m_hwnd; }
56 [[nodiscard]] void* get_native_display() const override { return nullptr; }
57
58 void set_title(const std::string& title) override;
59 void set_size(uint32_t width, uint32_t height) override;
60 void set_position(uint32_t x, uint32_t y) override;
61 void set_color(const std::array<float, 4>& color) override;
62
63 static LRESULT CALLBACK wnd_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
64
65 Vruta::WindowEventSource& get_event_source() override { return m_event_source; }
66 [[nodiscard]] const Vruta::WindowEventSource& get_event_source() const override { return m_event_source; }
67
68 [[nodiscard]] bool is_graphics_registered() const override { return m_graphics_registered.load(); }
69 void set_graphics_registered(bool registered) override { m_graphics_registered.store(registered); }
70
71 void register_rendering_buffer(std::shared_ptr<Buffers::VKBuffer> buffer) override;
72 void unregister_rendering_buffer(std::shared_ptr<Buffers::VKBuffer> buffer) override;
73 void track_frame_command(uint64_t cmd_id) override;
74 [[nodiscard]] const std::vector<uint64_t>& get_frame_commands() const override;
75 void clear_frame_commands() override;
76 [[nodiscard]] std::vector<std::shared_ptr<Buffers::VKBuffer>> get_rendering_buffers() const override;
77
78 [[nodiscard]] bool is_capture_enabled() const override { return m_capture_enabled.load(std::memory_order_acquire); }
79 void set_capture_enabled(bool enabled) override { m_capture_enabled.store(enabled, std::memory_order_release); }
80
81private:
82 HWND m_hwnd { nullptr };
83 HINSTANCE m_hinstance { nullptr };
84
85 std::thread m_ui_thread;
86 std::atomic<bool> m_hwnd_ready { false };
87 std::atomic<bool> m_should_close { false };
88 std::atomic<bool> m_capture_enabled { false };
89 std::atomic<bool> m_in_size_move { false };
90
91 static constexpr size_t EVENT_QUEUE_CAPACITY = 256;
92
93 Memory::LockFreeQueue<WindowEvent, EVENT_QUEUE_CAPACITY> m_event_queue;
94
95 KeyRepeatConfig m_key_repeat_config;
96 WindowCreateInfo m_create_info;
97 WindowState m_state;
98 InputConfig m_input_config;
99 WindowEventCallback m_event_callback;
100
101 std::atomic<bool> m_graphics_registered { false };
102 Vruta::WindowEventSource m_event_source;
103 std::atomic<bool> m_keys_dirty { false };
104 std::unordered_map<int16_t, WindowEvent::KeyData> m_held_keys_ui;
105 std::unordered_map<int16_t, WindowEvent::KeyData> m_held_keys;
106 ULONGLONG m_repeat_next_tick { 0 };
107 uint16_t m_pending_high_surrogate { 0 };
108
109 std::vector<std::weak_ptr<Buffers::VKBuffer>> m_rendering_buffers;
110 std::vector<uint64_t> m_frame_commands;
111 mutable std::mutex m_render_tracking_mutex;
112
113 void ui_thread_main();
114 void push_event(WindowEvent ev);
115};
116
117} // namespace MayaFlux::Core
118
119#endif // MAYAFLUX_PLATFORM_WINDOWS
glm::vec3 color
Definition Decoder.cpp:97
std::shared_ptr< NetworkGeometryBuffer > buffer
PickCallback callback
Definition Picker.cpp:22
uint32_t width
uint32_t height
std::function< void(const WindowEvent &)> WindowEventCallback
@ CALLBACK
Use callback for custom transition.
void destroy(Surface &surface, uint32_t id)
Tear down an element and everything related to it.
Definition Forma.cpp:90