3 #include <android/window.h>
4 #include <msp/fs/dir.h>
5 #include <msp/fs/path.h>
6 #include <msp/fs/utils.h>
7 #include "application.h"
8 #include "errorlogger.h"
9 #include "mainthread.h"
16 MainThread::MainThread(ANativeActivity *a):
17 asset_manager(a->assetManager),
18 int_data_path(a->internalDataPath),
21 attach_to_activity(a);
26 void MainThread::attach_to_activity(ANativeActivity *a)
29 activity->callbacks->onDestroy = &activity_destroyed;
30 activity->callbacks->onNativeWindowCreated = &native_window_created;
31 activity->callbacks->onNativeWindowResized = &native_window_resized;
32 activity->callbacks->onNativeWindowDestroyed = &native_window_destroyed;
33 activity->callbacks->onInputQueueCreated = &input_queue_created;
34 activity->callbacks->onInputQueueDestroyed = &input_queue_destroyed;
35 activity->instance = this;
37 set_window_flags(AWINDOW_FLAG_FULLSCREEN, 0);
40 void MainThread::wait_for_app_created()
42 MutexLock lock(startup_mutex);
45 void MainThread::resume_startup()
50 startup_mutex.unlock();
54 JavaVM *MainThread::get_java_vm() const
62 void MainThread::set_window_flags(unsigned set, unsigned clear)
64 ANativeActivity_setWindowFlags(activity, set, clear);
67 void MainThread::main()
69 /* I have no idea how dependable this is, but it seems to be the only way
70 to get the package name aside from making a Java call through JNI */
71 char *appname = strdup(int_data_path[-2].c_str());
72 char *argv[] = { appname, 0 };
73 Msp::Android::ErrorLogger err_logger;
74 FS::chdir(FS::dirname(int_data_path));
75 Msp::Application::run(1, argv, this, &app_created);
79 activity->callbacks->onDestroy = &end_process;
80 ANativeActivity_finish(activity);
86 void MainThread::app_created(void *data)
88 reinterpret_cast<MainThread *>(data)->resume_startup();
91 void MainThread::activity_destroyed(ANativeActivity *activity)
93 reinterpret_cast<MainThread *>(activity->instance)->activity = 0;
96 void MainThread::native_window_created(ANativeActivity *activity, ANativeWindow *window)
98 reinterpret_cast<MainThread *>(activity->instance)->signal_native_window_created.emit(window);
101 void MainThread::native_window_resized(ANativeActivity *activity, ANativeWindow *window)
103 reinterpret_cast<MainThread *>(activity->instance)->signal_native_window_resized.emit(window);
106 void MainThread::native_window_destroyed(ANativeActivity *activity, ANativeWindow *window)
108 reinterpret_cast<MainThread *>(activity->instance)->signal_native_window_destroyed.emit(window);
111 void MainThread::input_queue_created(ANativeActivity *activity, AInputQueue *queue)
113 reinterpret_cast<MainThread *>(activity->instance)->signal_input_queue_created.emit(queue);
116 void MainThread::input_queue_destroyed(ANativeActivity *activity, AInputQueue *queue)
118 reinterpret_cast<MainThread *>(activity->instance)->signal_input_queue_destroyed.emit(queue);
121 void MainThread::end_process(ANativeActivity *)
126 } // namespace Android