From fe930052d28d7325becb8c6b9be848e7bfa0ff81 Mon Sep 17 00:00:00 2001 From: hsdk123 Date: Sun, 19 Jan 2025 02:46:14 -0500 Subject: [PATCH] Use ALooper_pollOnce --- src/Magnum/Platform/AndroidApplication.cpp | 49 +++++++++++++--------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/src/Magnum/Platform/AndroidApplication.cpp b/src/Magnum/Platform/AndroidApplication.cpp index 0c7b59bea7..4f8efd4c57 100644 --- a/src/Magnum/Platform/AndroidApplication.cpp +++ b/src/Magnum/Platform/AndroidApplication.cpp @@ -662,30 +662,41 @@ void AndroidApplication::exec(android_app* state, Containers::PointeruserData = &data; - for(;;) { - /* Read all pending events. Block and wait for them only if the app - doesn't want to redraw immediately WHY THIS GODDAMN THING DOESNT - HAVE SOMETHING LIKE WAIT FOR EVENT SO I NEED TO TANGLE THIS TANGLED - MESS OF HELL */ - int ident, events; - android_poll_source* source; - while((ident = ALooper_pollAll( - data.instance && (data.instance->_flags & Flag::Redraw) ? 0 : -1, - nullptr, &events, reinterpret_cast(&source))) >= 0) - { - /* Process this event OH SIR MAY MY POOR EXISTENCE CALL THIS - FUNCTION FOR YOU IF YOU DON'T MIND? */ - if(source) source->process(state, source); - - /* Exit WHY THIS HAS TO BE HANDLED HERE WHILE EVERY OTHER THING - IS HANDLED THROUGH CALLBACK GODDAMMIT */ - if(state->destroyRequested != 0) return; + /* Read all pending events. Block and wait for them only if the app + doesn't want to redraw immediately WHY THIS GODDAMN THING DOESNT + HAVE SOMETHING LIKE WAIT FOR EVENT SO I NEED TO TANGLE THIS TANGLED + MESS OF HELL + + WHY THIS HAS TO BE HANDLED HERE WHILE EVERY OTHER THING + IS HANDLED THROUGH CALLBACK GODDAMMIT + + reference: + https://github.com/android/ndk-samples/pull/1008/files + */ + while (!state->destroyRequested) + { + android_poll_source* source = nullptr; + const auto timeout_ms = (data.instance && (data.instance->_flags & Flag::Redraw) ? + 0 : -1 /* negative value: wait indefinitely until an event appears */); + + const auto result = ALooper_pollOnce(timeout_ms, nullptr, nullptr, + reinterpret_cast(&source)); + + if (result == ALOOPER_POLL_ERROR) { + return; + } + + /* Process this event OH SIR MAY MY POOR EXISTENCE CALL THIS + FUNCTION FOR YOU IF YOU DON'T MIND? */ + if(source) { + source->process(state, source); } /* Redraw the app if it wants to be redrawn. Frame limiting is done by Android itself */ - if(data.instance && (data.instance->_flags & Flag::Redraw)) + if(data.instance && (data.instance->_flags & Flag::Redraw)) { data.instance->drawEvent(); + } } state->userData = nullptr;