Browse Source

Done mousePressEvent() and mouseReleaseEvent()

pull/527/head
nodoteve 5 years ago
parent
commit
6566b83dee
  1. 45
      src/Magnum/Platform/AndroidApplication.cpp
  2. 32
      src/Magnum/Platform/AndroidApplication.h

45
src/Magnum/Platform/AndroidApplication.cpp

@ -251,7 +251,7 @@ std::int32_t AndroidApplication::inputEvent(android_app* state, AInputEvent* eve
/* On a touch screen move events aren't reported when the
finger is moving above (of course), so remember the position
always */
app._previousMouseMovePosition = {Int(AMotionEvent_getX(event, 0)), Int(AMotionEvent_getY(event, 0))};
app._previousMouseMovePosition[0] = {Int(AMotionEvent_getX(event, 0)), Int(AMotionEvent_getY(event, 0))};
MouseEvent e(event);
action == AMOTION_EVENT_ACTION_DOWN ? app.mousePressEvent(e) : app.mouseReleaseEvent(e);
return e.isAccepted() ? 1 : 0;
@ -260,12 +260,49 @@ std::int32_t AndroidApplication::inputEvent(android_app* state, AInputEvent* eve
case AMOTION_EVENT_ACTION_MOVE: {
Vector2i position{Int(AMotionEvent_getX(event, 0)), Int(AMotionEvent_getY(event, 0))};
MouseMoveEvent e{event,
app._previousMouseMovePosition == Vector2i{-1} ? Vector2i{} :
position - app._previousMouseMovePosition};
app._previousMouseMovePosition = position;
app._previousMouseMovePosition[0] == Vector2i{-1} ? Vector2i{} :
position - app._previousMouseMovePosition[0]};
app._previousMouseMovePosition[0] = position;
app.mouseMoveEvent(e);
return e.isAccepted() ? 1 : 0;
}
/* Look here:
https://android-developers.googleblog.com/2010/06/making-sense-of-multitouch.html
for ACTION_POINTER_UP and ACTION_POINTER_DOWN */
case AMOTION_EVENT_ACTION_POINTER_DOWN:
case AMOTION_EVENT_ACTION_POINTER_UP: {
// Extract the index of the pointer that left the touch sensor
// ! Don't mix up AMotionEvent_getAction(event) and 'action' !
const std::size_t pointerIndex = (AMotionEvent_getAction(event) & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
>> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
const std::size_t pointerCount = AMotionEvent_getPointerCount(event);
// Get the persistent id from the index
std::int32_t pointerId = AMotionEvent_getPointerId(event, pointerIndex);
/* Do we need an assert or something like unordered_map in case of (pointerId < 0) or (pointerId > 2^(~20))
or we can just trust AMotionEvent_getPointerId() ?
Btw, looks like 'pointerIndex' works well.
*/
pointerId = (pointerId < 0 ? 0 : (size_t)pointerId);
if(pointerId >= arraySize(app._previousMouseMovePosition))
Containers::arrayAppend(app._previousMouseMovePosition,
{Int(AMotionEvent_getX(event, pointerIndex)),
Int(AMotionEvent_getY(event, pointerIndex))});
else
app._previousMouseMovePosition[pointerId] = {Int(AMotionEvent_getX(event, pointerIndex)),
Int(AMotionEvent_getY(event, pointerIndex))};
MouseEvent e(event, pointerIndex, pointerId);
action == AMOTION_EVENT_ACTION_POINTER_DOWN ?
app.mousePressEvent(e) : app.mouseReleaseEvent(e);
return e.isAccepted() ? 1 : 0;
}
}
/** @todo Implement also other input events */

32
src/Magnum/Platform/AndroidApplication.h

@ -40,6 +40,10 @@
#include "Magnum/Math/Vector4.h"
#include "Magnum/Platform/Platform.h"
//Is it ok?
#include "Corrade/Containers/Array.h"
#include "Corrade/Containers/GrowableArray.h"
#if defined(CORRADE_TARGET_ANDROID) || defined(DOXYGEN_GENERATING_OUTPUT)
#include <android/input.h>
@ -433,7 +437,11 @@ class AndroidApplication {
EGLDisplay _display;
EGLSurface _surface;
EGLContext _glContext;
Vector2i _previousMouseMovePosition{-1};
/* Create array from given value like here:
https://doc.magnum.graphics/corrade/classCorrade_1_1Containers_1_1Array.html
The exact number of pointers is unknown, isn't it?
*/
Containers::Array<Vector2i> _previousMouseMovePosition{Containers::InPlaceInit, {{-1,-1}}};
Containers::Pointer<Platform::GLContext> _context;
Containers::Pointer<LogOutput> _logOutput;
@ -710,12 +718,28 @@ class AndroidApplication::MouseEvent: public InputEvent {
/** @brief Position */
Vector2i position() {
return {Int(AMotionEvent_getX(_event, 0)),
Int(AMotionEvent_getY(_event, 0))};
return {Int(AMotionEvent_getX(_event, _pointerIndex)),
Int(AMotionEvent_getY(_event, _pointerIndex))};
}
/** @brief Pointer Index Do we need both of them?
* Index != Id
*/
std::size_t pointerIndex() const { return _pointerIndex; }
/** @brief Pointer Id
* Index != Id
*/
std::size_t pointerId() const { return _pointerId; }
private:
explicit MouseEvent(AInputEvent* event): InputEvent(event) {}
// Did it almost like MouseMoveEvent with _relativePosition
explicit MouseEvent(AInputEvent* event, std::size_t pointerIndex = 0, std::int32_t pointerId = 0):
/* why not {}, but () instead? */ InputEvent(event),
_pointerId{pointerId},_pointerIndex{pointerIndex} {}
const std::int32_t _pointerId;
const std::size_t _pointerIndex;
};
/**

Loading…
Cancel
Save