]> git.tdb.fi Git - libs/core.git/blobdiff - source/core/android/mainthread.cpp
Add window and input management signals for Android
[libs/core.git] / source / core / android / mainthread.cpp
index 51fcafcd31d66bbdf6e8501e0a5bee105ed48cbc..e07c837bcfdb15706f33e62baa98eeb1b82b26db 100644 (file)
@@ -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<MainThread *>(data)->resume_startup();
+}
+
+void MainThread::native_window_created(ANativeActivity *activity, ANativeWindow *window)
+{
+       reinterpret_cast<MainThread *>(activity->instance)->signal_native_window_created.emit(window);
+}
+
+void MainThread::native_window_resized(ANativeActivity *activity, ANativeWindow *window)
+{
+       reinterpret_cast<MainThread *>(activity->instance)->signal_native_window_resized.emit(window);
+}
+
+void MainThread::native_window_destroyed(ANativeActivity *activity, ANativeWindow *window)
+{
+       reinterpret_cast<MainThread *>(activity->instance)->signal_native_window_destroyed.emit(window);
+}
+
+void MainThread::input_queue_created(ANativeActivity *activity, AInputQueue *queue)
+{
+       reinterpret_cast<MainThread *>(activity->instance)->signal_input_queue_created.emit(queue);
+}
+
+void MainThread::input_queue_destroyed(ANativeActivity *activity, AInputQueue *queue)
+{
+       reinterpret_cast<MainThread *>(activity->instance)->signal_input_queue_destroyed.emit(queue);
+}
+
 } // namespace Android
 } // namespace Msp