MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
CocoaWindow.hpp
Go to the documentation of this file.
1#pragma once
2
3#ifdef MAYAFLUX_PLATFORM_MACOS
4
7
9
10namespace MayaFlux::Core {
11
12/**
13 * @class CocoaWindow
14 * @brief Native AppKit window backend.
15 *
16 * Usable on its own, without WindowManager, GraphicsSubsystem, or Engine.
17 * Window operations may be called from any thread. Native events are queued
18 * per window and delivered to the callback and event source only from poll(),
19 * on whichever thread calls it. Held keys repeat at the KeyRepeatConfig rate,
20 * generated during poll(). Fullscreen is a borderless window covering the
21 * target display. Raw mouse motion is not supported; CAPTURED behaves as DISABLED.
22 */
23class MAYAFLUX_API CocoaWindow : public Window {
24public:
25 CocoaWindow(const WindowCreateInfo& create_info,
26 const GlobalGraphicsConfig& graphics_config);
27
28 ~CocoaWindow() override;
29
30 CocoaWindow(const CocoaWindow&) = delete;
31 CocoaWindow& operator=(const CocoaWindow&) = delete;
32 CocoaWindow(CocoaWindow&&) = delete;
33 CocoaWindow& operator=(CocoaWindow&&) = delete;
34
35 void show() override;
36 void hide() override;
37 void destroy() override;
38 void poll() override;
39
40 [[nodiscard]] bool should_close() const override;
41 void request_close() override;
42
43 [[nodiscard]] const WindowState& get_state() const override { return m_state; }
44 [[nodiscard]] const WindowCreateInfo& get_create_info() const override { return m_create_info; }
45
46 void set_input_config(const InputConfig& config) override;
47 [[nodiscard]] const InputConfig& get_input_config() const override { return m_input_config; }
48
49 void set_event_callback(WindowEventCallback callback) override;
50
51 /**
52 * @brief Get the NSWindow.
53 * @return NSWindow pointer, or nullptr after destroy().
54 */
55 [[nodiscard]] void* get_native_handle() const override;
56
57 [[nodiscard]] void* get_native_display() const override { return nullptr; }
58
59 /**
60 * @brief Get the CAMetalLayer backing the content view.
61 * @return CAMetalLayer pointer for vkCreateMetalSurfaceEXT, or nullptr after destroy().
62 */
63 [[nodiscard]] void* get_metal_layer() const;
64
65 void set_title(const std::string& title) override;
66 void set_size(uint32_t width, uint32_t height) override;
67 void set_position(uint32_t x, uint32_t y) override;
68 void set_color(const std::array<float, 4>& color) override;
69
70 Vruta::WindowEventSource& get_event_source() override { return m_event_source; }
71 [[nodiscard]] const Vruta::WindowEventSource& get_event_source() const override { return m_event_source; }
72
73 [[nodiscard]] bool is_graphics_registered() const override { return m_graphics_registered.load(); }
74 void set_graphics_registered(bool registered) override { m_graphics_registered.store(registered); }
75
76 void register_rendering_buffer(std::shared_ptr<Buffers::VKBuffer> buffer) override;
77 void unregister_rendering_buffer(std::shared_ptr<Buffers::VKBuffer> buffer) override;
78 void track_frame_command(uint64_t cmd_id) override;
79 [[nodiscard]] const std::vector<uint64_t>& get_frame_commands() const override;
80 void clear_frame_commands() override;
81 [[nodiscard]] std::vector<std::shared_ptr<Buffers::VKBuffer>> get_rendering_buffers() const override;
82
83 [[nodiscard]] bool is_capture_enabled() const override { return m_capture_enabled.load(std::memory_order_acquire); }
84 void set_capture_enabled(bool enabled) override { m_capture_enabled.store(enabled, std::memory_order_release); }
85
86private:
87 struct Native;
88
89 std::shared_ptr<Native> m_native;
90
91 std::atomic<bool> m_should_close { false };
92 std::atomic<bool> m_graphics_registered { false };
93 std::atomic<bool> m_capture_enabled { false };
94
95 static constexpr size_t EVENT_QUEUE_CAPACITY = 256;
96
97 Memory::LockFreeQueue<WindowEvent, EVENT_QUEUE_CAPACITY> m_event_queue;
98
99 WindowCreateInfo m_create_info;
100 WindowState m_state;
101 InputConfig m_input_config;
102 WindowEventCallback m_event_callback;
103 KeyRepeatConfig m_key_repeat_config;
104
105 std::unordered_map<int16_t, WindowEvent::KeyData> m_held_keys;
106 std::chrono::steady_clock::time_point m_repeat_deadline;
107
108 Vruta::WindowEventSource m_event_source;
109
110 std::vector<std::weak_ptr<Buffers::VKBuffer>> m_rendering_buffers;
111 std::vector<uint64_t> m_frame_commands;
112 mutable std::mutex m_render_tracking_mutex;
113
114 void push_event(WindowEvent ev);
115};
116
117} // namespace MayaFlux::Core
118
119#endif // MAYAFLUX_PLATFORM_MACOS
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
void destroy(Surface &surface, uint32_t id)
Tear down an element and everything related to it.
Definition Forma.cpp:90