diff --git a/src/SFML/Main/MainAndroid.cpp b/src/SFML/Main/MainAndroid.cpp index 5da2d39d1..7399db161 100644 --- a/src/SFML/Main/MainAndroid.cpp +++ b/src/SFML/Main/MainAndroid.cpp @@ -207,7 +207,7 @@ static void onResume(ANativeActivity* activity) sf::Event event; event.type = sf::Event::MouseEntered; - states->pendingEvents.push_back(event); + states->forwardEvent(event); } @@ -222,7 +222,7 @@ static void onPause(ANativeActivity* activity) sf::Event event; event.type = sf::Event::MouseLeft; - states->pendingEvents.push_back(event); + states->forwardEvent(event); } @@ -249,7 +249,7 @@ static void onDestroy(ANativeActivity* activity) sf::Event event; event.type = sf::Event::Closed; - states->pendingEvents.push_back(event); + states->forwardEvent(event); } } @@ -288,12 +288,12 @@ static void onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* wind states->window = window; // Notify SFML mechanism + states->updated = false; sf::Event event; event.type = sf::Event::GainedFocus; - states->pendingEvents.push_back(event); + states->forwardEvent(event); // Wait for the event to be taken into account by SFML - states->updated = false; while(!states->updated) { states->mutex.unlock(); @@ -313,12 +313,12 @@ static void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* wi states->window = NULL; // Notify SFML mechanism + states->updated = false; sf::Event event; event.type = sf::Event::LostFocus; - states->pendingEvents.push_back(event); + states->forwardEvent(event); // Wait for the event to be taken into account by SFML - states->updated = false; while(!states->updated) { states->mutex.unlock(); @@ -391,7 +391,7 @@ static void onContentRectChanged(ANativeActivity* activity, const ARect* rect) event.size.width = ANativeWindow_getWidth(states->window); event.size.height = ANativeWindow_getHeight(states->window); - states->pendingEvents.push_back(event); + states->forwardEvent(event); } diff --git a/src/SFML/System/Android/Activity.hpp b/src/SFML/System/Android/Activity.hpp index ea7d58d68..572b1975a 100644 --- a/src/SFML/System/Android/Activity.hpp +++ b/src/SFML/System/Android/Activity.hpp @@ -59,7 +59,7 @@ struct ActivityStates Mutex mutex; - std::vector pendingEvents; + void (*forwardEvent)(const Event& event); int (*processEvent)(int fd, int events, void* data); std::map touchEvents; diff --git a/src/SFML/Window/Android/WindowImplAndroid.cpp b/src/SFML/Window/Android/WindowImplAndroid.cpp index 8e2e2bf7e..c15cd5d44 100644 --- a/src/SFML/Window/Android/WindowImplAndroid.cpp +++ b/src/SFML/Window/Android/WindowImplAndroid.cpp @@ -44,6 +44,8 @@ namespace sf { namespace priv { +WindowImplAndroid* WindowImplAndroid::singleInstance = NULL; + //////////////////////////////////////////////////////////// WindowImplAndroid::WindowImplAndroid(WindowHandle handle) : m_size(0, 0) @@ -58,6 +60,9 @@ WindowImplAndroid::WindowImplAndroid(VideoMode mode, const String& title, unsign ActivityStates* states = getActivity(NULL); Lock lock(states->mutex); + if (style& Style::Fullscreen) + states->fullscreen = true; + // Register process event callback states->processEvent = processEvent; @@ -84,34 +89,8 @@ WindowHandle WindowImplAndroid::getSystemHandle() const //////////////////////////////////////////////////////////// void WindowImplAndroid::processEvents() { - ActivityStates* states = getActivity(NULL); - Lock lock(states->mutex); - // Process incoming OS events ALooper_pollAll(0, NULL, NULL, NULL); - - while (!states->pendingEvents.empty()) - { - Event tempEvent = states->pendingEvents.back(); - states->pendingEvents.pop_back(); - - if (tempEvent.type == Event::GainedFocus) - { - states->context->createSurface(states->window); - - m_size.x = ANativeWindow_getWidth(states->window); - m_size.y = ANativeWindow_getHeight(states->window); - - states->updated = true; - } - else if (tempEvent.type == Event::LostFocus) - { - states->context->destroySurface(); - states->updated = true; - } - - pushEvent(tempEvent); - } } @@ -178,6 +157,31 @@ void WindowImplAndroid::setKeyRepeatEnabled(bool enabled) } +//////////////////////////////////////////////////////////// +void WindowImplAndroid::forwardEvent(const Event& event) +{ + ActivityStates* states = getActivity(NULL); + Lock lock(states->mutex); + + if (event.type == Event::GainedFocus) + { + states->context->createSurface(states->window); + + WindowImplAndroid::singleInstance->m_size.x = ANativeWindow_getWidth(states->window); + WindowImplAndroid::singleInstance->m_size.y = ANativeWindow_getHeight(states->window); + + states->updated = true; + } + else if (event.type == Event::LostFocus) + { + states->context->destroySurface(); + states->updated = true; + } + + WindowImplAndroid::singleInstance->pushEvent(event); +} + + //////////////////////////////////////////////////////////// int WindowImplAndroid::processEvent(int fd, int events, void* data) { @@ -292,15 +296,15 @@ void WindowImplAndroid::processScrollEvent(AInputEvent* _event, ActivityStates* // Call its getAxisValue() method to get the delta value of our wheel move event jmethodID MethodGetAxisValue = lJNIEnv->GetMethodID(ClassMotionEvent, "getAxisValue", "(I)F"); jfloat delta = lJNIEnv->CallFloatMethod(ObjectMotionEvent, MethodGetAxisValue, 0x00000001); - + // Create and send our mouse wheel event Event event; event.type = Event::MouseWheelMoved; event.mouseWheel.delta = static_cast(delta); event.mouseWheel.x = AMotionEvent_getX(_event, 0); event.mouseWheel.y = AMotionEvent_getY(_event, 0); - - states->pendingEvents.push_back(event); + + forwardEvent(event); // Dettach this thread from the JVM lJavaVM->DetachCurrentThread(); @@ -323,14 +327,14 @@ void WindowImplAndroid::processKeyEvent(AInputEvent* _event, ActivityStates* sta event.key.control = false; event.key.shift = metakey & AMETA_SHIFT_ON; - states->pendingEvents.push_back(event); + forwardEvent(event); if (int unicode = getUnicode(_event)) { Event event; event.type = Event::TextEntered; event.text.unicode = unicode; - states->pendingEvents.push_back(event); + forwardEvent(event); } } @@ -375,8 +379,8 @@ void WindowImplAndroid::processMotionEvent(AInputEvent* _event, ActivityStates* states->touchEvents[id] = Vector2i(event.touch.x, event.touch.y); } - - states->pendingEvents.push_back(event); + + forwardEvent(event); } } @@ -439,8 +443,8 @@ void WindowImplAndroid::processPointerEvent(bool isDown, AInputEvent* _event, Ac states->touchEvents.erase(id); } } - - states->pendingEvents.push_back(event); + + forwardEvent(event); } diff --git a/src/SFML/Window/Android/WindowImplAndroid.hpp b/src/SFML/Window/Android/WindowImplAndroid.hpp index fb7b8536c..5c8062e58 100644 --- a/src/SFML/Window/Android/WindowImplAndroid.hpp +++ b/src/SFML/Window/Android/WindowImplAndroid.hpp @@ -154,6 +154,9 @@ public : //////////////////////////////////////////////////////////// virtual void setKeyRepeatEnabled(bool enabled); + static void forwardEvent(const Event& event); + static WindowImplAndroid* singleInstance; + protected : ////////////////////////////////////////////////////////////