147 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#pragma once
 | 
						|
 | 
						|
#include <math/vec2.hpp>
 | 
						|
#include <surface/events/keyboard.hpp>
 | 
						|
#include <surface/events/mouse.hpp>
 | 
						|
#include <surface/events/surface.hpp>
 | 
						|
#include <surface/requests/surface.hpp>
 | 
						|
#include <variant>
 | 
						|
 | 
						|
#ifdef LIGHT_PLATFORM_LINUX
 | 
						|
typedef struct _XDisplay Display;
 | 
						|
#endif
 | 
						|
 | 
						|
namespace lt::surface {
 | 
						|
 | 
						|
/** Represents a platform's surface (eg. a Window). */
 | 
						|
class SurfaceComponent
 | 
						|
{
 | 
						|
public:
 | 
						|
	friend class System;
 | 
						|
 | 
						|
	using Event = std::variant<
 | 
						|
	    // surface events
 | 
						|
	    ClosedEvent,
 | 
						|
	    MovedEvent,
 | 
						|
	    ResizedEvent,
 | 
						|
	    LostFocusEvent,
 | 
						|
	    GainFocusEvent,
 | 
						|
 | 
						|
	    // keyboard events
 | 
						|
	    KeyPressedEvent,
 | 
						|
	    KeyReleasedEvent,
 | 
						|
 | 
						|
	    // mouse events
 | 
						|
	    MouseMovedEvent,
 | 
						|
	    ButtonPressedEvent,
 | 
						|
	    ButtonReleasedEvent>;
 | 
						|
 | 
						|
	using Request = std::variant<
 | 
						|
	    ModifyTitleRequest,
 | 
						|
	    ModifyResolutionRequest,
 | 
						|
	    ModifyPositionRequest,
 | 
						|
	    ModifyVisibilityRequest>;
 | 
						|
 | 
						|
#ifdef LIGHT_PLATFORM_LINUX
 | 
						|
	struct NativeData
 | 
						|
	{
 | 
						|
		Display *display;
 | 
						|
		uint32_t window;
 | 
						|
		unsigned long wm_delete_message;
 | 
						|
	};
 | 
						|
#endif
 | 
						|
 | 
						|
	static constexpr auto max_dimension = 4096;
 | 
						|
 | 
						|
	static constexpr auto max_title_length = 256;
 | 
						|
 | 
						|
	struct CreateInfo
 | 
						|
	{
 | 
						|
		std::string_view title;
 | 
						|
 | 
						|
		math::uvec2 resolution;
 | 
						|
 | 
						|
		bool vsync;
 | 
						|
 | 
						|
		bool visible;
 | 
						|
	};
 | 
						|
 | 
						|
	SurfaceComponent(const CreateInfo &info)
 | 
						|
	    : m_title(info.title)
 | 
						|
	    , m_resolution(info.resolution)
 | 
						|
	    , m_vsync(info.vsync)
 | 
						|
	    , m_visible(info.visible)
 | 
						|
	    , m_native_data({})
 | 
						|
	{
 | 
						|
	}
 | 
						|
 | 
						|
	[[nodiscard]] auto get_title() const -> std::string_view
 | 
						|
	{
 | 
						|
		return m_title;
 | 
						|
	}
 | 
						|
 | 
						|
	[[nodiscard]] auto get_resolution() const -> const math::uvec2 &
 | 
						|
	{
 | 
						|
		return m_resolution;
 | 
						|
	}
 | 
						|
 | 
						|
	[[nodiscard]] auto get_position() const -> const math::ivec2 &
 | 
						|
	{
 | 
						|
		return m_position;
 | 
						|
	}
 | 
						|
 | 
						|
	[[nodiscard]] auto is_vsync() const -> bool
 | 
						|
	{
 | 
						|
		return m_vsync;
 | 
						|
	}
 | 
						|
 | 
						|
	[[nodiscard]] auto is_visible() const -> bool
 | 
						|
	{
 | 
						|
		return m_visible;
 | 
						|
	}
 | 
						|
 | 
						|
	[[nodiscard]] auto get_native_data() const -> const NativeData &
 | 
						|
	{
 | 
						|
		return m_native_data;
 | 
						|
	}
 | 
						|
 | 
						|
	[[nodiscard]] auto peek_events() const -> const std::vector<Event> &
 | 
						|
	{
 | 
						|
		return m_event_queue;
 | 
						|
	}
 | 
						|
 | 
						|
	[[nodiscard]] auto peek_requests() const -> const std::vector<Request> &
 | 
						|
	{
 | 
						|
		return m_requests;
 | 
						|
	};
 | 
						|
 | 
						|
	void push_request(const Request &request)
 | 
						|
	{
 | 
						|
		m_requests.emplace_back(request);
 | 
						|
	}
 | 
						|
 | 
						|
	/** @note: Only the surface system and tests should push events */
 | 
						|
	void push_event(const Event &event)
 | 
						|
	{
 | 
						|
		m_event_queue.emplace_back(event);
 | 
						|
	}
 | 
						|
 | 
						|
private:
 | 
						|
	std::string m_title;
 | 
						|
 | 
						|
	math::uvec2 m_resolution;
 | 
						|
 | 
						|
	math::ivec2 m_position;
 | 
						|
 | 
						|
	bool m_vsync;
 | 
						|
 | 
						|
	bool m_visible;
 | 
						|
 | 
						|
	NativeData m_native_data;
 | 
						|
 | 
						|
	std::vector<Event> m_event_queue;
 | 
						|
 | 
						|
	std::vector<Request> m_requests;
 | 
						|
};
 | 
						|
 | 
						|
} // namespace lt::surface
 |