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
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<EmscriptenApplication*>(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<EmscriptenApplication*>(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<EmscriptenApplication*>(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<EmscriptenApplication*>(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<EmscriptenApplication*>(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<EmscriptenApplication*>(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<EmscriptenApplication*>(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;
}

43
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<const char> text() const { return _text; }
/** @brief Underlying Emscripten event */
const EmscriptenKeyboardEvent& event() const { return _event; }
private:
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;
bool _accepted;
};

Loading…
Cancel
Save