mirror of
https://github.com/SFML/SFML.git
synced 2024-11-25 04:41:05 +08:00
Merge pull request #646 from MarioLiebisch/android-keyevents
[Android] Rewrote key event handling
This commit is contained in:
commit
ca77ea58d0
@ -221,10 +221,13 @@ int WindowImplAndroid::processEvent(int fd, int events, void* data)
|
|||||||
if (type == AINPUT_EVENT_TYPE_KEY)
|
if (type == AINPUT_EVENT_TYPE_KEY)
|
||||||
{
|
{
|
||||||
int32_t action = AKeyEvent_getAction(_event);
|
int32_t action = AKeyEvent_getAction(_event);
|
||||||
|
int32_t key = AKeyEvent_getKeyCode(_event);
|
||||||
|
|
||||||
if (action == AKEY_EVENT_ACTION_DOWN || action == AKEY_EVENT_ACTION_UP || action == AKEY_EVENT_ACTION_MULTIPLE)
|
if ((action == AKEY_EVENT_ACTION_DOWN || action == AKEY_EVENT_ACTION_UP || action == AKEY_EVENT_ACTION_MULTIPLE) &&
|
||||||
|
key != AKEYCODE_VOLUME_UP && key != AKEYCODE_VOLUME_DOWN)
|
||||||
{
|
{
|
||||||
processKeyEvent(_event, states);
|
processKeyEvent(_event, states);
|
||||||
|
handled = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (type == AINPUT_EVENT_TYPE_MOTION)
|
else if (type == AINPUT_EVENT_TYPE_MOTION)
|
||||||
@ -236,6 +239,7 @@ int WindowImplAndroid::processEvent(int fd, int events, void* data)
|
|||||||
case AMOTION_EVENT_ACTION_SCROLL:
|
case AMOTION_EVENT_ACTION_SCROLL:
|
||||||
{
|
{
|
||||||
processScrollEvent(_event, states);
|
processScrollEvent(_event, states);
|
||||||
|
handled = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,6 +247,7 @@ int WindowImplAndroid::processEvent(int fd, int events, void* data)
|
|||||||
case AMOTION_EVENT_ACTION_MOVE:
|
case AMOTION_EVENT_ACTION_MOVE:
|
||||||
{
|
{
|
||||||
processMotionEvent(_event, states);
|
processMotionEvent(_event, states);
|
||||||
|
handled = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,6 +256,7 @@ int WindowImplAndroid::processEvent(int fd, int events, void* data)
|
|||||||
case AMOTION_EVENT_ACTION_DOWN:
|
case AMOTION_EVENT_ACTION_DOWN:
|
||||||
{
|
{
|
||||||
processPointerEvent(true, _event, states);
|
processPointerEvent(true, _event, states);
|
||||||
|
handled = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,13 +265,13 @@ int WindowImplAndroid::processEvent(int fd, int events, void* data)
|
|||||||
case AMOTION_EVENT_ACTION_CANCEL:
|
case AMOTION_EVENT_ACTION_CANCEL:
|
||||||
{
|
{
|
||||||
processPointerEvent(false, _event, states);
|
processPointerEvent(false, _event, states);
|
||||||
|
handled = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
handled = 1;
|
|
||||||
AInputQueue_finishEvent(states->inputQueue, _event, handled);
|
AInputQueue_finishEvent(states->inputQueue, _event, handled);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -340,20 +346,57 @@ void WindowImplAndroid::processKeyEvent(AInputEvent* _event, ActivityStates* sta
|
|||||||
int32_t metakey = AKeyEvent_getMetaState(_event);
|
int32_t metakey = AKeyEvent_getMetaState(_event);
|
||||||
|
|
||||||
Event event;
|
Event event;
|
||||||
event.type = (action == AKEY_EVENT_ACTION_DOWN) ? Event::KeyPressed : Event::KeyReleased;
|
|
||||||
event.key.code = androidKeyToSF(key);
|
event.key.code = androidKeyToSF(key);
|
||||||
event.key.alt = metakey & AMETA_ALT_ON;
|
event.key.alt = metakey & AMETA_ALT_ON;
|
||||||
event.key.control = false;
|
event.key.control = false;
|
||||||
event.key.shift = metakey & AMETA_SHIFT_ON;
|
event.key.shift = metakey & AMETA_SHIFT_ON;
|
||||||
|
|
||||||
forwardEvent(event);
|
switch (action)
|
||||||
|
|
||||||
if (int unicode = getUnicode(_event))
|
|
||||||
{
|
{
|
||||||
Event event;
|
case AKEY_EVENT_ACTION_DOWN:
|
||||||
event.type = Event::TextEntered;
|
event.type = Event::KeyPressed;
|
||||||
event.text.unicode = unicode;
|
|
||||||
forwardEvent(event);
|
forwardEvent(event);
|
||||||
|
break;
|
||||||
|
case AKEY_EVENT_ACTION_UP:
|
||||||
|
event.type = Event::KeyReleased;
|
||||||
|
forwardEvent(event);
|
||||||
|
|
||||||
|
if (int unicode = getUnicode(_event))
|
||||||
|
{
|
||||||
|
event.type = Event::TextEntered;
|
||||||
|
event.text.unicode = unicode;
|
||||||
|
forwardEvent(event);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case AKEY_EVENT_ACTION_MULTIPLE:
|
||||||
|
// Since complex inputs don't get separate key down/up events
|
||||||
|
// both have to be faked at once
|
||||||
|
event.type = Event::KeyPressed;
|
||||||
|
forwardEvent(event);
|
||||||
|
event.type = Event::KeyReleased;
|
||||||
|
forwardEvent(event);
|
||||||
|
|
||||||
|
// This requires some special treatment, since this might represent
|
||||||
|
// a repetition of key presses or a complete sequence
|
||||||
|
if (key == AKEYCODE_UNKNOWN)
|
||||||
|
{
|
||||||
|
// This is a unique sequence, which is not yet exposed in the NDK
|
||||||
|
// http://code.google.com/p/android/issues/detail?id=33998
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// This is a repeated sequence
|
||||||
|
if (int unicode = getUnicode(_event))
|
||||||
|
{
|
||||||
|
event.type = Event::TextEntered;
|
||||||
|
event.text.unicode = unicode;
|
||||||
|
|
||||||
|
int32_t repeats = AKeyEvent_getRepeatCount(_event);
|
||||||
|
for (int32_t i = 0; i < repeats; ++i)
|
||||||
|
forwardEvent(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -475,8 +518,8 @@ Keyboard::Key WindowImplAndroid::androidKeyToSF(int32_t key)
|
|||||||
case AKEYCODE_UNKNOWN :
|
case AKEYCODE_UNKNOWN :
|
||||||
case AKEYCODE_SOFT_LEFT :
|
case AKEYCODE_SOFT_LEFT :
|
||||||
case AKEYCODE_SOFT_RIGHT :
|
case AKEYCODE_SOFT_RIGHT :
|
||||||
case AKEYCODE_HOME :
|
case AKEYCODE_HOME : return Keyboard::Unknown;
|
||||||
case AKEYCODE_BACK :
|
case AKEYCODE_BACK : return Keyboard::Escape;
|
||||||
case AKEYCODE_CALL :
|
case AKEYCODE_CALL :
|
||||||
case AKEYCODE_ENDCALL : return Keyboard::Unknown;
|
case AKEYCODE_ENDCALL : return Keyboard::Unknown;
|
||||||
case AKEYCODE_0 : return Keyboard::Num0;
|
case AKEYCODE_0 : return Keyboard::Num0;
|
||||||
|
Loading…
Reference in New Issue
Block a user