Browse Source

Platform: expose raw event structures in EmscriptenApplication.

Also store them as references and not pointers.
pull/300/head
Vladimír Vondruš 7 years ago
parent
commit
1aa4989e5e
  1. 74
      src/Magnum/Platform/EmscriptenApplication.cpp
  2. 43
      src/Magnum/Platform/EmscriptenApplication.h

74
src/Magnum/Platform/EmscriptenApplication.cpp

@ -400,7 +400,7 @@ void EmscriptenApplication::setupCallbacks(bool resizable) {
#else #else
const char* target = "#window"; const char* target = "#window";
#endif #endif
auto cb = [](int, const EmscriptenUiEvent*, void* userData) -> Int { auto cb = [](int, const EmscriptenUiEvent* event, void* userData) -> Int {
EmscriptenApplication& app = *static_cast<EmscriptenApplication*>(userData); EmscriptenApplication& app = *static_cast<EmscriptenApplication*>(userData);
/* See windowSize() for why we hardcode "#canvas" here */ /* See windowSize() for why we hardcode "#canvas" here */
const Vector2i canvasSize{app.windowSize()}; const Vector2i canvasSize{app.windowSize()};
@ -408,7 +408,7 @@ void EmscriptenApplication::setupCallbacks(bool resizable) {
app._lastKnownCanvasSize = canvasSize; app._lastKnownCanvasSize = canvasSize;
const Vector2i size = canvasSize*app._dpiScaling*app._devicePixelRatio; const Vector2i size = canvasSize*app._dpiScaling*app._devicePixelRatio;
emscripten_set_canvas_element_size("#canvas", size.x(), size.y()); emscripten_set_canvas_element_size("#canvas", size.x(), size.y());
ViewportEvent e{canvasSize, ViewportEvent e{*event, canvasSize,
#ifdef MAGNUM_TARGET_GL #ifdef MAGNUM_TARGET_GL
app.framebufferSize(), app.framebufferSize(),
#endif #endif
@ -425,28 +425,28 @@ void EmscriptenApplication::setupCallbacks(bool resizable) {
emscripten_set_mousedown_callback("#canvas", this, false, emscripten_set_mousedown_callback("#canvas", this, false,
([](int, const EmscriptenMouseEvent* event, void* userData) -> Int { ([](int, const EmscriptenMouseEvent* event, void* userData) -> Int {
MouseEvent e{event}; MouseEvent e{*event};
static_cast<EmscriptenApplication*>(userData)->mousePressEvent(e); static_cast<EmscriptenApplication*>(userData)->mousePressEvent(e);
return e.isAccepted(); return e.isAccepted();
})); }));
emscripten_set_mouseup_callback("#canvas", this, false, emscripten_set_mouseup_callback("#canvas", this, false,
([](int, const EmscriptenMouseEvent* event, void* userData) -> Int { ([](int, const EmscriptenMouseEvent* event, void* userData) -> Int {
MouseEvent e{event}; MouseEvent e{*event};
static_cast<EmscriptenApplication*>(userData)->mouseReleaseEvent(e); static_cast<EmscriptenApplication*>(userData)->mouseReleaseEvent(e);
return e.isAccepted(); return e.isAccepted();
})); }));
emscripten_set_mousemove_callback("#canvas", this, false, emscripten_set_mousemove_callback("#canvas", this, false,
([](int, const EmscriptenMouseEvent* event, void* userData) -> Int { ([](int, const EmscriptenMouseEvent* event, void* userData) -> Int {
MouseMoveEvent e{event}; MouseMoveEvent e{*event};
static_cast<EmscriptenApplication*>(userData)->mouseMoveEvent(e); static_cast<EmscriptenApplication*>(userData)->mouseMoveEvent(e);
return e.isAccepted(); return e.isAccepted();
})); }));
emscripten_set_wheel_callback("#canvas", this, false, emscripten_set_wheel_callback("#canvas", this, false,
([](int, const EmscriptenWheelEvent* event, void* userData) -> Int { ([](int, const EmscriptenWheelEvent* event, void* userData) -> Int {
MouseScrollEvent e{event}; MouseScrollEvent e{*event};
static_cast<EmscriptenApplication*>(userData)->mouseScrollEvent(e); static_cast<EmscriptenApplication*>(userData)->mouseScrollEvent(e);
return e.isAccepted(); return e.isAccepted();
})); }));
@ -498,18 +498,18 @@ void EmscriptenApplication::setupCallbacks(bool resizable) {
([](int, const EmscriptenKeyboardEvent* event, void* userData) -> Int { ([](int, const EmscriptenKeyboardEvent* event, void* userData) -> Int {
EmscriptenApplication& app = *static_cast<EmscriptenApplication*>(userData); EmscriptenApplication& app = *static_cast<EmscriptenApplication*>(userData);
if(app.isTextInputActive() && std::strlen(event->key) == 1) { if(app.isTextInputActive() && std::strlen(event->key) == 1) {
TextInputEvent e{{event->key, 1}}; TextInputEvent e{*event, {event->key, 1}};
app.textInputEvent(e); app.textInputEvent(e);
return e.isAccepted(); return e.isAccepted();
} }
KeyEvent e{event}; KeyEvent e{*event};
app.keyPressEvent(e); app.keyPressEvent(e);
return e.isAccepted(); return e.isAccepted();
})); }));
emscripten_set_keyup_callback(keyboardListeningElement, this, false, emscripten_set_keyup_callback(keyboardListeningElement, this, false,
([](int, const EmscriptenKeyboardEvent* event, void* userData) -> Int { ([](int, const EmscriptenKeyboardEvent* event, void* userData) -> Int {
KeyEvent e{event}; KeyEvent e{*event};
static_cast<EmscriptenApplication*>(userData)->keyReleaseEvent(e); static_cast<EmscriptenApplication*>(userData)->keyReleaseEvent(e);
return e.isAccepted(); return e.isAccepted();
})); }));
@ -567,36 +567,36 @@ void EmscriptenApplication::exit(int) {
} }
EmscriptenApplication::MouseEvent::Button EmscriptenApplication::MouseEvent::button() const { EmscriptenApplication::MouseEvent::Button EmscriptenApplication::MouseEvent::button() const {
return Button(_event->button); return Button(_event.button);
} }
Vector2i EmscriptenApplication::MouseEvent::position() const { 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 { EmscriptenApplication::MouseEvent::Modifiers EmscriptenApplication::MouseEvent::modifiers() const {
Modifiers m; Modifiers m;
if(_event->ctrlKey) m |= Modifier::Ctrl; if(_event.ctrlKey) m |= Modifier::Ctrl;
if(_event->shiftKey) m |= Modifier::Shift; if(_event.shiftKey) m |= Modifier::Shift;
if(_event->altKey) m |= Modifier::Alt; if(_event.altKey) m |= Modifier::Alt;
if(_event->metaKey) m |= Modifier::Super; if(_event.metaKey) m |= Modifier::Super;
return m; return m;
} }
EmscriptenApplication::MouseMoveEvent::Buttons EmscriptenApplication::MouseMoveEvent::buttons() const { EmscriptenApplication::MouseMoveEvent::Buttons EmscriptenApplication::MouseMoveEvent::buttons() const {
return EmscriptenApplication::MouseMoveEvent::Button(_event->buttons); return EmscriptenApplication::MouseMoveEvent::Button(_event.buttons);
} }
Vector2i EmscriptenApplication::MouseMoveEvent::position() const { 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 { EmscriptenApplication::MouseMoveEvent::Modifiers EmscriptenApplication::MouseMoveEvent::modifiers() const {
Modifiers m; Modifiers m;
if(_event->ctrlKey) m |= Modifier::Ctrl; if(_event.ctrlKey) m |= Modifier::Ctrl;
if(_event->shiftKey) m |= Modifier::Shift; if(_event.shiftKey) m |= Modifier::Shift;
if(_event->altKey) m |= Modifier::Alt; if(_event.altKey) m |= Modifier::Alt;
if(_event->metaKey) m |= Modifier::Super; if(_event.metaKey) m |= Modifier::Super;
return m; return m;
} }
@ -607,42 +607,42 @@ Vector2 EmscriptenApplication::MouseScrollEvent::offset() const {
DOM_DELTA_PIXEL => 100 pixels = 1 step DOM_DELTA_PIXEL => 100 pixels = 1 step
DOM_DELTA_LINE => 3 lines = 1 step DOM_DELTA_LINE => 3 lines = 1 step
DOM_DELTA_PAGE => 1 page = 80 steps */ DOM_DELTA_PAGE => 1 page = 80 steps */
const Float f = (_event->deltaMode == DOM_DELTA_PIXEL) ? -0.01f : const Float f = (_event.deltaMode == DOM_DELTA_PIXEL) ? -0.01f :
((_event->deltaMode == DOM_DELTA_LINE) ? -1.0f/3.0f : -80.0f); ((_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 { 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 { EmscriptenApplication::InputEvent::Modifiers EmscriptenApplication::MouseScrollEvent::modifiers() const {
Modifiers m; Modifiers m;
if(_event->mouse.ctrlKey) m |= Modifier::Ctrl; if(_event.mouse.ctrlKey) m |= Modifier::Ctrl;
if(_event->mouse.shiftKey) m |= Modifier::Shift; if(_event.mouse.shiftKey) m |= Modifier::Shift;
if(_event->mouse.altKey) m |= Modifier::Alt; if(_event.mouse.altKey) m |= Modifier::Alt;
if(_event->mouse.metaKey) m |= Modifier::Super; if(_event.mouse.metaKey) m |= Modifier::Super;
return m; return m;
} }
Key EmscriptenApplication::KeyEvent::key() const { Key EmscriptenApplication::KeyEvent::key() const {
return toKey(_event->key, _event->code); return toKey(_event.key, _event.code);
} }
std::string EmscriptenApplication::KeyEvent::keyName() const { std::string EmscriptenApplication::KeyEvent::keyName() const {
if((_event->key[0] >= 'a' && _event->key[0] <= 'z') || if((_event.key[0] >= 'a' && _event.key[0] <= 'z') ||
(_event->key[0] >= 'A' && _event->key[0] <= 'Z')) return _event->key; (_event.key[0] >= 'A' && _event.key[0] <= 'Z')) return _event.key;
return _event->code; return _event.code;
} }
EmscriptenApplication::InputEvent::Modifiers EmscriptenApplication::KeyEvent::modifiers() const { EmscriptenApplication::InputEvent::Modifiers EmscriptenApplication::KeyEvent::modifiers() const {
Modifiers m; Modifiers m;
if(_event->ctrlKey) m |= Modifier::Ctrl; if(_event.ctrlKey) m |= Modifier::Ctrl;
if(_event->shiftKey) m |= Modifier::Shift; if(_event.shiftKey) m |= Modifier::Shift;
if(_event->altKey) m |= Modifier::Alt; if(_event.altKey) m |= Modifier::Alt;
if(_event->metaKey) m |= Modifier::Super; if(_event.metaKey) m |= Modifier::Super;
return m; return m;
} }

43
src/Magnum/Platform/EmscriptenApplication.h

@ -48,6 +48,7 @@
struct EmscriptenKeyboardEvent; struct EmscriptenKeyboardEvent;
struct EmscriptenMouseEvent; struct EmscriptenMouseEvent;
struct EmscriptenWheelEvent; struct EmscriptenWheelEvent;
struct EmscriptenUiEvent;
#endif #endif
namespace Magnum { namespace Platform { namespace Magnum { namespace Platform {
@ -980,20 +981,26 @@ class EmscriptenApplication::ViewportEvent {
*/ */
Vector2 devicePixelRatio() const { return _devicePixelRatio; } Vector2 devicePixelRatio() const { return _devicePixelRatio; }
/** @brief Underlying Emscripten event */
const EmscriptenUiEvent& event() const { return _event; }
private: private:
friend EmscriptenApplication; friend EmscriptenApplication;
explicit ViewportEvent(const Vector2i& windowSize, explicit ViewportEvent(const EmscriptenUiEvent& event,
const Vector2i& windowSize,
#ifdef MAGNUM_TARGET_GL #ifdef MAGNUM_TARGET_GL
const Vector2i& framebufferSize, const Vector2i& framebufferSize,
#endif #endif
const Vector2& dpiScaling, const Vector2& devicePixelRatio): const Vector2& dpiScaling, const Vector2& devicePixelRatio):
_event{event},
_windowSize{windowSize}, _windowSize{windowSize},
#ifdef MAGNUM_TARGET_GL #ifdef MAGNUM_TARGET_GL
_framebufferSize{framebufferSize}, _framebufferSize{framebufferSize},
#endif #endif
_dpiScaling{dpiScaling}, _devicePixelRatio{devicePixelRatio} {} _dpiScaling{dpiScaling}, _devicePixelRatio{devicePixelRatio} {}
const EmscriptenUiEvent& _event;
const Vector2i _windowSize; const Vector2i _windowSize;
#ifdef MAGNUM_TARGET_GL #ifdef MAGNUM_TARGET_GL
const Vector2i _framebufferSize; const Vector2i _framebufferSize;
@ -1115,12 +1122,15 @@ class EmscriptenApplication::MouseEvent: public EmscriptenApplication::InputEven
/** @brief Modifiers */ /** @brief Modifiers */
Modifiers modifiers() const; Modifiers modifiers() const;
/** @brief Underlying Emscripten event */
const EmscriptenMouseEvent& event() const { return _event; }
private: private:
friend EmscriptenApplication; 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 */ /** @brief Modifiers */
Modifiers modifiers() const; Modifiers modifiers() const;
/** @brief Underlying Emscripten event */
const EmscriptenMouseEvent& event() const { return _event; }
private: private:
friend EmscriptenApplication; 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) CORRADE_ENUMSET_OPERATORS(EmscriptenApplication::MouseMoveEvent::Buttons)
@ -1188,12 +1201,15 @@ class EmscriptenApplication::MouseScrollEvent: public EmscriptenApplication::Inp
/** @brief Modifiers */ /** @brief Modifiers */
Modifiers modifiers() const; Modifiers modifiers() const;
/** @brief Underlying Emscripten event */
const EmscriptenWheelEvent& event() const { return _event; }
private: private:
friend EmscriptenApplication; 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 */ /** @brief Modifiers */
Modifiers modifiers() const; Modifiers modifiers() const;
/** @brief Underlying Emscripten event */
const EmscriptenKeyboardEvent& event() const { return _event; }
private: private:
friend EmscriptenApplication; 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 */ /** @brief Input text in UTF-8 */
Containers::ArrayView<const char> text() const { return _text; } Containers::ArrayView<const char> text() const { return _text; }
/** @brief Underlying Emscripten event */
const EmscriptenKeyboardEvent& event() const { return _event; }
private: private:
friend EmscriptenApplication; friend EmscriptenApplication;
explicit TextInputEvent(Containers::ArrayView<const char> text): _text{text}, _accepted{false} {} explicit TextInputEvent(const EmscriptenKeyboardEvent& event, Containers::ArrayView<const char> text): _event(event), _text{text}, _accepted{false} {}
const EmscriptenKeyboardEvent& _event;
const Containers::ArrayView<const char> _text; const Containers::ArrayView<const char> _text;
bool _accepted; bool _accepted;
}; };

Loading…
Cancel
Save