From b2d09906ddc677d433672318faa357b819b22740 Mon Sep 17 00:00:00 2001 From: hgn Date: Thu, 30 May 2024 20:29:58 +0100 Subject: [PATCH] yeet android support --- vg_build.h | 232 +++------ vg_build2.h | 12 - vg_engine.c | 68 +-- vg_engine.h | 21 +- vg_loader.c | 4 - vg_log.c | 2 +- vg_opengl.h | 5 - vg_platform/android/AndroidManifest.xml | 22 - vg_platform/android/android_native_app_glue.c | 457 ------------------ vg_platform/android/android_native_app_glue.h | 350 -------------- vg_platform/android/build.c | 108 ----- vg_platform/android/debug.keystore | Bin 2150 -> 0 bytes vg_platform/android/resources/mipmap/icon.png | Bin 4222 -> 0 bytes .../android/resources/values/strings.xml | 7 - vg_ui/imgui_impl_opengl.c | 15 - 15 files changed, 68 insertions(+), 1235 deletions(-) delete mode 100644 vg_build2.h delete mode 100644 vg_platform/android/AndroidManifest.xml delete mode 100644 vg_platform/android/android_native_app_glue.c delete mode 100644 vg_platform/android/android_native_app_glue.h delete mode 100644 vg_platform/android/build.c delete mode 100644 vg_platform/android/debug.keystore delete mode 100644 vg_platform/android/resources/mipmap/icon.png delete mode 100644 vg_platform/android/resources/values/strings.xml diff --git a/vg_build.h b/vg_build.h index 35ddc4c..07cf5f8 100644 --- a/vg_build.h +++ b/vg_build.h @@ -27,7 +27,6 @@ struct vg_compiler_env k_platform_anyplatform, k_platform_windows, k_platform_linux, - k_platform_android } platform; @@ -36,8 +35,6 @@ struct vg_compiler_env k_architecture_anyarch, k_architecture_i386, k_architecture_x86_64, - k_architecture_aarch64, - k_architecture_armv7a } arch; @@ -46,7 +43,6 @@ struct vg_compiler_env k_compiler_blob, k_compiler_clang, k_compiler_zigcc, - k_compiler_clang_android } compiler; @@ -65,6 +61,15 @@ vg_test_env = .arch = k_architecture_x86_64, .compiler = k_compiler_clang, .libc = k_libc_version_native +}, +vg_release_env = +{ + .optimization = 3, + .debug_asan = 0, + .platform = k_platform_anyplatform, + .arch = k_architecture_x86_64, + .compiler = k_compiler_zigcc, + .libc = k_libc_version_2_23 }; struct vg_compiler_conf @@ -92,7 +97,6 @@ static const char *platform_names[] = [k_platform_anyplatform] = "anyplatform", [k_platform_windows] = "windows", [k_platform_linux] = "linux", - [k_platform_android] = "android" }; static const char *architecture_names[] = @@ -100,8 +104,6 @@ static const char *architecture_names[] = [k_architecture_anyarch] = "anyarch", [k_architecture_i386] = "i386", [k_architecture_x86_64] = "x86_64", - [k_architecture_aarch64] = "aarch64", - [k_architecture_armv7a] = "armv7a" }; static const char *compiler_names[] = @@ -109,7 +111,6 @@ static const char *compiler_names[] = [k_compiler_blob] = "blob", [k_compiler_clang] = "clang", [k_compiler_zigcc] = "zig-cc", - [k_compiler_clang_android] = "clang" }; static const char *libc_names[] = @@ -159,7 +160,7 @@ void vg_tarball_project( struct vg_project *proj ) bool vg_platform_posix( enum platform p ) { - if( (p == k_platform_linux) || (p == k_platform_android) ) return 1; + if( p == k_platform_linux ) return 1; else return 0; } @@ -221,34 +222,15 @@ vg_compiler_run( struct vg_project *project, if( env->platform != k_platform_linux ) vg_fatal_error( "Cannot compile for '%s' using the '%s' compiler;" ); - if( env->compiler == k_compiler_clang_android ) - if( env->platform != k_platform_android ) - vg_fatal_error( "Cannot compile for '%s' using the '%s' compiler;" ); - vg_str cmd = {0}; + vg_strcat( &cmd, "ccache " ); /* compiler specification */ - vg_strcat( &cmd, "ccache " ); if( env->compiler == k_compiler_zigcc ) vg_strcat( &cmd, "zig cc " ); else if( env->compiler == k_compiler_clang ) vg_strcat( &cmd, "clang" ); - else if( env->compiler == k_compiler_clang_android ) - { - if( env->arch == k_architecture_armv7a ) - { - vg_strcat( &cmd, - "/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/" - "bin/armv7a-linux-androideabi22-clang \\\n" ); - } - else if( env->arch == k_architecture_aarch64 ) - { - vg_strcat( &cmd, - "/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/" - "bin/aarch64-linux-android22-clang \\\n" ); - } - } vg_strcat( &cmd, " -std=gnu99 -D_REENTRANT \\\n" ); @@ -256,22 +238,22 @@ vg_compiler_run( struct vg_project *project, { vg_strcat( &cmd, " -O" ); vg_strcati32( &cmd, env->optimization ); - vg_strcat( &cmd, " -flto \\\n" ); } else { - /* add debugger / asan information */ vg_strcat( &cmd, " -O0 -ggdb3 -fno-omit-frame-pointer " ); - - if( (env->compiler == k_compiler_clang) && env->debug_asan ) - { - vg_strcat( &cmd, " -rdynamic -fsanitize=address -fPIE " - "-fstack-protector-strong " ); - } - vg_strcat( &cmd, "\\\n" ); } + if( (env->compiler == k_compiler_clang) && env->debug_asan ) + { + vg_strcat( &cmd, " -rdynamic -fsanitize=address -fPIE " + "-fstack-protector-strong " ); + } + + /* always want this */ + vg_strcat( &cmd, " -flto \\\n" ); + /* want a lot of warnings but not useless ones */ vg_strcat( &cmd, " -Wall -ferror-limit=8\\\n" " -Wno-unused-function -Wno-unused-variable\\\n" @@ -282,9 +264,7 @@ vg_compiler_run( struct vg_project *project, vg_strcat( &cmd, " -Wno-format-truncation\\\n" ); /* defines */ - vg_strcat( &cmd, " " ); - vg_strcat( &cmd, conf->defines.buffer ); - vg_strcat( &cmd, "\\\n" ); + vg_strcatf( &cmd, " %s \\\n", conf->defines.buffer ); /* include paths */ vg_strcat( &cmd, " " ); @@ -305,13 +285,6 @@ vg_compiler_run( struct vg_project *project, if( type == k_obj_type_shared ) { vg_strcat( &cmd, "-shared -fPIC " ); - - if( env->platform == k_platform_android ) - { - vg_strcat( &cmd, "-Wl,-soname," ); - vg_strcat( &cmd, target_name ); - vg_strcat( &cmd, ".so " ); - } } vg_strcat( &cmd, sources ); @@ -387,59 +360,6 @@ vg_compiler_run( struct vg_project *project, return res; } -#if 0 -void vg_android_pack( struct vg_project *proj ) -{ - vg_str AndroidManifest_xml; - vg_strcatf( &AndroidManifest_xml, -"\n" -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"\n" ); - - vg_syscall( "aapt package -vf \\\n" - "--target-sdk-version 22 \\\n" - "-F bin/temp.apk \\\n" - "-I /opt/android-sdk/platforms/android-22/android.jar \\\n" - "-M AndroidManifest.xml \\\n" - "-S resources/ \\\n" - "-A assets/ " - ); - vg_syscall( "aapt add -v \\\n" - "bin/temp.apk \\\n" - "%s", proj->compiled_objects.buffer ); - - /* sign */ -#if 0 -keytool -genkey -v -keystore debug.keystore -storepass android -alias \ -androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 \ --dname "C=US, O=Android, CN=Android Debug" -#endif - vg_syscall( "/opt/android-sdk/build-tools/34.0.0/apksigner sign \\\n" - "--key-pass pass:android --ks-pass pass:android \\\n" - "--ks debug.keystore bin/temp.apk" - ); -} -#endif - /* * Standard VG includes & libraries which we use for games/graphics * -------------------------------------------------------------------------- */ @@ -465,13 +385,13 @@ vg_engine_default_config = .custom_shaders = 0 }; -/* add engine to build target. It will recompile the engine using compiler, - * and update the configuration, and build a list of sources to link with */ -void vg_add_engine( struct vg_project *proj, - struct vg_engine_config *vg_conf, - struct vg_compiler_env *env, - struct vg_compiler_conf *conf, - vg_str *sources ) +struct compile_result +vg_make_app( struct vg_project *proj, + struct vg_engine_config *vg_conf, + struct vg_compiler_env *env, + struct vg_compiler_conf *conf, + const char *sources, + const char *appname ) { struct vg_project vg_proj; vg_project_init( &vg_proj, "bin", ".vg", 0 ); @@ -497,100 +417,73 @@ void vg_add_engine( struct vg_project *proj, if( vg_conf->custom_shaders ) vg_strcat( &conf->defines, "-DVG_CUSTOM_SHADERS \\\n" ); - if( env->arch == k_architecture_i386 || - env->arch == k_architecture_armv7a ) + if( env->arch == k_architecture_i386 ) vg_strcat( &conf->defines, "-DVG_32 \\\n" ); else vg_strcat( &conf->defines, "-DVG_64 \\\n" ); - if( env->platform == k_platform_android ) - { - vg_strcat( &conf->defines, "-DVG_ANDROID \\\n" ); - - /* FIXME: -m32 womp womp */ - vg_strcatf( &conf->defines, - "-DANDROID -DAPPNAME=\\\"%s\\\" -DANDROID_FULLSCREEN \\\n" - "-DANDROIDVERSION=22 -mfloat-abi=softfp -m32 \\\n", - proj->uid.buffer ); - -#if 0 - vg_strcat( &config_string, - "-L/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/" - "sysroot/usr/lib/arm-linux-androideabi/22 \\\n" - "-I/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/" - "sysroot/usr/include \\\n" - "-I/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/" - "sysroot/usr/include/android \\\n" - ); -#endif - } - vg_strcat( &conf->defines, "\\\n" ); - vg_strcat( &conf->include, "-I. -I./vg -I./vg/dep " ); /* compile all the components * ----------------------------------------------------------------------- */ + vg_str components = {0}; + vg_strcatf( &components, "%s ", sources ); + struct vg_compiler_env denv = *env; denv.optimization = 3; - denv.debug_asan = 0; /* external dependencies */ struct compile_result depencies = vg_compiler_run( &vg_proj, &denv, conf, "vg/vg_depencies.c", "vg_deps", k_obj_type_obj ); - vg_strcatf( sources, "%s ", depencies.path ); + vg_strcatf( &components, "%s ", depencies.path ); /* glad */ - if( env->platform != k_platform_android ) - { - struct compile_result glad = - vg_compiler_run( &vg_proj, &denv, conf, "vg/dep/glad/glad.c", - "vg_glad", k_obj_type_obj ); - vg_strcatf( sources, "%s ", glad.path ); - } + struct compile_result glad = + vg_compiler_run( &vg_proj, &denv, conf, "vg/dep/glad/glad.c", + "vg_glad", k_obj_type_obj ); + vg_strcatf( &components, "%s ", glad.path ); /* core engine */ struct compile_result vg = vg_compiler_run( &vg_proj, &denv, conf, "vg/vg_engine.c", "vg_engine_core", k_obj_type_obj ); - vg_strcatf( sources, "%s ", vg.path ); + vg_strcatf( &components, "%s ", vg.path ); /* steamworks */ if( vg_conf->steam_api ) { - if( env->platform == k_platform_android ) + struct compile_result steam = + vg_compiler_run( &vg_proj, &denv, conf, "vg/vg_steam.c", + "vg_steam", k_obj_type_obj ); + vg_strcatf( &components, "%s ", steam.path ); + + if( env->platform == k_platform_linux ) { - vg_warn( "Cannot use steam_api on android (build script mistake?)" ); + vg_add_blob( proj, "vg/dep/steam/libsteam_api.so", "" ); + vg_strcat( &conf->link, "-lsteam_api " ); } - else + else if( env->platform == k_platform_windows ) { - struct compile_result steam = - vg_compiler_run( &vg_proj, &denv, conf, "vg/vg_steam.c", - "vg_steam", k_obj_type_obj ); - vg_strcatf( sources, "%s ", steam.path ); - - if( env->platform == k_platform_linux ) - { - vg_add_blob( proj, "vg/dep/steam/libsteam_api.so", "" ); - vg_strcat( &conf->link, "-lsteam_api " ); - } - else if( env->platform == k_platform_windows ) - { - vg_add_blob( proj, "vg/dep/steam/steam_api64.dll", "" ); - vg_strcat( &conf->link, "vg/dep/steam/steam_api64.dll " ); - } - - vg_strcat( &conf->library, "-L./vg/dep/steam " ); + vg_add_blob( proj, "vg/dep/steam/steam_api64.dll", "" ); + vg_strcat( &conf->link, "vg/dep/steam/steam_api64.dll " ); } + + vg_strcat( &conf->library, "-L./vg/dep/steam " ); } /* link */ + vg_strcat( &conf->library, "-L. -L/usr/lib " ); vg_strcat( &conf->link, "-lm " ); + if( env->platform == k_platform_linux ) { vg_strcat( &conf->link, "-lSDL2 -lGL -lX11 -lXxf86vm " "-lXrandr -lXi -ldl -pthread " ); + + return vg_compiler_run( proj, env, conf, components.buffer, + appname, k_obj_type_exe ); } else if( env->platform == k_platform_windows ) { @@ -598,13 +491,14 @@ void vg_add_engine( struct vg_project *proj, vg_strcat( &conf->link, "vg/dep/sdl/SDL2.dll " ); vg_add_blob( proj, "vg/dep/sdl/SDL2.dll ", "" ); vg_strcat( &conf->library, "-L./vg/dep/sdl " ); + + return vg_compiler_run( proj, env, conf, components.buffer, + appname, k_obj_type_exe ); } - else if( env->platform == k_platform_android ) - { - vg_strcat( &conf->link, - "-lGLESv3 -lEGL -lOpenSLES -pthread -landroid -llog " - "-uANativeActivity_onCreate "); - } + else + vg_fatal_error( "Programming error" ); + + return (struct compile_result){}; } void vg_add_controller_database( struct vg_project *proj ) diff --git a/vg_build2.h b/vg_build2.h deleted file mode 100644 index 7ecab7c..0000000 --- a/vg_build2.h +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include -#include -#include -#include -#include "vg_opt.h" -#include "vg_log.h" -#include "vg_string.h" -#include "vg_build_font.h" - -/* we dont free dynamic vg_strs in this program. so, we dont care.. */ -const char *__asan_default_options() { return "detect_leaks=0"; } diff --git a/vg_engine.c b/vg_engine.c index 3e11ae5..105e271 100644 --- a/vg_engine.c +++ b/vg_engine.c @@ -4,9 +4,6 @@ struct vg_engine vg = { .time_rate = 1.0, .time_fixed_delta = VG_TIMESTEP_FIXED, -#ifdef VG_ANDROID - .sl_status = PTHREAD_MUTEX_INITIALIZER -#endif }; #include @@ -14,27 +11,11 @@ struct vg_engine vg = { #include "vg/vg_ui/imgui_impl_opengl.c" #include "vg/vg_default_font.gc" -#ifdef VG_ANDROID - -int _wrap_sem_getvalue( sem_t *sem ) -{ - int v; - sem_getvalue( sem, &v ); - return v; -} - -#define TEMP_STATUS_LOCK pthread_mutex_lock -#define TEMP_STATUS_UNLOCK pthread_mutex_unlock -#define TEMP_SEM_POST(X) sem_post( &X ) -#define TEMP_SEM_WAIT(X) sem_wait( &X ) -#define TEMP_SEM_GET(X) _wrap_sem_getvalue( &X ) -#else #define TEMP_STATUS_LOCK SDL_AtomicLock #define TEMP_STATUS_UNLOCK SDL_AtomicUnlock #define TEMP_SEM_POST(X) SDL_SemPost( X ) #define TEMP_SEM_WAIT(X) SDL_SemWait( X ) #define TEMP_SEM_GET(X) SDL_SemValue( X ) -#endif enum engine_status _vg_engine_status(void) { @@ -71,11 +52,7 @@ static void vg_assert_thread( enum vg_thread_purpose required ) static void _vg_opengl_sync_init(void) { -#ifdef VG_ANDROID - sem_init( &vg.sem_loader, 0, 1 ); -#else vg.sem_loader = SDL_CreateSemaphore(1); -#endif } #include "vg_console.h" @@ -126,19 +103,11 @@ void async_internal_complete( void *payload, u32 size ) { vg_success( "Internal async setup complete\n" ); -#ifdef VG_ANDROID - pthread_mutex_lock( &vg.sl_status ); -#else TEMP_STATUS_LOCK( &vg.sl_status ); -#endif if( vg.engine_status == k_engine_status_crashed ) { -#ifdef VG_ANDROID - pthread_mutex_unlock( &vg.sl_status ); -#else TEMP_STATUS_UNLOCK( &vg.sl_status ); -#endif return; } else @@ -146,11 +115,7 @@ void async_internal_complete( void *payload, u32 size ) vg.engine_status = k_engine_status_running; } -#ifdef VG_ANDROID - pthread_mutex_unlock( &vg.sl_status ); -#else TEMP_STATUS_UNLOCK( &vg.sl_status ); -#endif } #ifdef VG_CUSTOM_SHADERS @@ -162,9 +127,7 @@ static void _vg_load_full( void *data ) vg_preload(); vg_tex2d_replace_with_error_async( &vg.tex_missing ); vg_async_stall(); -#ifndef VG_ANDROID vg_ui.tex_bg = vg.tex_missing; -#endif /* internal */ vg_loader_step( vg_input_init, vg_input_free ); @@ -191,8 +154,6 @@ static void _vg_process_events(void) v2_zero( vg.mouse_wheel ); v2_zero( vg.mouse_delta ); -#ifdef VG_ANDROID -#else /* SDL event loop */ SDL_Event event; while( SDL_PollEvent( &event ) ) @@ -289,7 +250,6 @@ static void _vg_process_events(void) vg.mouse_state = SDL_GetMouseState( &vg.mouse_pos[0], &vg.mouse_pos[1] ); vg_process_inputs(); -#endif } static void _vg_gameloop_update(void) @@ -490,9 +450,8 @@ static int _vg_crashscreen(void) return 0; } -static void _vg_gameloop(void){ - //vg.time_fixed_accumulator = 0.75f * (1.0f/60.0f); - +static void _vg_gameloop(void) +{ vg.time_hp = SDL_GetPerformanceCounter(); vg.time_hp_last = vg.time_hp; @@ -517,11 +476,7 @@ static void _vg_gameloop(void){ if( status == k_engine_status_running ) vg_profile_begin( &vg_prof_swap ); -#ifdef VG_ANDROID - // TODO: eglSwapBuffers( -#else SDL_GL_SwapWindow( vg.window ); -#endif if( status == k_engine_status_running ) vg_profile_end( &vg_prof_swap ); @@ -590,11 +545,6 @@ static void _vg_process_launch_opts_internal( int argc, char *argv[] ) static void _vg_init_window( const char *window_name ) { -#ifdef VG_ANDROID - - - -#else vg_info( "SDL_INIT\n" ); if( SDL_Init( SDL_INIT_VIDEO ) != 0 ) @@ -740,7 +690,6 @@ static void _vg_init_window( const char *window_name ) vg_info( "Display refresh rate: %d\n", dispmode.refresh_rate ); if( !vg.fps_limit ) vg.fps_limit = vg.display_refresh_rate; -#endif } static void _vg_terminate(void) @@ -756,14 +705,8 @@ static void _vg_terminate(void) vg_success( "If you see this it means everything went.. \"well\".....\n" ); -#ifdef VG_ANDROID - - - -#else SDL_GL_DeleteContext( vg.gl_context ); SDL_Quit(); -#endif exit(0); } @@ -794,11 +737,7 @@ void vg_enter( int argc, char *argv[], const char *window_name ) vg_async_init(); SDL_SetRelativeMouseMode(1); -#ifdef VG_ANDROID - vg.thread_id_main = pthread_self(); -#else vg.thread_id_main = SDL_GetThreadID(NULL); -#endif /* Opengl-required systems */ vg_ui_init(); @@ -1039,8 +978,6 @@ bool vg_settings_apply_button( ui_context *ctx, static void vg_settings_video_apply(void) { -#ifdef VG_ANDROID -#else if( vg_settings_enum_diff( &vg_settings.screenmode ) ) { vg.screen_mode = vg_settings.screenmode.new_value; @@ -1074,7 +1011,6 @@ static void vg_settings_video_apply(void) SDL_SetWindowMaximumSize( vg.window, 4096, 4096 ); } } -#endif vg.fps_limit = vg_settings.fps_limit.new_value; vg.quality_profile = vg_settings.quality.new_value; diff --git a/vg_engine.h b/vg_engine.h index bd73a5d..936a464 100644 --- a/vg_engine.h +++ b/vg_engine.h @@ -71,16 +71,8 @@ #define VG_ENGINE #include "vg_opengl.h" -#ifdef VG_ANDROID - -/* TODO: android gl includes */ -#include -#include - -#else - #define SDL_MAIN_HANDLED - #include "dep/sdl/include/SDL.h" -#endif +#define SDL_MAIN_HANDLED +#include "dep/sdl/include/SDL.h" #include "vg_platform.h" #include "vg_mem.h" @@ -129,11 +121,6 @@ enum vg_thread_purpose struct vg_engine { /* Engine sync */ -#ifdef VG_ANDROID - pthread_mutex_t sl_status; - pthread_t thread_id_main, thread_id_loader; - sem_t sem_loader; -#else SDL_Window *window; SDL_GLContext gl_context; SDL_sem *sem_loader; /* allows only one loader at a time */ @@ -142,7 +129,6 @@ struct vg_engine thread_id_loader; SDL_SpinLock sl_status; -#endif jmp_buf env_loader_exit; void *thread_data; @@ -231,10 +217,7 @@ struct vg_ui GLuint tex_glyphs; v2f inverse_font_sheet; -#ifdef VG_ANDROID -#else SDL_Cursor *cursor_map[ k_ui_cursor_max ]; -#endif /* at some point this should be implementation specific? */ v4f colour; diff --git a/vg_loader.c b/vg_loader.c index b497f45..4859f75 100644 --- a/vg_loader.c +++ b/vg_loader.c @@ -128,11 +128,7 @@ void vg_loader_render(void) static int _vg_loader_thread( void *pfn ) { -#ifdef VG_ANDROID - vg.thread_id_loader = pthread_self(); -#else vg.thread_id_loader = SDL_GetThreadID(NULL); -#endif if( setjmp( vg.env_loader_exit ) ) { diff --git a/vg_log.c b/vg_log.c index 8c2edc2..6b38c15 100644 --- a/vg_log.c +++ b/vg_log.c @@ -114,7 +114,7 @@ void vg_logx( FILE *file, void vg_print_backtrace(void) { -#if !defined(_WIN32) && !defined(VG_ANDROID) +#if !defined(_WIN32) void *array[20]; char **strings; int size, i; diff --git a/vg_opengl.h b/vg_opengl.h index f112ce9..3656719 100644 --- a/vg_opengl.h +++ b/vg_opengl.h @@ -1,6 +1 @@ -#ifdef VG_ANDROID -#include -#include -#else #include "dep/glad/glad.h" -#endif diff --git a/vg_platform/android/AndroidManifest.xml b/vg_platform/android/AndroidManifest.xml deleted file mode 100644 index 8fdb601..0000000 --- a/vg_platform/android/AndroidManifest.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/vg_platform/android/android_native_app_glue.c b/vg_platform/android/android_native_app_glue.c deleted file mode 100644 index 1e63c5e..0000000 --- a/vg_platform/android/android_native_app_glue.c +++ /dev/null @@ -1,457 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "android_native_app_glue.h" - -#include - -#include -#include -#include -#include - -#include - -#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "threaded_app", __VA_ARGS__)) -#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "threaded_app", __VA_ARGS__)) - -/* For debug builds, always enable the debug traces in this library */ -#ifndef NDEBUG -# define LOGV(...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, "threaded_app", __VA_ARGS__)) -#else -# define LOGV(...) ((void)0) -#endif - -static void free_saved_state(struct android_app* android_app) { - pthread_mutex_lock(&android_app->mutex); - if (android_app->savedState != NULL) { - free(android_app->savedState); - android_app->savedState = NULL; - android_app->savedStateSize = 0; - } - pthread_mutex_unlock(&android_app->mutex); -} - -int8_t android_app_read_cmd(struct android_app* android_app) { - int8_t cmd; - if (read(android_app->msgread, &cmd, sizeof(cmd)) != sizeof(cmd)) { - LOGE("No data on command pipe!"); - return -1; - } - if (cmd == APP_CMD_SAVE_STATE) free_saved_state(android_app); - return cmd; -} - -static void print_cur_config(struct android_app* android_app) { - char lang[2], country[2]; - AConfiguration_getLanguage(android_app->config, lang); - AConfiguration_getCountry(android_app->config, country); - - LOGV("Config: mcc=%d mnc=%d lang=%c%c cnt=%c%c orien=%d touch=%d dens=%d " - "keys=%d nav=%d keysHid=%d navHid=%d sdk=%d size=%d long=%d " - "modetype=%d modenight=%d", - AConfiguration_getMcc(android_app->config), - AConfiguration_getMnc(android_app->config), - lang[0], lang[1], country[0], country[1], - AConfiguration_getOrientation(android_app->config), - AConfiguration_getTouchscreen(android_app->config), - AConfiguration_getDensity(android_app->config), - AConfiguration_getKeyboard(android_app->config), - AConfiguration_getNavigation(android_app->config), - AConfiguration_getKeysHidden(android_app->config), - AConfiguration_getNavHidden(android_app->config), - AConfiguration_getSdkVersion(android_app->config), - AConfiguration_getScreenSize(android_app->config), - AConfiguration_getScreenLong(android_app->config), - AConfiguration_getUiModeType(android_app->config), - AConfiguration_getUiModeNight(android_app->config)); -} - -void android_app_pre_exec_cmd(struct android_app* android_app, int8_t cmd) { - switch (cmd) { - case APP_CMD_INPUT_CHANGED: - LOGV("APP_CMD_INPUT_CHANGED"); - pthread_mutex_lock(&android_app->mutex); - if (android_app->inputQueue != NULL) { - AInputQueue_detachLooper(android_app->inputQueue); - } - android_app->inputQueue = android_app->pendingInputQueue; - if (android_app->inputQueue != NULL) { - LOGV("Attaching input queue to looper"); - AInputQueue_attachLooper(android_app->inputQueue, - android_app->looper, LOOPER_ID_INPUT, NULL, - &android_app->inputPollSource); - } - pthread_cond_broadcast(&android_app->cond); - pthread_mutex_unlock(&android_app->mutex); - break; - - case APP_CMD_INIT_WINDOW: - LOGV("APP_CMD_INIT_WINDOW"); - pthread_mutex_lock(&android_app->mutex); - android_app->window = android_app->pendingWindow; - pthread_cond_broadcast(&android_app->cond); - pthread_mutex_unlock(&android_app->mutex); - break; - - case APP_CMD_TERM_WINDOW: - LOGV("APP_CMD_TERM_WINDOW"); - pthread_cond_broadcast(&android_app->cond); - break; - - case APP_CMD_RESUME: - case APP_CMD_START: - case APP_CMD_PAUSE: - case APP_CMD_STOP: - LOGV("activityState=%d", cmd); - pthread_mutex_lock(&android_app->mutex); - android_app->activityState = cmd; - pthread_cond_broadcast(&android_app->cond); - pthread_mutex_unlock(&android_app->mutex); - break; - - case APP_CMD_CONFIG_CHANGED: - LOGV("APP_CMD_CONFIG_CHANGED"); - AConfiguration_fromAssetManager(android_app->config, - android_app->activity->assetManager); - print_cur_config(android_app); - break; - - case APP_CMD_DESTROY: - LOGV("APP_CMD_DESTROY"); - android_app->destroyRequested = 1; - break; - } -} - -void android_app_post_exec_cmd(struct android_app* android_app, int8_t cmd) { - switch (cmd) { - case APP_CMD_TERM_WINDOW: - LOGV("APP_CMD_TERM_WINDOW"); - pthread_mutex_lock(&android_app->mutex); - android_app->window = NULL; - pthread_cond_broadcast(&android_app->cond); - pthread_mutex_unlock(&android_app->mutex); - break; - - case APP_CMD_SAVE_STATE: - LOGV("APP_CMD_SAVE_STATE"); - pthread_mutex_lock(&android_app->mutex); - android_app->stateSaved = 1; - pthread_cond_broadcast(&android_app->cond); - pthread_mutex_unlock(&android_app->mutex); - break; - - case APP_CMD_RESUME: - free_saved_state(android_app); - break; - } -} - -void app_dummy() { -} - -static void android_app_destroy(struct android_app* android_app) { - LOGV("android_app_destroy!"); - free_saved_state(android_app); - pthread_mutex_lock(&android_app->mutex); - if (android_app->inputQueue != NULL) { - AInputQueue_detachLooper(android_app->inputQueue); - } - AConfiguration_delete(android_app->config); - android_app->destroyed = 1; - pthread_cond_broadcast(&android_app->cond); - pthread_mutex_unlock(&android_app->mutex); - // Can't touch android_app object after this. -} - -static void process_input(struct android_app* app, struct android_poll_source* source) { - AInputEvent* event = NULL; - while (AInputQueue_getEvent(app->inputQueue, &event) >= 0) { - LOGV("New input event: type=%d", AInputEvent_getType(event)); - if (AInputQueue_preDispatchEvent(app->inputQueue, event)) { - continue; - } - int32_t handled = 0; - if (app->onInputEvent != NULL) handled = app->onInputEvent(app, event); - AInputQueue_finishEvent(app->inputQueue, event, handled); - } -} - -static void process_cmd(struct android_app* app, struct android_poll_source* source) { - int8_t cmd = android_app_read_cmd(app); - android_app_pre_exec_cmd(app, cmd); - if (app->onAppCmd != NULL) app->onAppCmd(app, cmd); - android_app_post_exec_cmd(app, cmd); -} - -static void* android_app_entry(void* param) { - struct android_app* android_app = (struct android_app*)param; - - android_app->config = AConfiguration_new(); - AConfiguration_fromAssetManager(android_app->config, android_app->activity->assetManager); - - print_cur_config(android_app); - - android_app->cmdPollSource.id = LOOPER_ID_MAIN; - android_app->cmdPollSource.app = android_app; - android_app->cmdPollSource.process = process_cmd; - android_app->inputPollSource.id = LOOPER_ID_INPUT; - android_app->inputPollSource.app = android_app; - android_app->inputPollSource.process = process_input; - - ALooper* looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS); - ALooper_addFd(looper, android_app->msgread, LOOPER_ID_MAIN, ALOOPER_EVENT_INPUT, NULL, - &android_app->cmdPollSource); - android_app->looper = looper; - - pthread_mutex_lock(&android_app->mutex); - android_app->running = 1; - pthread_cond_broadcast(&android_app->cond); - pthread_mutex_unlock(&android_app->mutex); - - android_main(android_app); - - android_app_destroy(android_app); - return NULL; -} - -// -------------------------------------------------------------------- -// Native activity interaction (called from main thread) -// -------------------------------------------------------------------- - -static struct android_app* android_app_create(ANativeActivity* activity, - void* savedState, size_t savedStateSize) { - struct android_app* android_app = calloc(1, sizeof(struct android_app)); - android_app->activity = activity; - - pthread_mutex_init(&android_app->mutex, NULL); - pthread_cond_init(&android_app->cond, NULL); - - if (savedState != NULL) { - android_app->savedState = malloc(savedStateSize); - android_app->savedStateSize = savedStateSize; - memcpy(android_app->savedState, savedState, savedStateSize); - } - - int msgpipe[2]; - if (pipe(msgpipe)) { - LOGE("could not create pipe: %s", strerror(errno)); - return NULL; - } - android_app->msgread = msgpipe[0]; - android_app->msgwrite = msgpipe[1]; - - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - pthread_create(&android_app->thread, &attr, android_app_entry, android_app); - - // Wait for thread to start. - pthread_mutex_lock(&android_app->mutex); - while (!android_app->running) { - pthread_cond_wait(&android_app->cond, &android_app->mutex); - } - pthread_mutex_unlock(&android_app->mutex); - - return android_app; -} - -static void android_app_write_cmd(struct android_app* android_app, int8_t cmd) { - if (write(android_app->msgwrite, &cmd, sizeof(cmd)) != sizeof(cmd)) { - LOGE("Failure writing android_app cmd: %s", strerror(errno)); - } -} - -static void android_app_set_input(struct android_app* android_app, AInputQueue* inputQueue) { - pthread_mutex_lock(&android_app->mutex); - android_app->pendingInputQueue = inputQueue; - android_app_write_cmd(android_app, APP_CMD_INPUT_CHANGED); - while (android_app->inputQueue != android_app->pendingInputQueue) { - pthread_cond_wait(&android_app->cond, &android_app->mutex); - } - pthread_mutex_unlock(&android_app->mutex); -} - -static void android_app_set_window(struct android_app* android_app, ANativeWindow* window) { - pthread_mutex_lock(&android_app->mutex); - if (android_app->pendingWindow != NULL) { - android_app_write_cmd(android_app, APP_CMD_TERM_WINDOW); - } - android_app->pendingWindow = window; - if (window != NULL) { - android_app_write_cmd(android_app, APP_CMD_INIT_WINDOW); - } - while (android_app->window != android_app->pendingWindow) { - pthread_cond_wait(&android_app->cond, &android_app->mutex); - } - pthread_mutex_unlock(&android_app->mutex); -} - -static void android_app_set_activity_state(struct android_app* android_app, int8_t cmd) { - pthread_mutex_lock(&android_app->mutex); - android_app_write_cmd(android_app, cmd); - while (android_app->activityState != cmd) { - pthread_cond_wait(&android_app->cond, &android_app->mutex); - } - pthread_mutex_unlock(&android_app->mutex); -} - -static void android_app_free(struct android_app* android_app) { - pthread_mutex_lock(&android_app->mutex); - android_app_write_cmd(android_app, APP_CMD_DESTROY); - while (!android_app->destroyed) { - pthread_cond_wait(&android_app->cond, &android_app->mutex); - } - pthread_mutex_unlock(&android_app->mutex); - - close(android_app->msgread); - close(android_app->msgwrite); - pthread_cond_destroy(&android_app->cond); - pthread_mutex_destroy(&android_app->mutex); - free(android_app); -} - -static struct android_app* ToApp(ANativeActivity* activity) { - return (struct android_app*) activity->instance; -} - -static void onDestroy(ANativeActivity* activity) { - LOGV("Destroy: %p", activity); - android_app_free(ToApp(activity)); -} - -static void onStart(ANativeActivity* activity) { - LOGV("Start: %p", activity); - android_app_set_activity_state(ToApp(activity), APP_CMD_START); -} - -static void onResume(ANativeActivity* activity) { - LOGV("Resume: %p", activity); - android_app_set_activity_state(ToApp(activity), APP_CMD_RESUME); -} - -static void* onSaveInstanceState(ANativeActivity* activity, size_t* outLen) { - LOGV("SaveInstanceState: %p", activity); - - struct android_app* android_app = ToApp(activity); - void* savedState = NULL; - pthread_mutex_lock(&android_app->mutex); - android_app->stateSaved = 0; - android_app_write_cmd(android_app, APP_CMD_SAVE_STATE); - while (!android_app->stateSaved) { - pthread_cond_wait(&android_app->cond, &android_app->mutex); - } - - if (android_app->savedState != NULL) { - savedState = android_app->savedState; - *outLen = android_app->savedStateSize; - android_app->savedState = NULL; - android_app->savedStateSize = 0; - } - - pthread_mutex_unlock(&android_app->mutex); - - return savedState; -} - -static void onPause(ANativeActivity* activity) { - LOGV("Pause: %p", activity); - android_app_set_activity_state(ToApp(activity), APP_CMD_PAUSE); -} - -static void onStop(ANativeActivity* activity) { - LOGV("Stop: %p", activity); - android_app_set_activity_state(ToApp(activity), APP_CMD_STOP); -} - -static void onConfigurationChanged(ANativeActivity* activity) { - LOGV("ConfigurationChanged: %p", activity); - android_app_write_cmd(ToApp(activity), APP_CMD_CONFIG_CHANGED); -} - -static void onContentRectChanged(ANativeActivity* activity, const ARect* r) { - LOGV("ContentRectChanged: l=%d,t=%d,r=%d,b=%d", r->left, r->top, r->right, r->bottom); - struct android_app* android_app = ToApp(activity); - pthread_mutex_lock(&android_app->mutex); - android_app->contentRect = *r; - pthread_mutex_unlock(&android_app->mutex); - android_app_write_cmd(ToApp(activity), APP_CMD_CONTENT_RECT_CHANGED); -} - -static void onLowMemory(ANativeActivity* activity) { - LOGV("LowMemory: %p", activity); - android_app_write_cmd(ToApp(activity), APP_CMD_LOW_MEMORY); -} - -static void onWindowFocusChanged(ANativeActivity* activity, int focused) { - LOGV("WindowFocusChanged: %p -- %d", activity, focused); - android_app_write_cmd(ToApp(activity), focused ? APP_CMD_GAINED_FOCUS : APP_CMD_LOST_FOCUS); -} - -static void onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* window) { - LOGV("NativeWindowCreated: %p -- %p", activity, window); - android_app_set_window(ToApp(activity), window); -} - -static void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* window) { - LOGV("NativeWindowDestroyed: %p -- %p", activity, window); - android_app_set_window(ToApp(activity), NULL); -} - -static void onNativeWindowRedrawNeeded(ANativeActivity* activity, ANativeWindow* window) { - LOGV("NativeWindowRedrawNeeded: %p -- %p", activity, window); - android_app_write_cmd(ToApp(activity), APP_CMD_WINDOW_REDRAW_NEEDED); -} - -static void onNativeWindowResized(ANativeActivity* activity, ANativeWindow* window) { - LOGV("NativeWindowResized: %p -- %p", activity, window); - android_app_write_cmd(ToApp(activity), APP_CMD_WINDOW_RESIZED); -} - -static void onInputQueueCreated(ANativeActivity* activity, AInputQueue* queue) { - LOGV("InputQueueCreated: %p -- %p", activity, queue); - android_app_set_input(ToApp(activity), queue); -} - -static void onInputQueueDestroyed(ANativeActivity* activity, AInputQueue* queue) { - LOGV("InputQueueDestroyed: %p -- %p", activity, queue); - android_app_set_input(ToApp(activity), NULL); -} - -JNIEXPORT -void ANativeActivity_onCreate(ANativeActivity* activity, void* savedState, size_t savedStateSize) { - LOGV("Creating: %p", activity); - - activity->callbacks->onConfigurationChanged = onConfigurationChanged; - activity->callbacks->onContentRectChanged = onContentRectChanged; - activity->callbacks->onDestroy = onDestroy; - activity->callbacks->onInputQueueCreated = onInputQueueCreated; - activity->callbacks->onInputQueueDestroyed = onInputQueueDestroyed; - activity->callbacks->onLowMemory = onLowMemory; - activity->callbacks->onNativeWindowCreated = onNativeWindowCreated; - activity->callbacks->onNativeWindowDestroyed = onNativeWindowDestroyed; - activity->callbacks->onNativeWindowRedrawNeeded = onNativeWindowRedrawNeeded; - activity->callbacks->onNativeWindowResized = onNativeWindowResized; - activity->callbacks->onPause = onPause; - activity->callbacks->onResume = onResume; - activity->callbacks->onSaveInstanceState = onSaveInstanceState; - activity->callbacks->onStart = onStart; - activity->callbacks->onStop = onStop; - activity->callbacks->onWindowFocusChanged = onWindowFocusChanged; - - activity->instance = android_app_create(activity, savedState, savedStateSize); -} diff --git a/vg_platform/android/android_native_app_glue.h b/vg_platform/android/android_native_app_glue.h deleted file mode 100644 index 35a786e..0000000 --- a/vg_platform/android/android_native_app_glue.h +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * The native activity interface provided by - * is based on a set of application-provided callbacks that will be called - * by the Activity's main thread when certain events occur. - * - * This means that each one of this callbacks _should_ _not_ block, or they - * risk having the system force-close the application. This programming - * model is direct, lightweight, but constraining. - * - * The 'android_native_app_glue' static library is used to provide a different - * execution model where the application can implement its own main event - * loop in a different thread instead. Here's how it works: - * - * 1/ The application must provide a function named "android_main()" that - * will be called when the activity is created, in a new thread that is - * distinct from the activity's main thread. - * - * 2/ android_main() receives a pointer to a valid "android_app" structure - * that contains references to other important objects, e.g. the - * ANativeActivity object instance the application is running in. - * - * 3/ the "android_app" object holds an ALooper instance that already - * listens to two important things: - * - * - activity lifecycle events (e.g. "pause", "resume"). See APP_CMD_XXX - * declarations below. - * - * - input events coming from the AInputQueue attached to the activity. - * - * Each of these correspond to an ALooper identifier returned by - * ALooper_pollOnce with values of LOOPER_ID_MAIN and LOOPER_ID_INPUT, - * respectively. - * - * Your application can use the same ALooper to listen to additional - * file-descriptors. They can either be callback based, or with return - * identifiers starting with LOOPER_ID_USER. - * - * 4/ Whenever you receive a LOOPER_ID_MAIN or LOOPER_ID_INPUT event, - * the returned data will point to an android_poll_source structure. You - * can call the process() function on it, and fill in android_app->onAppCmd - * and android_app->onInputEvent to be called for your own processing - * of the event. - * - * Alternatively, you can call the low-level functions to read and process - * the data directly... look at the process_cmd() and process_input() - * implementations in the glue to see how to do this. - * - * See the sample named "native-activity" that comes with the NDK with a - * full usage example. Also look at the JavaDoc of NativeActivity. - */ - -struct android_app; - -/** - * Data associated with an ALooper fd that will be returned as the "outData" - * when that source has data ready. - */ -struct android_poll_source { - // The identifier of this source. May be LOOPER_ID_MAIN or - // LOOPER_ID_INPUT. - int32_t id; - - // The android_app this ident is associated with. - struct android_app* app; - - // Function to call to perform the standard processing of data from - // this source. - void (*process)(struct android_app* app, struct android_poll_source* source); -}; - -/** - * This is the interface for the standard glue code of a threaded - * application. In this model, the application's code is running - * in its own thread separate from the main thread of the process. - * It is not required that this thread be associated with the Java - * VM, although it will need to be in order to make JNI calls any - * Java objects. - */ -struct android_app { - // The application can place a pointer to its own state object - // here if it likes. - void* userData; - - // Fill this in with the function to process main app commands (APP_CMD_*) - void (*onAppCmd)(struct android_app* app, int32_t cmd); - - // Fill this in with the function to process input events. At this point - // the event has already been pre-dispatched, and it will be finished upon - // return. Return 1 if you have handled the event, 0 for any default - // dispatching. - int32_t (*onInputEvent)(struct android_app* app, AInputEvent* event); - - // The ANativeActivity object instance that this app is running in. - ANativeActivity* activity; - - // The current configuration the app is running in. - AConfiguration* config; - - // This is the last instance's saved state, as provided at creation time. - // It is NULL if there was no state. You can use this as you need; the - // memory will remain around until you call android_app_exec_cmd() for - // APP_CMD_RESUME, at which point it will be freed and savedState set to NULL. - // These variables should only be changed when processing a APP_CMD_SAVE_STATE, - // at which point they will be initialized to NULL and you can malloc your - // state and place the information here. In that case the memory will be - // freed for you later. - void* savedState; - size_t savedStateSize; - - // The ALooper associated with the app's thread. - ALooper* looper; - - // When non-NULL, this is the input queue from which the app will - // receive user input events. - AInputQueue* inputQueue; - - // When non-NULL, this is the window surface that the app can draw in. - ANativeWindow* window; - - // Current content rectangle of the window; this is the area where the - // window's content should be placed to be seen by the user. - ARect contentRect; - - // Current state of the app's activity. May be either APP_CMD_START, - // APP_CMD_RESUME, APP_CMD_PAUSE, or APP_CMD_STOP; see below. - int activityState; - - // This is non-zero when the application's NativeActivity is being - // destroyed and waiting for the app thread to complete. - int destroyRequested; - - // ------------------------------------------------- - // Below are "private" implementation of the glue code. - - pthread_mutex_t mutex; - pthread_cond_t cond; - - int msgread; - int msgwrite; - - pthread_t thread; - - struct android_poll_source cmdPollSource; - struct android_poll_source inputPollSource; - - int running; - int stateSaved; - int destroyed; - int redrawNeeded; - AInputQueue* pendingInputQueue; - ANativeWindow* pendingWindow; - ARect pendingContentRect; -}; - -enum { - /** - * Looper data ID of commands coming from the app's main thread, which - * is returned as an identifier from ALooper_pollOnce(). The data for this - * identifier is a pointer to an android_poll_source structure. - * These can be retrieved and processed with android_app_read_cmd() - * and android_app_exec_cmd(). - */ - LOOPER_ID_MAIN = 1, - - /** - * Looper data ID of events coming from the AInputQueue of the - * application's window, which is returned as an identifier from - * ALooper_pollOnce(). The data for this identifier is a pointer to an - * android_poll_source structure. These can be read via the inputQueue - * object of android_app. - */ - LOOPER_ID_INPUT = 2, - - /** - * Start of user-defined ALooper identifiers. - */ - LOOPER_ID_USER = 3, -}; - -enum { - /** - * Command from main thread: the AInputQueue has changed. Upon processing - * this command, android_app->inputQueue will be updated to the new queue - * (or NULL). - */ - APP_CMD_INPUT_CHANGED, - - /** - * Command from main thread: a new ANativeWindow is ready for use. Upon - * receiving this command, android_app->window will contain the new window - * surface. - */ - APP_CMD_INIT_WINDOW, - - /** - * Command from main thread: the existing ANativeWindow needs to be - * terminated. Upon receiving this command, android_app->window still - * contains the existing window; after calling android_app_exec_cmd - * it will be set to NULL. - */ - APP_CMD_TERM_WINDOW, - - /** - * Command from main thread: the current ANativeWindow has been resized. - * Please redraw with its new size. - */ - APP_CMD_WINDOW_RESIZED, - - /** - * Command from main thread: the system needs that the current ANativeWindow - * be redrawn. You should redraw the window before handing this to - * android_app_exec_cmd() in order to avoid transient drawing glitches. - */ - APP_CMD_WINDOW_REDRAW_NEEDED, - - /** - * Command from main thread: the content area of the window has changed, - * such as from the soft input window being shown or hidden. You can - * find the new content rect in android_app::contentRect. - */ - APP_CMD_CONTENT_RECT_CHANGED, - - /** - * Command from main thread: the app's activity window has gained - * input focus. - */ - APP_CMD_GAINED_FOCUS, - - /** - * Command from main thread: the app's activity window has lost - * input focus. - */ - APP_CMD_LOST_FOCUS, - - /** - * Command from main thread: the current device configuration has changed. - */ - APP_CMD_CONFIG_CHANGED, - - /** - * Command from main thread: the system is running low on memory. - * Try to reduce your memory use. - */ - APP_CMD_LOW_MEMORY, - - /** - * Command from main thread: the app's activity has been started. - */ - APP_CMD_START, - - /** - * Command from main thread: the app's activity has been resumed. - */ - APP_CMD_RESUME, - - /** - * Command from main thread: the app should generate a new saved state - * for itself, to restore from later if needed. If you have saved state, - * allocate it with malloc and place it in android_app.savedState with - * the size in android_app.savedStateSize. The will be freed for you - * later. - */ - APP_CMD_SAVE_STATE, - - /** - * Command from main thread: the app's activity has been paused. - */ - APP_CMD_PAUSE, - - /** - * Command from main thread: the app's activity has been stopped. - */ - APP_CMD_STOP, - - /** - * Command from main thread: the app's activity is being destroyed, - * and waiting for the app thread to clean up and exit before proceeding. - */ - APP_CMD_DESTROY, -}; - -/** - * Call when ALooper_pollAll() returns LOOPER_ID_MAIN, reading the next - * app command message. - */ -int8_t android_app_read_cmd(struct android_app* android_app); - -/** - * Call with the command returned by android_app_read_cmd() to do the - * initial pre-processing of the given command. You can perform your own - * actions for the command after calling this function. - */ -void android_app_pre_exec_cmd(struct android_app* android_app, int8_t cmd); - -/** - * Call with the command returned by android_app_read_cmd() to do the - * final post-processing of the given command. You must have done your own - * actions for the command before calling this function. - */ -void android_app_post_exec_cmd(struct android_app* android_app, int8_t cmd); - -/** - * No-op function that used to be used to prevent the linker from stripping app - * glue code. No longer necessary, since __attribute__((visibility("default"))) - * does this for us. - */ -__attribute__(( - deprecated("Calls to app_dummy are no longer necessary. See " - "https://github.com/android-ndk/ndk/issues/381."))) void -app_dummy(); - -/** - * This is the function that application code must implement, representing - * the main entry to the app. - */ -extern void android_main(struct android_app* app); - -#ifdef __cplusplus -} -#endif diff --git a/vg_platform/android/build.c b/vg_platform/android/build.c deleted file mode 100644 index 8643622..0000000 --- a/vg_platform/android/build.c +++ /dev/null @@ -1,108 +0,0 @@ -#include "vg/vg_tool.h" -#include "vg/vg_platform.h" -#include "vg/vg_log.h" -#include "vg/vg_opt.h" -#include "vg/vg_build.h" -#include "vg/vg_build_utils_shader.h" -#include "vg/vg_msg.h" - -/* - * Scripts - * -------------------------------------------------------------------------- */ - -void s_testing_build(void) -{ - vg_info( "running script: s_testing_build(void)\n" ); - - /* build 64 bit*/ - vg_syscall( "/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/" - "bin/aarch64-linux-android22-clang \\\n" - "-I/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/" - "sysroot/usr/include \\\n" - "-I/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/" - "sysroot/usr/include/android \\\n" - "-I.\\\n" - "-Wall -fPIC \\\n" - "-DANDROID -DAPPNAME=\\\"carrot\\\" -DANDROID_FULLSCREEN \\\n" - "-DANDROIDVERSION=22 -m64 \\\n" - "main.c android_native_app_glue.c \\\n" - "-o lib/arm64-v8a/libcarrot.so \\\n" - "-L /opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/" - "sysroot/usr/lib/aarch64-linux-android/22 \\\n" - "-lm -lGLESv3 -lEGL -landroid -llog -lOpenSLES -shared \\\n" - "-uANativeActivity_onCreate " - ); - - /* build 32 bit*/ - vg_syscall( "/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/" - "bin/armv7a-linux-androideabi22-clang \\\n" - "-I/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/" - "sysroot/usr/include \\\n" - "-I/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/" - "sysroot/usr/include/android \\\n" - "-I.\\\n" - "-Wall -fPIC \\\n" - "-DANDROID -DAPPNAME=\\\"carrot\\\" -DANDROID_FULLSCREEN \\\n" - "-DANDROIDVERSION=22 -mfloat-abi=softfp -m32 \\\n" - "main.c android_native_app_glue.c \\\n" - "-o lib/armeabi-v7a/libcarrot.so \\\n" - "-L /opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/" - "sysroot/usr/lib/arm-linux-androideabi/22 \\\n" - "-lm -lGLESv3 -lEGL -landroid -llog -lOpenSLES -shared \\\n" - "-uANativeActivity_onCreate " - ); - - /* pack */ - vg_syscall( "/opt/android-sdk/build-tools/34.0.0/aapt package -vf \\\n" - "--target-sdk-version 22 \\\n" - "-F bin/temp.apk \\\n" - "-I /opt/android-sdk/platforms/android-22/android.jar \\\n" - "-M AndroidManifest.xml \\\n" - "-S resources/ \\\n" - "-A assets/ " - ); - vg_syscall( "/opt/android-sdk/build-tools/34.0.0/aapt add -v \\\n" - "bin/temp.apk \\\n" - "lib/arm64-v8a/libcarrot.so \\\n" - ); - vg_syscall( "/opt/android-sdk/build-tools/34.0.0/aapt add -v \\\n" - "bin/temp.apk \\\n" - "lib/armeabi-v7a/libcarrot.so \\\n" - ); - - /* sign */ -#if 0 -keytool -genkey -v -keystore debug.keystore -storepass android -alias \ -androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 \ --dname "C=US, O=Android, CN=Android Debug" -#endif - vg_syscall( "/opt/android-sdk/build-tools/34.0.0/apksigner sign \\\n" - "--key-pass pass:android --ks-pass pass:android \\\n" - "--ks debug.keystore bin/temp.apk" - ); - - /* push */ - vg_syscall( "/opt/android-sdk/platform-tools/adb install -r \\\n" - "bin/temp.apk " - ); - - /* run */ - vg_syscall( "/opt/android-sdk/platform-tools/adb shell am start -n \\\n" - "org.mtzero.carrot/android.app.NativeActivity " - ); -} - -int main( int argc, char *argv[] ) -{ - char *arg; - while( vg_argp( argc, argv ) ) - { - if( vg_long_opt( "testing-build" ) ) - s_testing_build(); - - if( vg_opt('r') ) - vg_test_env.optimization = 3; - } - - vg_success( "All scripts completed\n" ); -} diff --git a/vg_platform/android/debug.keystore b/vg_platform/android/debug.keystore deleted file mode 100644 index 6affde7d2d20bfb8ceeb8ce777d67c3e3fa85527..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2150 zcmbW1Svb^-8^>oCVKA0#F-Vq)-)NA1i9*7$WD6CtG$Fg3WC=rMDNE+qWjU5a$~JXm zaEK^Iq_K<9%veVD?eCobxj5J7;(PPCc%S$EzR&YHU>-0*AQ0pz;J<^s?&lHc@8jX& zc_YN@mS@BfPZjB0)dGRwP#_j|2yi1f6cJz;SOLNd2E#$HSQy<_`eEO?=}m><+eRyV z(_{&Oi}(i33=JGrisS4RX^|J4foAEEMIjEeA)aZZbHW|Twk3UQn0vXeDe@?ELmbn#Rq)46B~xHe8ACj(^q=R$?s(yxdlDKbWCF@Gx82TSBl+0 zR+neG%*7!CK35_x$0ylohsDQTkmIT&msKJPTIKXqxw1bQ@RzYsUO`OO)&dWsf3XJ4 zR8)&p6LOl5)i%9y?bhz>p(*u?-_tM6dGUUp={awDY9#2UFn)l*wz4~8pXm4G-D&HD z%%ZlPofVX%zOW)c%!+)qN6|JfdZ=1Czh)o*NR4}Xz17-Ue1cbM_FZ}GB_gKXuy}U9mG0i8pR);O#Vi2vwQX8f39G>OG z#LQEfbAgl}uJB8P5R2nqA)Zzeks^z7PauJO^xIFsL(K+7@xJXvSy7pe%^NC)b`dY#JMiy35lPGFKb@9G&T1=*4jK7i+~Ne>k2Ih9fy6mw3KkSy~eP zUH{Rz{LNL7ctr|4X`bG9xk5bzhq#sKD8!eu+UFW-^8U_uZl9=wO zW^>x`M>&P{vAem&Ub%$5h$|Tn&6+rWOkS51zN;e?t6>(+YkXX9Tc*ErdE36cxS6t7 zPc6i@Mculv`Ah>{qMoBK(r2%~^WNx-bCi5}z`(4$rvAQSQ2gRK zak{r+>J2HT0d2}f4eH>`Jp$yE)-)~pFs^NfXthP>XTti%UtM949*?^R{yI3uR-n1C zek1jxU^pAyz}vw%#c(EH$;^I|%EsG4Gd%N>o0goluceOQmYSQVU(y!8vtmGi0=?zE zNwnnbluBz%Sv#u!V*2%xW(L_wHO>H|i}4iIx$|5|Jg%a}$BkJbX48r92_aq+W6TKI zXOpD~0;Sk!dj%F}bAp~cdt_WcXA@0cYGRwvJXDmSjwIs$A0PKZxpCv;6r@ zZ5QvaoEZ8f_dRlQ$_8|}D>fN&att%zFSPq5ih68$waoh|y!*`a?<|Q8C#mE)e`K45 z{zv+U!EWy~b+`12sBUv3oX4M4rbNqi-NBRNk8h>i&D0k;HBN<_8bi5E9IrI|?MS$T zk}9A90zpwgEEEaEf;S7H5HJJ+L;sK`16&Apg#?p?O)fC_I2;71V+8?z1k?@&MR6JY z->s5Hf5{cgbL7$^&Vge4hhvWe?0*pi3SwsiND6VO-~gP88Wx8=r;2qtfm8uhv493v zofxz9T6{*4eQ@_PORR`wBHFt2DdGpITzTHb{`@8No!a#1 zdEeq5KATov9)KvOX8QccgZsPzzOEq-_B+A2Cs{%6_%?2$O9w(;U0Qy&_bGa^_U-pp z{*+DOl(p9C>MTyA=TOq%>u=5-+HhlafpxgK-i+%Lb7d|?fQ|1+Z+(jwzlgoAdKJM+;vfh$ZEW`Ph@^V z9e9ymOl|$U#G_vyl?VnUUl<{Wng`-^+_rE_xf-)pWR*1;xjahtJ5p0++G?>9M^*JB|zY+nSFG-yIPq94~7a$HuL`E^SGy)e@uG_)HT zdNZ?|&K_6)aWbgRaGyK)RdJ&S$B4xBV;5>5dor_?@0#{(3fl{lc|sOAgL#WKFtsbo zp{j3bW4)GC!fHxQwML7K#llpSw|4zLUCX&&VGw24R(oOS)N7ME|2Ov2L*)wfc`c5d zvXzxu!=oULY2SZpiA!$$V|88jv;Z k+T(vA2rHl+2m*wek4w98R4<+9QkWFuIGgl}IhU~i0R^+z8UO$Q diff --git a/vg_platform/android/resources/mipmap/icon.png b/vg_platform/android/resources/mipmap/icon.png deleted file mode 100644 index 7441eaabbc46b21fb463b4efc47a892c6f8c942a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4222 zcmeHKYitx%6rOFNEyXG*nDR&%7f=e$v(w$#p$oR%LRZ+*&;kXCWp?InJ9b~r%(hz; zP0GUpq7aE_LwFtQ}`)fw2oYJfJP>IwCTdb~hz& z2bKj&K|zVTpa2i6A)n$$7#3YUZ-uky$O}W8D^4vLR_3~j|Ga#CWXIAa{F%`M*5`jb za8`ugd#7(BHzJFCr@s2|;dh(2%wM{*>G7s|yv=g)>V*wgtRw%TvUWAxy|8E4jqA?q zt(N=)C%7^FlDQUJ>Eb;feATq1Wn0>u0S7W&F5mmib8fdjwBom$x9*b1b_#3nX?M0d zmRiQG;Ez6b>e*I&&AD9}C+~g!%=DGhE@~J1yhj$@|1#2i$$ql;s@`h`v8OiIUF^5L zyh{3L+01WFH*8vbWXs0VgUfG~|FFM#=9n2XZ?Cz(@bKz`J5EFzrJ_0gCoRYG^9GJw zDGq;eYw?nW1Fn5Bwr%3ojvU0uLGg**A0aBDhUPML%VdKEC-0{({C{-gJ_o7NA=(OJWR_! z$d3X5)nHYo%aX>8OUy7Ns8j-Ba~6o*1*t2(4zaq#W{jBI=^O}5Pw;j@x9{Bq1IptO zTp=l9gy(iSt;YI-9Fi1SFinom_DQ@=BxJA15}YH4Cmbv<6C7>J@$xnprsYml?x3cN zK?xaDKu#*aV@Ej-gd8%F!+UK6XLCpdFR~2b^>RF&Z9|Bo#ZDAcR0Xn9^mmTRppt<~ zve{S~(GJ4r;2|2`#t;sg;RqVBBF8eE&z5a7sboo*5K;po9H$ZxD-jhAR+NT-IKP$Iy&G z$HF)0JRw=})%_RRxIB0+;Ni%N6b;s|GhMM8Rf=AXy~SSrig}fA+`JTmD8;s*i8Uy8 z-oOXriC0{3KBk6hhSpj+Uc z?E2s2O7HlbLP7X1s1`n!>Nn2Y03TW@-boW(*elo@*s8(Jt4Q$l2^Y=OFs$!WMzdgz zt24ows=GafsaJXp>C<0mtyqu?t|4w$URl~%sqM1|KaNjMKJw;-l$1peD%#G|7?yWD VrKP@Mg7M9cxeJS3P5E=`{|3hrnUMeh diff --git a/vg_platform/android/resources/values/strings.xml b/vg_platform/android/resources/values/strings.xml deleted file mode 100644 index a702659..0000000 --- a/vg_platform/android/resources/values/strings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - carrot - carrot - org.mtzero.carrot - - diff --git a/vg_ui/imgui_impl_opengl.c b/vg_ui/imgui_impl_opengl.c index f56f4d9..236789d 100644 --- a/vg_ui/imgui_impl_opengl.c +++ b/vg_ui/imgui_impl_opengl.c @@ -339,8 +339,6 @@ void ui_impl_render_batch( ui_context *ctx, ui_batch *batch, void vg_ui_post_update(void) { -#ifdef VG_ANDROID -#else if( vg_ui.ctx.wants_mouse ) { SDL_SetWindowGrab( vg.window, SDL_FALSE ); @@ -354,22 +352,16 @@ void vg_ui_post_update(void) SDL_SetCursor( vg_ui.cursor_map[ vg_ui.ctx.cursor ] ); SDL_ShowCursor(1); -#endif } void vg_ui_set_mouse_pos( ui_px x, ui_px y ) { -#ifdef VG_ANDROID -#else SDL_WarpMouseInWindow( vg.window, x, y ); vg_ui.ctx.mouse[0] = x; vg_ui.ctx.mouse[1] = y; vg_ui.ctx.mouse_pos_overriden = 1; -#endif } -#ifdef VG_ANDROID -#else void vg_ui_handle_sdl_key( ui_context *ctx, SDL_Keysym ev ) { if( ctx->focused_control_type != k_ui_control_textbox ) @@ -446,7 +438,6 @@ bool _wrap_sdl_hasclipboard_text(void) { return SDL_HasClipboardText(); } -#endif void vg_ui_init(void) { @@ -465,15 +456,12 @@ void vg_ui_init(void) /* callbacks */ vg_ui.ctx.render_batch = ui_impl_render_batch; -#ifdef VG_ANDROID -#else vg_ui.ctx.have_clipboard_text = _wrap_sdl_hasclipboard_text; vg_ui.ctx.get_clipboard_text = SDL_GetClipboardText; vg_ui.ctx.free_clipboard_text = SDL_free; vg_ui.ctx.set_clipboard_text = SDL_SetClipboardText; vg_ui.ctx.start_text_input = SDL_StartTextInput; vg_ui.ctx.stop_text_input = SDL_StopTextInput; -#endif /* Generate the buffer we are gonna be drawing to */ glGenVertexArrays( 1, &vg_ui.vao ); @@ -506,15 +494,12 @@ void vg_ui_init(void) (void *)offsetof( ui_vert, colour ) ); glEnableVertexAttribArray( 2 ); -#ifdef VG_ANDROID -#else vg_ui.cursor_map[ k_ui_cursor_default ] = SDL_CreateSystemCursor( SDL_SYSTEM_CURSOR_ARROW ); vg_ui.cursor_map[ k_ui_cursor_hand ] = SDL_CreateSystemCursor( SDL_SYSTEM_CURSOR_HAND ); vg_ui.cursor_map[ k_ui_cursor_ibeam ] = SDL_CreateSystemCursor( SDL_SYSTEM_CURSOR_IBEAM ); -#endif /* font * ----------------------------------------------------- -- 2.25.1