X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fcore%2Fandroid%2Fmainthread.cpp;h=e07c837bcfdb15706f33e62baa98eeb1b82b26db;hp=51fcafcd31d66bbdf6e8501e0a5bee105ed48cbc;hb=dd997d45dd774b1d6734a19c6eb6efdd6be14234;hpb=211c503e709ffa8bec7b71b8004ecdeadf776c4c diff --git a/source/core/android/mainthread.cpp b/source/core/android/mainthread.cpp index 51fcafc..e07c837 100644 --- a/source/core/android/mainthread.cpp +++ b/source/core/android/mainthread.cpp @@ -10,11 +10,35 @@ namespace Msp { namespace Android { MainThread::MainThread(ANativeActivity *a): - activity(a) + activity(a), + starting_up(true) { + activity->callbacks->onNativeWindowCreated = &native_window_created; + activity->callbacks->onNativeWindowResized = &native_window_resized; + activity->callbacks->onNativeWindowDestroyed = &native_window_destroyed; + activity->callbacks->onInputQueueCreated = &input_queue_created; + activity->callbacks->onInputQueueDestroyed = &input_queue_destroyed; + activity->instance = this; + + startup_mutex.lock(); + launch(); } +void MainThread::wait_for_app_created() +{ + MutexLock lock(startup_mutex); +} + +void MainThread::resume_startup() +{ + if(starting_up) + { + starting_up = false; + startup_mutex.unlock(); + } +} + void MainThread::main() { /* I have no idea how dependable this is, but it seems to be the only way @@ -22,10 +46,40 @@ void MainThread::main() char *appname = strdup(FS::Path(activity->internalDataPath)[-2].c_str()); char *argv[] = { appname, 0 }; Msp::Android::ErrorLogger err_logger; - Msp::Application::run(1, argv, activity); + Msp::Application::run(1, argv, this, &app_created); free(appname); ANativeActivity_finish(activity); } +void MainThread::app_created(void *data) +{ + reinterpret_cast(data)->resume_startup(); +} + +void MainThread::native_window_created(ANativeActivity *activity, ANativeWindow *window) +{ + reinterpret_cast(activity->instance)->signal_native_window_created.emit(window); +} + +void MainThread::native_window_resized(ANativeActivity *activity, ANativeWindow *window) +{ + reinterpret_cast(activity->instance)->signal_native_window_resized.emit(window); +} + +void MainThread::native_window_destroyed(ANativeActivity *activity, ANativeWindow *window) +{ + reinterpret_cast(activity->instance)->signal_native_window_destroyed.emit(window); +} + +void MainThread::input_queue_created(ANativeActivity *activity, AInputQueue *queue) +{ + reinterpret_cast(activity->instance)->signal_input_queue_created.emit(queue); +} + +void MainThread::input_queue_destroyed(ANativeActivity *activity, AInputQueue *queue) +{ + reinterpret_cast(activity->instance)->signal_input_queue_destroyed.emit(queue); +} + } // namespace Android } // namespace Msp