aboutsummaryrefslogtreecommitdiff
path: root/src/client/input.cc
diff options
context:
space:
mode:
authorNicolas James <Eele1Ephe7uZahRie@tutanota.com>2025-02-12 18:05:18 +1100
committerNicolas James <Eele1Ephe7uZahRie@tutanota.com>2025-02-12 18:05:18 +1100
commit1cc08c51eb4b0f95c30c0a98ad1fc5ad3459b2df (patch)
tree222dfcd07a1e40716127a347bbfd7119ce3d0984 /src/client/input.cc
initial commit
Diffstat (limited to 'src/client/input.cc')
-rw-r--r--src/client/input.cc111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/client/input.cc b/src/client/input.cc
new file mode 100644
index 0000000..4a16a9e
--- /dev/null
+++ b/src/client/input.cc
@@ -0,0 +1,111 @@
+#include "client/input.hh"
+
+namespace {
+std::vector<client::input::event_callback> event_callbacks;
+
+struct keystate {
+ bool pressed;
+ bool toggled; // !'ed each keypress.
+};
+std::unordered_map<SDL_Keycode, keystate> keystates;
+} // namespace
+
+namespace client {
+namespace input {
+
+void set_mouse_position(const glm::ivec2& d) noexcept {
+ SDL_WarpMouseInWindow(client::render::get_sdl_window(), d.x, d.y);
+}
+
+void set_text_input(const bool should_start) noexcept {
+ if (should_start) {
+ SDL_StartTextInput();
+ } else {
+ SDL_StopTextInput();
+ state.text_input.clear();
+ }
+ state.typing = should_start;
+}
+
+void set_mouse_relative(const bool b) noexcept {
+ if (const int status = SDL_SetRelativeMouseMode(b ? SDL_TRUE : SDL_FALSE);
+ status != 0) {
+
+ throw std::runtime_error(SDL_GetError());
+ }
+}
+
+static void handle_press(const SDL_Event& event) noexcept {
+ keystate& ks = ::keystates[event.key.keysym.sym];
+
+ ks.pressed = true;
+ if (!event.key.repeat) {
+ ks.toggled = !ks.toggled;
+ }
+}
+
+static void handle_lift(const SDL_Event& event) noexcept {
+ keystate& ks = ::keystates[event.key.keysym.sym];
+ ks.pressed = false;
+}
+
+static void handle_windowevent(const SDL_Event& event) noexcept {
+ switch (event.window.event) {
+ case SDL_WINDOWEVENT_FOCUS_GAINED:
+ state.focused = true;
+ break;
+ case SDL_WINDOWEVENT_FOCUS_LOST:
+ state.focused = false;
+ break;
+ }
+}
+
+static void handle_textinput(const SDL_Event& event) noexcept {
+ state.text_input += event.text.text;
+}
+
+static void handle_quit(const SDL_Event&) noexcept { state.quit = true; }
+
+bool is_key_pressed(const SDL_Keycode& key) noexcept {
+ return ::keystates[key].pressed;
+}
+
+bool is_key_toggled(const SDL_Keycode& key) noexcept {
+ return ::keystates[key].toggled;
+}
+
+void register_event_handler(const event_callback& ec) noexcept {
+ ::event_callbacks.push_back(ec);
+}
+
+// definition of a fun function (not as fun anymore)
+void update() noexcept {
+ SDL_Event event;
+ while (SDL_PollEvent(&event)) {
+
+ switch (event.type) {
+ case SDL_WINDOWEVENT:
+ handle_windowevent(event);
+ break;
+ case SDL_TEXTINPUT:
+ handle_textinput(event);
+ break;
+ case SDL_QUIT:
+ handle_quit(event);
+ break;
+ case SDL_KEYDOWN:
+ handle_press(event);
+ break;
+ case SDL_KEYUP:
+ handle_lift(event);
+ break;
+ }
+
+ for (auto& callback : ::event_callbacks) {
+ callback(event);
+ }
+ }
+}
+
+} // namespace input
+} // namespace client