#pragma once #include "cru/osx/gui/Window.hpp" #include "cru/common/Event.hpp" #include "cru/osx/gui/Cursor.hpp" #include "cru/platform/gui/TimerHelper.hpp" #import @interface CruWindowDelegate : NSObject - (id)init:(cru::platform::gui::osx::details::OsxWindowPrivate*)p; @end @interface CruWindow : NSWindow - (instancetype)init:(cru::platform::gui::osx::details::OsxWindowPrivate*)p contentRect:(NSRect)contentRect style:(NSWindowStyleMask)style; @end @interface CruView : NSView - (instancetype)init:(cru::platform::gui::osx::details::OsxWindowPrivate*)p frame:(cru::platform::Rect)frame; @end namespace cru::platform::gui::osx { namespace details { class OsxInputMethodContextPrivate; class OsxWindowPrivate { friend OsxWindow; friend OsxInputMethodContextPrivate; public: explicit OsxWindowPrivate(OsxWindow* osx_window) : osx_window_(osx_window) {} CRU_DELETE_COPY(OsxWindowPrivate) CRU_DELETE_MOVE(OsxWindowPrivate) ~OsxWindowPrivate() = default; public: void OnMouseEnterLeave(MouseEnterLeaveType type); void OnMouseMove(Point p); void OnMouseDown(MouseButton button, Point p, KeyModifier key_modifier); void OnMouseUp(MouseButton button, Point p, KeyModifier key_modifier); void OnMouseWheel(float delta, Point p, KeyModifier key_modifier); void OnKeyDown(KeyCode key, KeyModifier key_modifier); void OnKeyUp(KeyCode key, KeyModifier key_modifier); void OnWindowWillClose(); void OnWindowDidExpose(); void OnWindowDidUpdate(); void OnWindowDidResize(); CGLayerRef GetDrawLayer() { return draw_layer_; } NSWindow* GetNSWindow() { return window_; } private: void UpdateCursor(); private: OsxWindow* osx_window_; INativeWindow* parent_; bool frame_; Rect content_rect_; NSWindow* window_; CruWindowDelegate* window_delegate_; CGLayerRef draw_layer_; bool mouse_in_ = false; std::shared_ptr cursor_ = nullptr; std::unique_ptr input_method_context_; TimerAutoCanceler draw_timer_; Event destroy_event_; Event paint_event_; Event resize_event_; Event focus_event_; Event mouse_enter_leave_event_; Event mouse_move_event_; Event mouse_down_event_; Event mouse_up_event_; Event mouse_wheel_event_; Event key_down_event_; Event key_up_event_; }; } // namespace details } // namespace cru::platform::gui::osx