diff --git a/external/Optional/optional.hpp b/external/Optional/optional.hpp index 82c995acc..9b0f4b833 100644 --- a/external/Optional/optional.hpp +++ b/external/Optional/optional.hpp @@ -190,6 +190,8 @@ template inline constexpr typename std::remove_reference::type&& co { # if defined(EMSCRIPTEN) && EMSCRIPTEN __assert_fail(expr, file, line, ""); + # elif defined __native_client__ + __assert(expr, line, file); // WHY. # elif defined __clang__ || defined __GNU_LIBRARY__ __assert(expr, file, line); # elif defined __GNUC__ diff --git a/src/Platform/NaClApplication.cpp b/src/Platform/NaClApplication.cpp index 15ac0c1c3..6a8c28b4c 100644 --- a/src/Platform/NaClApplication.cpp +++ b/src/Platform/NaClApplication.cpp @@ -34,6 +34,13 @@ namespace Magnum { namespace Platform { +static_assert(NaClApplication::MouseEvent::Button::WheelUp != NaClApplication::MouseEvent::Button::Left && + NaClApplication::MouseEvent::Button::WheelUp != NaClApplication::MouseEvent::Button::Middle && + NaClApplication::MouseEvent::Button::WheelUp != NaClApplication::MouseEvent::Button::Right && + NaClApplication::MouseEvent::Button::WheelDown != NaClApplication::MouseEvent::Button::Left && + NaClApplication::MouseEvent::Button::WheelDown != NaClApplication::MouseEvent::Button::Middle && + NaClApplication::MouseEvent::Button::WheelDown != NaClApplication::MouseEvent::Button::Right, ""); + struct NaClApplication::ConsoleDebugOutput { explicit ConsoleDebugOutput(pp::Instance* instance); @@ -201,6 +208,15 @@ bool NaClApplication::HandleInputEvent(const pp::InputEvent& event) { break; } + case PP_INPUTEVENT_TYPE_WHEEL: { + pp::WheelInputEvent wheelEvent(event); + if(Math::TypeTraits::equals(wheelEvent.GetDelta().y(), 0.0f)) return false; + MouseEvent e(wheelEvent.GetDelta().y() > 0 ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, {}, static_cast(wheelEvent.GetModifiers())); + mousePressEvent(e); + if(!e.isAccepted()) return false; + break; + } + case PP_INPUTEVENT_TYPE_MOUSEMOVE: { pp::MouseInputEvent mouseEvent(event); MouseMoveEvent e({mouseEvent.GetPosition().x(), mouseEvent.GetPosition().y()}, {mouseEvent.GetMovement().x(), mouseEvent.GetMovement().y()}, static_cast(mouseEvent.GetModifiers())); diff --git a/src/Platform/NaClApplication.h b/src/Platform/NaClApplication.h index c629ac9d6..394debc62 100644 --- a/src/Platform/NaClApplication.h +++ b/src/Platform/NaClApplication.h @@ -624,13 +624,21 @@ class NaClApplication::MouseEvent: public NaClApplication::InputEvent { enum class Button: unsigned int { Left = PP_INPUTEVENT_MOUSEBUTTON_LEFT, /**< Left button */ Middle = PP_INPUTEVENT_MOUSEBUTTON_MIDDLE, /**< Middle button */ - Right = PP_INPUTEVENT_MOUSEBUTTON_RIGHT /**< Right button */ + Right = PP_INPUTEVENT_MOUSEBUTTON_RIGHT, /**< Right button */ + WheelUp = 0xFFFF01, /**< Wheel up */ + WheelDown = 0xFFFF02 /**< Wheel down */ }; /** @brief Button */ constexpr Button button() const { return _button; } - /** @brief Position */ + /** + * @brief Position + * + * @attention Note that due to the way the @ref Button::WheelUp and + * @ref Button::WheelDown events are handled by Native Client, the + * position information is not available, i.e. it is set to zero. + */ constexpr Vector2i position() const { return _position; } private: