From ddf063d83b74022886141965a43aef1d0e051c41 Mon Sep 17 00:00:00 2001
From: namark <namark@disroot.org>
Date: Sun, 29 Nov 2020 17:38:35 +0400
Subject: [PATCH] Text input and pointer events.

---
 source/simple/interactive/event.cpp | 56 +++++++++++++++++++++++++++++
 source/simple/interactive/event.h   | 33 ++++++++++++++++-
 2 files changed, 88 insertions(+), 1 deletion(-)

diff --git a/source/simple/interactive/event.cpp b/source/simple/interactive/event.cpp
index 1efd366..fd1035d 100644
--- a/source/simple/interactive/event.cpp
+++ b/source/simple/interactive/event.cpp
@@ -5,6 +5,17 @@ using simple::geom::vector;
 
 namespace simple::interactive
 {
+	template <typename T, size_t N, size_t... I>
+	constexpr auto copy_array_n(T(&arr)[N], std::index_sequence<I...>)
+	{
+		return std::array{arr[I]...};
+	}
+
+	template <typename T, size_t N>
+	constexpr auto to_array(T(&arr)[N])
+	{
+		return copy_array_n(arr, std::make_index_sequence<N>{});
+	}
 
 	template <typename WindowEvent>
 	auto make_window_event(const SDL_Event& event)
@@ -99,6 +110,51 @@ namespace simple::interactive
 						static_cast<wheel_direction>(event.wheel.direction),
 #endif
 					};
+				case SDL_TEXTINPUT:
+					return text_input
+					{
+						std::chrono::milliseconds(event.text.timestamp),
+						event.text.windowID,
+						to_array(event.text.text)
+					};
+				case SDL_TEXTEDITING:
+					return text_edit
+					{
+						std::chrono::milliseconds(event.edit.timestamp),
+						event.edit.windowID,
+						to_array(event.edit.text),
+						{event.edit.start, event.edit.start + event.edit.length}
+					};
+				case SDL_FINGERMOTION:
+					return pointer_motion
+					{
+						std::chrono::milliseconds(event.tfinger.timestamp),
+						event.tfinger.touchId,
+						event.tfinger.fingerId,
+						{event.tfinger.x, event.tfinger.y},
+						{event.tfinger.dx, event.tfinger.dy},
+						event.tfinger.pressure
+					};
+				case SDL_FINGERDOWN:
+					return pointer_down
+					{
+						std::chrono::milliseconds(event.tfinger.timestamp),
+						event.tfinger.touchId,
+						event.tfinger.fingerId,
+						{event.tfinger.x, event.tfinger.y},
+						{event.tfinger.dx, event.tfinger.dy},
+						event.tfinger.pressure
+					};
+				case SDL_FINGERUP:
+					return pointer_up
+					{
+						std::chrono::milliseconds(event.tfinger.timestamp),
+						event.tfinger.touchId,
+						event.tfinger.fingerId,
+						{event.tfinger.x, event.tfinger.y},
+						{event.tfinger.dx, event.tfinger.dy},
+						event.tfinger.pressure
+					};
 
 				case SDL_WINDOWEVENT: switch(event.window.event)
 				{
diff --git a/source/simple/interactive/event.h b/source/simple/interactive/event.h
index fa63461..198e799 100644
--- a/source/simple/interactive/event.h
+++ b/source/simple/interactive/event.h
@@ -68,7 +68,7 @@ namespace simple::interactive
 
 	struct mouse_data : public window_event_data
 	{
-		uint32_t mouse_id;
+		uint32_t device_id;
 		int2 position;
 	};
 
@@ -94,6 +94,25 @@ namespace simple::interactive
 #endif
 	};
 
+	struct text_input_data : public window_event_data
+	{
+		std::array<char, 32> text;
+	};
+
+	struct text_edit_data : public text_input_data
+	{
+		simple::support::range<int> edit_range;
+	};
+
+	struct pointer_data : public event_data
+	{
+		int64_t device_id;
+		int64_t pointer_id;
+		float2 position;
+		float2 motion;
+		float pressure;
+	};
+
 	struct key_event
 	{
 		const key_data data;
@@ -142,6 +161,13 @@ namespace simple::interactive
 	struct mouse_up : public mouse_button_event
 	{};
 
+	struct text_input { const text_input_data data; };
+	struct text_edit { const text_edit_data data; };
+
+	struct pointer_motion { const pointer_data data; };
+	struct pointer_down { const pointer_data data; };
+	struct pointer_up { const pointer_data data; };
+
 	struct quit_request { const event_data data; };
 
 	// TODO: screen normalized position/size getters as with mouse?
@@ -173,6 +199,11 @@ namespace simple::interactive
 		,mouse_up
 		,mouse_motion
 		,mouse_wheel
+		,text_input
+		,text_edit
+		,pointer_motion
+		,pointer_down
+		,pointer_up
 		,quit_request
 
 		,window_shown
-- 
GitLab