/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* inputs.h :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/05 16:27:35 by maldavid #+# #+# */ /* Updated: 2023/12/08 18:54:03 by kbz_8 ### ########.fr */ /* */ /* ************************************************************************** */ #include #include #include #include #include #include #include #include #include "window.h" namespace mlx { enum class action : uint8_t { up = (1 << 1), down = (1 << 2) }; struct Hook { std::function hook; void* param = nullptr; }; class MLX_API Input { public: Input(); void update(); inline bool getInKey(const SDL_Scancode key, action type = action::down) const noexcept { return _keys[key] & static_cast(type); } inline bool getInMouse(const uint8_t button, action type = action::down) const noexcept { return _mouse[button] & static_cast(type); } inline bool isMouseMoving() const noexcept { return _xRel || _yRel; } inline int getX() const noexcept { return _x; } inline int getY() const noexcept { return _y; } inline int getXRel() const noexcept { return _xRel; } inline int getYRel() const noexcept { return _yRel; } inline bool is_running() const noexcept { return !_end; } inline constexpr void finish() noexcept { _end = true; } inline void addWindow(std::shared_ptr window) { _windows[window->getID()] = window; _events_hooks[window->getID()] = {}; } inline void onEvent(uint32_t id, int event, int (*funct_ptr)(int, void*), void* param) noexcept { _events_hooks[id][event].hook = funct_ptr; _events_hooks[id][event].param = param; } ~Input() = default; private: std::array _keys; std::unordered_map> _windows; std::unordered_map> _events_hooks; SDL_Event _event; std::array _mouse; int _x = 0; int _y = 0; int _xRel = 0; int _yRel = 0; bool _end = false; }; }