diff options
| author | Nicolas James <Eele1Ephe7uZahRie@tutanota.com> | 2025-02-12 18:05:18 +1100 |
|---|---|---|
| committer | Nicolas James <Eele1Ephe7uZahRie@tutanota.com> | 2025-02-12 18:05:18 +1100 |
| commit | 1cc08c51eb4b0f95c30c0a98ad1fc5ad3459b2df (patch) | |
| tree | 222dfcd07a1e40716127a347bbfd7119ce3d0984 /src/client/input.cc | |
initial commit
Diffstat (limited to 'src/client/input.cc')
| -rw-r--r-- | src/client/input.cc | 111 |
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 |
