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