extern int32_t mnit_height;
extern float mnit_zoom;
- int mnit_orientation_changed;
+ //int mnit_orientation_changed;
float mnit_zoom;
- int mnit_animating = 0;
-
- /* This is confusing; the type come from android_native_app_glue.h
- and so identifies the java part of the app */
- struct android_app *mnit_java_app;
-
- /* This is the pure Nit App */
- App nit_app;
-
- /* The main of the Nit application, compiled somewhere else */
- extern int main(int, char**);
-
- /* Wraps App_full_frame() and check for orientation. */
- void mnit_frame();
-
- void mnit_term_display()
- {
- // At this point we have nothing to do
- }
/* Handle inputs from the Android platform and sort them before
sending them in the Nit App */
static int32_t mnit_handle_input(struct android_app* app, AInputEvent* event) {
+ App nit_app = app->userData;
LOGI("handle input %i", (int)pthread_self());
if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_KEY) {
LOGI("key");
LOGI("motion");
return App_extern_input_motion(nit_app, event);
}
-
- return 0;
- }
-
- static void mnit_handle_cmd(struct android_app* app, int32_t cmd) {
-
- mnit_java_app = app;
- AConfiguration_setOrientation(mnit_java_app->config, ACONFIGURATION_ORIENTATION_LAND);
- LOGI("cmd %i", (int)pthread_self());
-
- switch (cmd) {
- case APP_CMD_SAVE_STATE:
- LOGI ("save state");
- mnit_java_app->savedStateSize = 1;
- mnit_java_app->savedState = malloc(1);
- App_save(nit_app);
- break;
-
- case APP_CMD_INIT_WINDOW:
- LOGI ("init window");
- if (mnit_java_app->window != NULL) {
- LOGI("init window in");
- App_init_window(nit_app);
- mnit_frame();
- mnit_animating = 1;
- }
- break;
-
- case APP_CMD_TERM_WINDOW:
- LOGI ("term window");
- mnit_term_display();
- App_term_window(nit_app);
- break;
-
- case APP_CMD_GAINED_FOCUS:
- LOGI ("gain foc");
- mnit_animating = 1;
- App_gained_focus(nit_app);
- LOGI ("gain foc 1");
- break;
-
- case APP_CMD_LOST_FOCUS:
- LOGI ("lost foc");
- mnit_animating = 0;
- App_lost_focus(nit_app);
- mnit_frame();
- break;
-
- case APP_CMD_PAUSE:
- LOGI ("app pause");
- App_pause(nit_app);
- break;
-
- /*
- case APP_CMD_STOP:
- LOGI ("app stop");
- App_stop(nit_app);
- break;
-
- case APP_CMD_DESTROY:
- LOGI ("app destrop");
- App_destroy(nit_app);
- break;
-
- case APP_CMD_START:
- LOGI ("app start");
- App_start(nit_app);
- break;
- */
-
- case APP_CMD_RESUME:
- LOGI ("app resume");
- App_resume(nit_app);
- break;
-
- case APP_CMD_LOW_MEMORY:
- LOGI ("app low mem");
- break;
-
- case APP_CMD_CONFIG_CHANGED:
- LOGI ("app cmd conf ch");
- break;
-
- case APP_CMD_INPUT_CHANGED:
- LOGI ("app cmd in ch");
- break;
-
- case APP_CMD_WINDOW_RESIZED:
- mnit_orientation_changed = 1;
- LOGI ("app win res");
- break;
-
- case APP_CMD_WINDOW_REDRAW_NEEDED:
- LOGI ("app win redraw needed");
- break;
-
- case APP_CMD_CONTENT_RECT_CHANGED:
- LOGI ("app content rect ch");
- break;
- }
- }
-
- void android_main(struct android_app* app)
- {
- mnit_java_app = app;
-
- app_dummy();
-
- main(0, NULL);
- }
-
- void mnit_frame()
- {
- if (mnit_display == EGL_NO_DISPLAY) {
- LOGI("no frame");
- return;
- }
- if (mnit_orientation_changed)
- {
- mnit_orientation_changed = 0;
-
- if (mnit_surface != EGL_NO_SURFACE) {
- eglDestroySurface(mnit_display, mnit_surface);
- }
- EGLSurface surface = eglCreateWindowSurface(mnit_display, mnit_config, mnit_java_app->window, NULL);
-
- if (eglMakeCurrent(mnit_display, surface, surface, mnit_context) == EGL_FALSE) {
- LOGW("Unable to eglMakeCurrent");
- }
-
- eglQuerySurface(mnit_display, surface, EGL_WIDTH, &mnit_width);
- eglQuerySurface(mnit_display, surface, EGL_HEIGHT, &mnit_height);
-
- mnit_surface = surface;
-
- glViewport(0, 0, mnit_width, mnit_height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrthof(0.0f, mnit_width, mnit_height, 0.0f, 0.0f, 1.0f);
- glMatrixMode(GL_MODELVIEW);
- }
-
- LOGI("frame");
-
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT); // | GL_DEPTH_BUFFER_BIT);
-
- App_full_frame(nit_app);
-
- LOGI("frame b");
+ return 0;
}
`}
-extern InnerAndroidMotionEvent in "C" `{AInputEvent *`}
+extern class InnerAndroidMotionEvent in "C" `{AInputEvent *`}
super Pointer
- private fun pointers_count: Int is extern `{
+ private fun pointers_count: Int is extern `{
return AMotionEvent_getPointerCount(recv);
`}
private fun just_went_down: Bool is extern `{
return (a & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
else return -1;
`}
+
+ private fun action: AMotionEventAction `{ return AMotionEvent_getAction(recv); `}
+end
+
+extern class AMotionEventAction `{ int32_t `}
+ protected fun action: Int `{ return recv & AMOTION_EVENT_ACTION_MASK; `}
+ fun is_down: Bool do return action == 0
+ fun is_up: Bool do return action == 1
+ fun is_move: Bool do return action == 2
+ fun is_cancel: Bool do return action == 3
+ fun is_outside: Bool do return action == 4
+ fun is_pointer_down: Bool do return action == 5
+ fun is_pointer_up: Bool do return action == 6
end
interface AndroidInputEvent
- super InputEvent
+ super InputEvent
end
class AndroidMotionEvent
super AndroidInputEvent
super MotionEvent
-
+
private init(ie: InnerAndroidMotionEvent) do inner_event = ie
private var inner_event: InnerAndroidMotionEvent
-
+
private var pointers_cache: nullable Array[AndroidPointerEvent] = null
fun pointers: Array[AndroidPointerEvent]
do
protected var motion_event: AndroidMotionEvent
protected var pointer_id: Int
-
+
redef fun x: Float do return extern_x(motion_event.inner_event, pointer_id)
private fun extern_x(motion_event: InnerAndroidMotionEvent, pointer_id: Int): Float is extern `{
return ((int) AMotionEvent_getX(motion_event, pointer_id) * mnit_zoom);
`}
-
+
redef fun y: Float do return extern_y(motion_event.inner_event, pointer_id)
private fun extern_y(motion_event: InnerAndroidMotionEvent, pointer_id: Int): Float is extern `{
- return ((int) AMotionEvent_getY(motion_event, pointer_id) * mnit_zoom) + 32;
+ return ((int) AMotionEvent_getY(motion_event, pointer_id) * mnit_zoom);
`}
-
+
fun pressure: Float do return extern_pressure(motion_event.inner_event, pointer_id)
private fun extern_pressure(motion_event: InnerAndroidMotionEvent, pointer_id: Int): Float is extern `{
return AMotionEvent_getPressure(motion_event, pointer_id);
`}
- redef fun pressed do return true
- redef fun depressed do return false
+ redef fun pressed
+ do
+ var action = motion_event.inner_event.action
+ return action.is_down or action.is_move
+ end
+
+ redef fun depressed do return not pressed
end
-extern AndroidKeyEvent in "C" `{AInputEvent *`}
+extern class AndroidKeyEvent in "C" `{AInputEvent *`}
super KeyEvent
super AndroidInputEvent
fun key_code: Int is extern `{
return AKeyEvent_getKeyCode(recv);
`}
-
+
fun key_char: Char is extern `{
int code = AKeyEvent_getKeyCode(recv);
if (code >= AKEYCODE_0 && code <= AKEYCODE_9)
return 0;
`}
- fun is_back_key: Bool do return key_code == 2
+ fun is_back_key: Bool do return key_code == 4
fun is_menu_key: Bool do return key_code == 82
fun is_search_key: Bool do return key_code == 84
end
-redef class Object
- # Uses Android logs for every print
- redef fun print(text: Object) is extern import Object.to_s, String.to_cstring `{
- __android_log_print(ANDROID_LOG_INFO, "mnit print", "%s", String_to_cstring(Object_to_s(text)));
- `}
-end
-
redef class App
redef type IE: AndroidInputEvent
redef type D: Opengles1Display
- redef fun log_warning(msg) is extern import String.to_cstring `{
- LOGW("%s", String_to_cstring(msg));
- `}
- redef fun log_info(msg) is extern import String.to_cstring `{
- LOGI("%s", String_to_cstring(msg));
- `}
-
redef fun init_window
do
- super
-
+ set_as_input_handler native_app_glue
display = new Opengles1Display
+
+ super
end
-
- # these two are used as a callback from native to type incoming events
+
+ private fun set_as_input_handler(app_glue: NativeAppGlue) import extern_input_key, extern_input_motion `{
+ app_glue->onInputEvent = mnit_handle_input;
+ `}
+
+ redef fun full_frame do if not paused then super
+
+ # these are used as a callback from native to type incoming events
private fun extern_input_key(event: AndroidKeyEvent): Bool
do
return input(event)
return handled
end
-
- redef fun main_loop is extern import full_frame, generate_input `{
- LOGI("nitni loop");
-
- nit_app = recv;
-
- mnit_java_app->userData = &nit_app;
- mnit_java_app->onAppCmd = mnit_handle_cmd;
- mnit_java_app->onInputEvent = mnit_handle_input;
-
- while (1) {
- App_generate_input(recv);
-
- if (mnit_java_app->destroyRequested != 0) return;
-
- if (mnit_animating == 1) {
- mnit_frame();
- LOGI("frame at loop end 1");
- }
- }
-
- /* App_exit(); // this is unreachable anyway*/
- `}
-
- redef fun generate_input import save, pause, resume, gained_focus, lost_focus, init_window, term_window, extern_input_key, extern_input_motion `{
- int ident;
- int events;
- static int block = 0;
- struct android_poll_source* source;
-
- while ((ident=ALooper_pollAll(0, NULL, &events,
- (void**)&source)) >= 0) { /* first 0 is for non-blocking */
-
- // Process this event.
- if (source != NULL)
- source->process(mnit_java_app, source);
- // Check if we are exiting.
- if (mnit_java_app->destroyRequested != 0) {
- mnit_term_display();
- return;
- }
- }
- `}
+ redef fun generate_input do poll_looper 0
end
-