From 1aa4989e5ea04e88a5d79f3073af2d2fc76bfc2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 26 May 2019 23:11:57 +0200 Subject: [PATCH] Platform: expose raw event structures in EmscriptenApplication. Also store them as references and not pointers. --- src/Magnum/Platform/EmscriptenApplication.cpp | 74 +++++++++---------- src/Magnum/Platform/EmscriptenApplication.h | 43 ++++++++--- 2 files changed, 70 insertions(+), 47 deletions(-) diff --git a/src/Magnum/Platform/EmscriptenApplication.cpp b/src/Magnum/Platform/EmscriptenApplication.cpp index 84d463675..13fd92761 100644 --- a/src/Magnum/Platform/EmscriptenApplication.cpp +++ b/src/Magnum/Platform/EmscriptenApplication.cpp @@ -400,7 +400,7 @@ void EmscriptenApplication::setupCallbacks(bool resizable) { #else const char* target = "#window"; #endif - auto cb = [](int, const EmscriptenUiEvent*, void* userData) -> Int { + auto cb = [](int, const EmscriptenUiEvent* event, void* userData) -> Int { EmscriptenApplication& app = *static_cast(userData); /* See windowSize() for why we hardcode "#canvas" here */ const Vector2i canvasSize{app.windowSize()}; @@ -408,7 +408,7 @@ void EmscriptenApplication::setupCallbacks(bool resizable) { app._lastKnownCanvasSize = canvasSize; const Vector2i size = canvasSize*app._dpiScaling*app._devicePixelRatio; emscripten_set_canvas_element_size("#canvas", size.x(), size.y()); - ViewportEvent e{canvasSize, + ViewportEvent e{*event, canvasSize, #ifdef MAGNUM_TARGET_GL app.framebufferSize(), #endif @@ -425,28 +425,28 @@ void EmscriptenApplication::setupCallbacks(bool resizable) { emscripten_set_mousedown_callback("#canvas", this, false, ([](int, const EmscriptenMouseEvent* event, void* userData) -> Int { - MouseEvent e{event}; + MouseEvent e{*event}; static_cast(userData)->mousePressEvent(e); return e.isAccepted(); })); emscripten_set_mouseup_callback("#canvas", this, false, ([](int, const EmscriptenMouseEvent* event, void* userData) -> Int { - MouseEvent e{event}; + MouseEvent e{*event}; static_cast(userData)->mouseReleaseEvent(e); return e.isAccepted(); })); emscripten_set_mousemove_callback("#canvas", this, false, ([](int, const EmscriptenMouseEvent* event, void* userData) -> Int { - MouseMoveEvent e{event}; + MouseMoveEvent e{*event}; static_cast(userData)->mouseMoveEvent(e); return e.isAccepted(); })); emscripten_set_wheel_callback("#canvas", this, false, ([](int, const EmscriptenWheelEvent* event, void* userData) -> Int { - MouseScrollEvent e{event}; + MouseScrollEvent e{*event}; static_cast(userData)->mouseScrollEvent(e); return e.isAccepted(); })); @@ -498,18 +498,18 @@ void EmscriptenApplication::setupCallbacks(bool resizable) { ([](int, const EmscriptenKeyboardEvent* event, void* userData) -> Int { EmscriptenApplication& app = *static_cast(userData); if(app.isTextInputActive() && std::strlen(event->key) == 1) { - TextInputEvent e{{event->key, 1}}; + TextInputEvent e{*event, {event->key, 1}}; app.textInputEvent(e); return e.isAccepted(); } - KeyEvent e{event}; + KeyEvent e{*event}; app.keyPressEvent(e); return e.isAccepted(); })); emscripten_set_keyup_callback(keyboardListeningElement, this, false, ([](int, const EmscriptenKeyboardEvent* event, void* userData) -> Int { - KeyEvent e{event}; + KeyEvent e{*event}; static_cast(userData)->keyReleaseEvent(e); return e.isAccepted(); })); @@ -567,36 +567,36 @@ void EmscriptenApplication::exit(int) { } EmscriptenApplication::MouseEvent::Button EmscriptenApplication::MouseEvent::button() const { - return Button(_event->button); + return Button(_event.button); } Vector2i EmscriptenApplication::MouseEvent::position() const { - return {Int(_event->canvasX), Int(_event->canvasY)}; + return {Int(_event.canvasX), Int(_event.canvasY)}; } EmscriptenApplication::MouseEvent::Modifiers EmscriptenApplication::MouseEvent::modifiers() const { Modifiers m; - if(_event->ctrlKey) m |= Modifier::Ctrl; - if(_event->shiftKey) m |= Modifier::Shift; - if(_event->altKey) m |= Modifier::Alt; - if(_event->metaKey) m |= Modifier::Super; + if(_event.ctrlKey) m |= Modifier::Ctrl; + if(_event.shiftKey) m |= Modifier::Shift; + if(_event.altKey) m |= Modifier::Alt; + if(_event.metaKey) m |= Modifier::Super; return m; } EmscriptenApplication::MouseMoveEvent::Buttons EmscriptenApplication::MouseMoveEvent::buttons() const { - return EmscriptenApplication::MouseMoveEvent::Button(_event->buttons); + return EmscriptenApplication::MouseMoveEvent::Button(_event.buttons); } Vector2i EmscriptenApplication::MouseMoveEvent::position() const { - return {Int(_event->canvasX), Int(_event->canvasY)}; + return {Int(_event.canvasX), Int(_event.canvasY)}; } EmscriptenApplication::MouseMoveEvent::Modifiers EmscriptenApplication::MouseMoveEvent::modifiers() const { Modifiers m; - if(_event->ctrlKey) m |= Modifier::Ctrl; - if(_event->shiftKey) m |= Modifier::Shift; - if(_event->altKey) m |= Modifier::Alt; - if(_event->metaKey) m |= Modifier::Super; + if(_event.ctrlKey) m |= Modifier::Ctrl; + if(_event.shiftKey) m |= Modifier::Shift; + if(_event.altKey) m |= Modifier::Alt; + if(_event.metaKey) m |= Modifier::Super; return m; } @@ -607,42 +607,42 @@ Vector2 EmscriptenApplication::MouseScrollEvent::offset() const { DOM_DELTA_PIXEL => 100 pixels = 1 step DOM_DELTA_LINE => 3 lines = 1 step DOM_DELTA_PAGE => 1 page = 80 steps */ - const Float f = (_event->deltaMode == DOM_DELTA_PIXEL) ? -0.01f : - ((_event->deltaMode == DOM_DELTA_LINE) ? -1.0f/3.0f : -80.0f); + const Float f = (_event.deltaMode == DOM_DELTA_PIXEL) ? -0.01f : + ((_event.deltaMode == DOM_DELTA_LINE) ? -1.0f/3.0f : -80.0f); - return {f*Float(_event->deltaX), f*Float(_event->deltaY)}; + return {f*Float(_event.deltaX), f*Float(_event.deltaY)}; } Vector2i EmscriptenApplication::MouseScrollEvent::position() const { - return {Int(_event->mouse.canvasX), Int(_event->mouse.canvasY)}; + return {Int(_event.mouse.canvasX), Int(_event.mouse.canvasY)}; } EmscriptenApplication::InputEvent::Modifiers EmscriptenApplication::MouseScrollEvent::modifiers() const { Modifiers m; - if(_event->mouse.ctrlKey) m |= Modifier::Ctrl; - if(_event->mouse.shiftKey) m |= Modifier::Shift; - if(_event->mouse.altKey) m |= Modifier::Alt; - if(_event->mouse.metaKey) m |= Modifier::Super; + if(_event.mouse.ctrlKey) m |= Modifier::Ctrl; + if(_event.mouse.shiftKey) m |= Modifier::Shift; + if(_event.mouse.altKey) m |= Modifier::Alt; + if(_event.mouse.metaKey) m |= Modifier::Super; return m; } Key EmscriptenApplication::KeyEvent::key() const { - return toKey(_event->key, _event->code); + return toKey(_event.key, _event.code); } std::string EmscriptenApplication::KeyEvent::keyName() const { - if((_event->key[0] >= 'a' && _event->key[0] <= 'z') || - (_event->key[0] >= 'A' && _event->key[0] <= 'Z')) return _event->key; + if((_event.key[0] >= 'a' && _event.key[0] <= 'z') || + (_event.key[0] >= 'A' && _event.key[0] <= 'Z')) return _event.key; - return _event->code; + return _event.code; } EmscriptenApplication::InputEvent::Modifiers EmscriptenApplication::KeyEvent::modifiers() const { Modifiers m; - if(_event->ctrlKey) m |= Modifier::Ctrl; - if(_event->shiftKey) m |= Modifier::Shift; - if(_event->altKey) m |= Modifier::Alt; - if(_event->metaKey) m |= Modifier::Super; + if(_event.ctrlKey) m |= Modifier::Ctrl; + if(_event.shiftKey) m |= Modifier::Shift; + if(_event.altKey) m |= Modifier::Alt; + if(_event.metaKey) m |= Modifier::Super; return m; } diff --git a/src/Magnum/Platform/EmscriptenApplication.h b/src/Magnum/Platform/EmscriptenApplication.h index a8a12eef4..d01e31648 100644 --- a/src/Magnum/Platform/EmscriptenApplication.h +++ b/src/Magnum/Platform/EmscriptenApplication.h @@ -48,6 +48,7 @@ struct EmscriptenKeyboardEvent; struct EmscriptenMouseEvent; struct EmscriptenWheelEvent; +struct EmscriptenUiEvent; #endif namespace Magnum { namespace Platform { @@ -980,20 +981,26 @@ class EmscriptenApplication::ViewportEvent { */ Vector2 devicePixelRatio() const { return _devicePixelRatio; } + /** @brief Underlying Emscripten event */ + const EmscriptenUiEvent& event() const { return _event; } + private: friend EmscriptenApplication; - explicit ViewportEvent(const Vector2i& windowSize, + explicit ViewportEvent(const EmscriptenUiEvent& event, + const Vector2i& windowSize, #ifdef MAGNUM_TARGET_GL const Vector2i& framebufferSize, #endif const Vector2& dpiScaling, const Vector2& devicePixelRatio): + _event{event}, _windowSize{windowSize}, #ifdef MAGNUM_TARGET_GL _framebufferSize{framebufferSize}, #endif _dpiScaling{dpiScaling}, _devicePixelRatio{devicePixelRatio} {} + const EmscriptenUiEvent& _event; const Vector2i _windowSize; #ifdef MAGNUM_TARGET_GL const Vector2i _framebufferSize; @@ -1115,12 +1122,15 @@ class EmscriptenApplication::MouseEvent: public EmscriptenApplication::InputEven /** @brief Modifiers */ Modifiers modifiers() const; + /** @brief Underlying Emscripten event */ + const EmscriptenMouseEvent& event() const { return _event; } + private: friend EmscriptenApplication; - explicit MouseEvent(const EmscriptenMouseEvent* event): _event(event) {} + explicit MouseEvent(const EmscriptenMouseEvent& event): _event(event) {} - const EmscriptenMouseEvent* const _event; + const EmscriptenMouseEvent& _event; }; /** @@ -1162,12 +1172,15 @@ class EmscriptenApplication::MouseMoveEvent: public EmscriptenApplication::Input /** @brief Modifiers */ Modifiers modifiers() const; + /** @brief Underlying Emscripten event */ + const EmscriptenMouseEvent& event() const { return _event; } + private: friend EmscriptenApplication; - explicit MouseMoveEvent(const EmscriptenMouseEvent* event): _event{event} {} + explicit MouseMoveEvent(const EmscriptenMouseEvent& event): _event(event) {} - const EmscriptenMouseEvent* const _event; + const EmscriptenMouseEvent& _event; }; CORRADE_ENUMSET_OPERATORS(EmscriptenApplication::MouseMoveEvent::Buttons) @@ -1188,12 +1201,15 @@ class EmscriptenApplication::MouseScrollEvent: public EmscriptenApplication::Inp /** @brief Modifiers */ Modifiers modifiers() const; + /** @brief Underlying Emscripten event */ + const EmscriptenWheelEvent& event() const { return _event; } + private: friend EmscriptenApplication; - explicit MouseScrollEvent(const EmscriptenWheelEvent* event): _event{event} {} + explicit MouseScrollEvent(const EmscriptenWheelEvent& event): _event(event) {} - const EmscriptenWheelEvent* const _event; + const EmscriptenWheelEvent& _event; }; /** @@ -1394,12 +1410,15 @@ class EmscriptenApplication::KeyEvent: public EmscriptenApplication::InputEvent /** @brief Modifiers */ Modifiers modifiers() const; + /** @brief Underlying Emscripten event */ + const EmscriptenKeyboardEvent& event() const { return _event; } + private: friend EmscriptenApplication; - explicit KeyEvent(const EmscriptenKeyboardEvent* event): _event{event} {} + explicit KeyEvent(const EmscriptenKeyboardEvent& event): _event(event) {} - const EmscriptenKeyboardEvent* const _event; + const EmscriptenKeyboardEvent& _event; }; /** @@ -1430,11 +1449,15 @@ class EmscriptenApplication::TextInputEvent { /** @brief Input text in UTF-8 */ Containers::ArrayView text() const { return _text; } + /** @brief Underlying Emscripten event */ + const EmscriptenKeyboardEvent& event() const { return _event; } + private: friend EmscriptenApplication; - explicit TextInputEvent(Containers::ArrayView text): _text{text}, _accepted{false} {} + explicit TextInputEvent(const EmscriptenKeyboardEvent& event, Containers::ArrayView text): _event(event), _text{text}, _accepted{false} {} + const EmscriptenKeyboardEvent& _event; const Containers::ArrayView _text; bool _accepted; };