[Android] Implemented sf::TextEvent
This commit is contained in:
parent
634c3dc2a7
commit
2ab49ece2f
@ -323,6 +323,14 @@ int WindowImplAndroid::processEvent(int fd, int events, void* data)
|
|||||||
event.key.shift = metakey & AMETA_SHIFT_ON;
|
event.key.shift = metakey & AMETA_SHIFT_ON;
|
||||||
|
|
||||||
states->pendingEvents.push_back(event);
|
states->pendingEvents.push_back(event);
|
||||||
|
|
||||||
|
if (int unicode = getUnicode(_event))
|
||||||
|
{
|
||||||
|
Event event;
|
||||||
|
event.type = Event::TextEntered;
|
||||||
|
event.text.unicode = unicode;
|
||||||
|
states->pendingEvents.push_back(event);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (type == AINPUT_EVENT_TYPE_MOTION)
|
else if (type == AINPUT_EVENT_TYPE_MOTION)
|
||||||
@ -410,5 +418,54 @@ int WindowImplAndroid::processEvent(int fd, int events, void* data)
|
|||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int WindowImplAndroid::getUnicode(AInputEvent* event)
|
||||||
|
{
|
||||||
|
// Retrieve activity states
|
||||||
|
ActivityStates* states = getActivity(NULL);
|
||||||
|
Lock lock(states->mutex);
|
||||||
|
|
||||||
|
// Initializes JNI
|
||||||
|
jint lResult;
|
||||||
|
jint lFlags = 0;
|
||||||
|
|
||||||
|
JavaVM* lJavaVM = states->activity->vm;
|
||||||
|
JNIEnv* lJNIEnv = states->activity->env;
|
||||||
|
|
||||||
|
JavaVMAttachArgs lJavaVMAttachArgs;
|
||||||
|
lJavaVMAttachArgs.version = JNI_VERSION_1_6;
|
||||||
|
lJavaVMAttachArgs.name = "NativeThread";
|
||||||
|
lJavaVMAttachArgs.group = NULL;
|
||||||
|
|
||||||
|
lResult=lJavaVM->AttachCurrentThread(&lJNIEnv, &lJavaVMAttachArgs);
|
||||||
|
|
||||||
|
if (lResult == JNI_ERR)
|
||||||
|
err() << "Failed to initialize JNI, couldn't get the unicode value" << std::endl;
|
||||||
|
|
||||||
|
// Retrieve key data from the input event
|
||||||
|
jlong downTime = AKeyEvent_getDownTime(event);
|
||||||
|
jlong eventTime = AKeyEvent_getEventTime(event);
|
||||||
|
jint action = AKeyEvent_getAction(event);
|
||||||
|
jint code = AKeyEvent_getKeyCode(event);
|
||||||
|
jint repeat = AKeyEvent_getRepeatCount(event); // not sure!
|
||||||
|
jint metaState = AKeyEvent_getMetaState(event);
|
||||||
|
jint deviceId = AInputEvent_getDeviceId(event);
|
||||||
|
jint scancode = AKeyEvent_getScanCode(event);
|
||||||
|
jint flags = AKeyEvent_getFlags(event);
|
||||||
|
jint source = AInputEvent_getSource(event);
|
||||||
|
|
||||||
|
// Construct a KeyEvent object from the event data
|
||||||
|
jclass ClassKeyEvent = lJNIEnv->FindClass("android/view/KeyEvent");
|
||||||
|
jmethodID KeyEventConstructor = lJNIEnv->GetMethodID(ClassKeyEvent, "<init>", "(JJIIIIIIII)V");
|
||||||
|
jobject ObjectKeyEvent = lJNIEnv->NewObject(ClassKeyEvent, KeyEventConstructor, (jvalue*)downTime, (jvalue*)eventTime, (jvalue*)action, (jvalue*)code, (jvalue*)repeat, (jvalue*)metaState, (jvalue*)deviceId, (jvalue*)scancode, (jvalue*)flags, (jvalue*)source);
|
||||||
|
|
||||||
|
// Call its getUnicodeChar() method to get the unicode value
|
||||||
|
jmethodID MethodGetUnicode = lJNIEnv->GetMethodID(ClassKeyEvent, "getUnicodeChar", "(I)I");
|
||||||
|
int unicode = lJNIEnv->CallIntMethod(ObjectKeyEvent, MethodGetUnicode, metaState);
|
||||||
|
|
||||||
|
return unicode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace priv
|
} // namespace priv
|
||||||
} // namespace sf
|
} // namespace sf
|
||||||
|
@ -31,6 +31,8 @@
|
|||||||
#include <SFML/Window/Event.hpp>
|
#include <SFML/Window/Event.hpp>
|
||||||
#include <SFML/Window/WindowImpl.hpp>
|
#include <SFML/Window/WindowImpl.hpp>
|
||||||
#include <SFML/Window/Android/EglContext.hpp>
|
#include <SFML/Window/Android/EglContext.hpp>
|
||||||
|
#include <android/input.h>
|
||||||
|
|
||||||
|
|
||||||
namespace sf
|
namespace sf
|
||||||
{
|
{
|
||||||
@ -183,6 +185,16 @@ private:
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
static int processEvent(int fd, int events, void* data);
|
static int processEvent(int fd, int events, void* data);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Get unicode decoded from the input event
|
||||||
|
///
|
||||||
|
/// \param Event Input event
|
||||||
|
///
|
||||||
|
/// \return The unicode value
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
static int getUnicode(AInputEvent* event);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
// Member data
|
// Member data
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
|
Loading…
Reference in New Issue
Block a user