From 502c1a0e8c4024fc6afd327181961bd2b6ae844c Mon Sep 17 00:00:00 2001 From: Sergii Pylypenko Date: Mon, 31 Mar 2014 23:11:50 +0300 Subject: [PATCH] Added project for Xserver-Debian (formerly Ubuntu Noroot) --- .gitmodules | 3 + .../jni/application/xserver-debian/.gitignore | 1 + .../xserver-debian/AndroidAppSettings.cfg | 243 ++++++++++++++++++ .../xserver-debian/AndroidBuild.sh | 1 + .../AndroidData/DroidSansMono.ttf | 1 + .../xserver-debian/AndroidData/data-1.tgz | 1 + .../xserver-debian/AndroidData/postinstall.sh | 10 + project/jni/application/xserver-debian/gfx.c | 1 + project/jni/application/xserver-debian/gfx.h | 1 + .../jni/application/xserver-debian/icon.png | Bin 0 -> 31222 bytes project/jni/application/xserver-debian/main.c | 1 + .../jni/application/xserver-debian/readme.txt | 64 +++++ .../jni/application/xserver-debian/xserver | 1 + project/jni/application/xserver/gfx.c | 17 +- project/jni/boost/src | 2 +- project/jni/shmem | 2 +- 16 files changed, 343 insertions(+), 6 deletions(-) create mode 120000 project/jni/application/xserver-debian/.gitignore create mode 100644 project/jni/application/xserver-debian/AndroidAppSettings.cfg create mode 120000 project/jni/application/xserver-debian/AndroidBuild.sh create mode 120000 project/jni/application/xserver-debian/AndroidData/DroidSansMono.ttf create mode 120000 project/jni/application/xserver-debian/AndroidData/data-1.tgz create mode 100755 project/jni/application/xserver-debian/AndroidData/postinstall.sh create mode 120000 project/jni/application/xserver-debian/gfx.c create mode 120000 project/jni/application/xserver-debian/gfx.h create mode 100644 project/jni/application/xserver-debian/icon.png create mode 120000 project/jni/application/xserver-debian/main.c create mode 100644 project/jni/application/xserver-debian/readme.txt create mode 160000 project/jni/application/xserver-debian/xserver diff --git a/.gitmodules b/.gitmodules index 8cd5112af..7c38d2afe 100644 --- a/.gitmodules +++ b/.gitmodules @@ -56,3 +56,6 @@ path = project/jni/application/openttd/src url = git@github.com:pelya/openttd-android.git branch = master +[submodule "project/jni/application/xserver-debian/xserver"] + path = project/jni/application/xserver-debian/xserver + url = git@github.com:pelya/xserver.git diff --git a/project/jni/application/xserver-debian/.gitignore b/project/jni/application/xserver-debian/.gitignore new file mode 120000 index 000000000..ac0ff339c --- /dev/null +++ b/project/jni/application/xserver-debian/.gitignore @@ -0,0 +1 @@ +../xserver/.gitignore \ No newline at end of file diff --git a/project/jni/application/xserver-debian/AndroidAppSettings.cfg b/project/jni/application/xserver-debian/AndroidAppSettings.cfg new file mode 100644 index 000000000..dc58fafc5 --- /dev/null +++ b/project/jni/application/xserver-debian/AndroidAppSettings.cfg @@ -0,0 +1,243 @@ +# The application settings for Android libSDL port + +# Specify application name (e.x. My Application) +AppName="Debian" + +# Specify reversed site name of application (e.x. com.mysite.myapp) +AppFullName=com.cuntubuntu + +# Application version code (integer) +AppVersionCode=140331 + +# Application user-visible version name (string) +AppVersionName="14-03-31" + +# Specify path to download application data in zip archive in the form 'Description|URL|MirrorURL^Description2|URL2|MirrorURL2^...' +# If you'll start Description with '!' symbol it will be enabled by default, other downloads should be selected by user from startup config menu +# If the URL in in the form ':dir/file.dat:http://URL/' it will be downloaded as binary BLOB to the application dir and not unzipped +# If the URL does not contain 'http://' it is treated as file from 'project/jni/application/src/AndroidData' dir - +# these files are put inside .apk package by build system +# Also please avoid 'https://' URLs, many Android devices do not have trust certificates and will fail to connect to SF.net over HTTPS +AppDataDownloadUrl="!!System image|:data.tar.gz:http://sourceforge.net/projects/libsdl-android/files/ubuntu/dist-debug-wheezy-proot-.tar.gz/download^!!XSDL data files|:data-1.tar.gz:data-1.tgz^!!XSDL fonts|:DroidSansMono.ttf:DroidSansMono.ttf^!!Postinstall script|:postinstall.sh:postinstall.sh" + +# Reset SDL config when updating application to the new version (y) / (n) +ResetSdlConfigForThisVersion=y + +# Delete application data files when upgrading (specify file/dir paths separated by spaces) +DeleteFilesOnUpgrade="%" + +# Here you may type readme text, which will be shown during startup. Format is: +# Text in English, use \\\\n to separate lines (that's four backslashes)^de:Text in Deutsch^ru:Text in Russian^button:Button that will open some URL:http://url-to-open/ +ReadmeText='This update will remove your old Ubuntu installation^button:Install old version:https://github.com/pelya/cuntubuntu/raw/7b7421e933b718d64d963ce681be553850e62c10/Ubuntu.apk' + +# libSDL version to use (1.2/1.3/2.0) +LibSdlVersion=1.2 + +# Specify screen orientation: (v)ertical/(p)ortrait or (h)orizontal/(l)andscape +ScreenOrientation=h + +# Do not allow device to sleep when the application is in foreground, set this for video players or apps which use accelerometer +InhibitSuspend=n + +# Create Android service, so the app is less likely to be killed while in background +CreateService=n + +# Video color depth - 16 BPP is the fastest and supported for all modes, 24 bpp is supported only +# with SwVideoMode=y, SDL_OPENGL mode supports everything. (16)/(24)/(32) +VideoDepthBpp=16 + +# Enable OpenGL depth buffer (needed only for 3-d applications, small speed decrease) (y) or (n) +NeedDepthBuffer=n + +# Enable OpenGL stencil buffer (needed only for 3-d applications, small speed decrease) (y) or (n) +NeedStencilBuffer=n + +# Try to use GLES 2.x context - will revert to GLES 1.X if unsupported by device +# you need this option only if you're developing 3-d app (y) or (n) +NeedGles2=n + +# Application uses software video buffer - you're calling SDL_SetVideoMode() without SDL_HWSURFACE and without SDL_OPENGL, +# this will allow small speed optimization. Enable this even when you're using SDL_HWSURFACE. (y) or (n) +SwVideoMode=y + +# Application video output will be resized to fit into native device screen (y)/(n) +SdlVideoResize=y + +# Application resizing will keep 4:3 aspect ratio, with black bars at sides (y)/(n) +SdlVideoResizeKeepAspect=n + +# Application does not call SDL_Flip() or SDL_UpdateRects() appropriately, or draws from non-main thread - +# enabling the compatibility mode will force screen update every 100 milliseconds, which is laggy and inefficient (y) or (n) +CompatibilityHacks=n + +# Application initializes SDL audio/video inside static constructors (which is bad, you won't be able to run ndk-gdb) (y)/(n) +CompatibilityHacksStaticInit=n + +# On-screen Android soft text input emulates hardware keyboard, this will only work with Hackers Keyboard app (y)/(n) +CompatibilityHacksTextInputEmulatesHwKeyboard=y + +# Hack for broken devices: prevent audio chopping, by sleeping a bit after pushing each audio chunk (y)/(n) +CompatibilityHacksPreventAudioChopping=n + +# Hack for broken apps: application ignores audio buffer size returned by SDL (y)/(n) +CompatibilityHacksAppIgnoresAudioBufferSize=n + +# Hack for VCMI: preload additional shared libraries before aplication start +CompatibilityHacksAdditionalPreloadedSharedLibraries="" + +# Hack for Free Heroes 2, which redraws the screen inside SDL_PumpEvents(): slow and compatible SDL event queue - +# do not use it with accelerometer/gyroscope, or your app may freeze at random (y)/(n) +CompatibilityHacksSlowCompatibleEventQueue=n + +# Save and restore OpenGL state when drawing on-screen keyboard for apps that use SDL_OPENGL +CompatibilityHacksTouchscreenKeyboardSaveRestoreOpenGLState= + +# Application uses SDL_UpdateRects() properly, and does not draw in any region outside those rects. +# This improves drawing speed, but I know only one application that does that, and it's written by me (y)/(n) +CompatibilityHacksProperUsageOfSDL_UpdateRects=y + +# Application uses mouse (y) or (n), this will show mouse emulation dialog to the user +AppUsesMouse=y + +# Application needs two-button mouse, will also enable advanced point-and-click features (y) or (n) +AppNeedsTwoButtonMouse=y + +# Show SDL mouse cursor, for applications that do not draw cursor at all (y) or (n) +ShowMouseCursor=n + +# Generate more touch events, by default SDL generates one event per one video frame, this is useful for drawing apps (y) or (n) +GenerateSubframeTouchEvents=y + +# Force relative (laptop) mouse movement mode, useful when both on-screen keyboard and mouse are needed (y) or (n) +ForceRelativeMouseMode=y + +# Application needs arrow keys (y) or (n), will show on-screen dpad/joystick (y) or (n) +AppNeedsArrowKeys=n + +# Application needs text input (y) or (n), enables button for text input on screen +AppNeedsTextInput=n + +# Application uses joystick (y) or (n), the on-screen DPAD will be used as joystick 0 axes 0-1 +AppUsesJoystick=n + +# Application uses second on-screen joystick, as SDL joystick 0 axes 2-3 (y)/(n) +AppUsesSecondJoystick=n + +# Application uses accelerometer (y) or (n), the accelerometer will be used as joystick 1 axes 0-1 and 5-7 +AppUsesAccelerometer=n + +# Application uses gyroscope (y) or (n), the gyroscope will be used as joystick 1 axes 2-4 +AppUsesGyroscope=n + +# Application uses multitouch (y) or (n), multitouch events are passed as SDL_JOYBALLMOTION events for the joystick 0 +AppUsesMultitouch=y + +# Application records audio (it will use any available source, such a s microphone) +# API is defined in file SDL_android.h: int SDL_ANDROID_OpenAudioRecording(SDL_AudioSpec *spec); void SDL_ANDROID_CloseAudioRecording(void); +# This option will add additional permission to Android manifest (y)/(n) +AppRecordsAudio=n + +# Application needs to access SD card. If your data files are bigger than 5 Mb, enable it. (y) / (n) +AccessSdCard= + +# Application needs Internet access. If you disable it, you'll have to bundle all your data files inside .apk (y) / (n) +AccessInternet= + +# Immersive mode - Android will hide on-screen Home/Back keys. Looks bad if you invoke Android keyboard. (y) / (n) +ImmersiveMode=y + +# Application implements Android-specific routines to put to background, and will not draw anything to screen +# between SDL_ACTIVEEVENT lost / gained notifications - you should check for them +# rigth after SDL_Flip(), if (n) then SDL_Flip() will block till app in background (y) or (n) +# This option is reported to be buggy, sometimes failing to restore video state +NonBlockingSwapBuffers=n + +# Redefine common hardware keys to SDL keysyms +# BACK hardware key is available on all devices, MENU is available on pre-ICS devices, other keys may be absent +# SEARCH and CALL by default return same keycode as DPAD_CENTER - one of those keys is available on most devices +# Use word NO_REMAP if you want to preserve native functionality for certain key (volume keys are 3-rd and 4-th) +# Keys: TOUCHSCREEN (works only when AppUsesMouse=n), DPAD_CENTER/SEARCH, VOLUMEUP, VOLUMEDOWN, MENU, BACK, CAMERA +RedefinedKeys="LALT UNDO NO_REMAP NO_REMAP UNDO HELP" + +# Number of virtual keyboard keys (currently 6 is maximum) +AppTouchscreenKeyboardKeysAmount=3 + +# Redefine on-screen keyboard keys to SDL keysyms - 6 keyboard keys + 4 multitouch gestures (zoom in/out and rotate left/right) +RedefinedKeysScreenKb="LCTRL LALT LSHIFT RETURN SPACE DELETE KP_PLUS KP_MINUS 1 2" + +# Names for on-screen keyboard keys, such as Fire, Jump, Run etc, separated by spaces, they are used in SDL config menu +RedefinedKeysScreenKbNames="LCTRL LALT LSHIFT RETURN SPACE DELETE KP_PLUS KP_MINUS 1 2" + +# On-screen keys theme +# 0 = Ultimate Droid by Sean Stieber (green, with gamepad joystick) +# 1 = Simple Theme by Beholder (white, with gamepad joystick) +# 2 = Sun by Sirea (yellow, with round joystick) +# 3 = Keen by Gerstrong (multicolor, with round joystick) +TouchscreenKeysTheme=0 + +# Redefine gamepad keys to SDL keysyms, button order is: +# A B X Y L1 R1 L2 R2 LThumb RThumb +RedefinedKeysGamepad="LCTRL LALT LSHIFT RETURN SPACE DELETE KP_PLUS KP_MINUS 1 2" + +# How long to show startup menu button, in msec, 0 to disable startup menu +StartupMenuButtonTimeout=3000 + +# Menu items to hide from startup menu, available menu items: +# SettingsMenu.OkButton SettingsMenu.DummyMenu SettingsMenu.MainMenu SettingsMenuMisc.DownloadConfig SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMisc.AudioConfig SettingsMenuMisc.VideoSettingsConfig SettingsMenuMisc.ShowReadme SettingsMenuMisc.GyroscopeCalibration SettingsMenuMisc.ResetToDefaultsConfig SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.JoystickMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuMouse.CalibrateTouchscreenMenu SettingsMenuKeyboard.KeyboardConfigMainMenu SettingsMenuKeyboard.ScreenKeyboardSizeConfig SettingsMenuKeyboard.ScreenKeyboardDrawSizeConfig SettingsMenuKeyboard.ScreenKeyboardThemeConfig SettingsMenuKeyboard.ScreenKeyboardTransparencyConfig SettingsMenuKeyboard.RemapHwKeysConfig SettingsMenuKeyboard.RemapScreenKbConfig SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout +HiddenMenuOptions='' + +# Menu items to show at startup - this is Java code snippet, leave empty for default +# new SettingsMenuMisc.ShowReadme(), (AppUsesMouse \&\& \! ForceRelativeMouseMode \? new SettingsMenuMouse.DisplaySizeConfig(true) : new SettingsMenu.DummyMenu()), new SettingsMenuMisc.OptionalDownloadConfig(true), new SettingsMenuMisc.GyroscopeCalibration() +# Available menu items: +# SettingsMenu.OkButton SettingsMenu.DummyMenu SettingsMenu.MainMenu SettingsMenuMisc.DownloadConfig SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMisc.AudioConfig SettingsMenuMisc.VideoSettingsConfig SettingsMenuMisc.ShowReadme SettingsMenuMisc.GyroscopeCalibration SettingsMenuMisc.ResetToDefaultsConfig SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.JoystickMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuMouse.CalibrateTouchscreenMenu SettingsMenuKeyboard.KeyboardConfigMainMenu SettingsMenuKeyboard.ScreenKeyboardSizeConfig SettingsMenuKeyboard.ScreenKeyboardDrawSizeConfig SettingsMenuKeyboard.ScreenKeyboardThemeConfig SettingsMenuKeyboard.ScreenKeyboardTransparencyConfig SettingsMenuKeyboard.RemapHwKeysConfig SettingsMenuKeyboard.RemapScreenKbConfig SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout +FirstStartMenuOptions='SettingsMenu.DummyMenu' + +# Enable multi-ABI binary, with hardware FPU support - it will also work on old devices, +# but .apk size is 2x bigger (y) / (n) / (x86) / (all) +MultiABI='armeabi-v7a' + +# Minimum amount of RAM application requires, in Mb, SDL will print warning to user if it's lower +AppMinimumRAM=0 + +# Optional shared libraries to compile - removing some of them will save space +# MP3 support by libMAD is encumbered by patents and libMAD is GPL-ed +# Available libraries: mad (GPL-ed!) sdl_mixer sdl_image sdl_ttf sdl_net sdl_blitpool sdl_gfx sdl_sound intl xml2 lua jpeg png ogg flac tremor vorbis freetype xerces curl theora fluidsynth lzma lzo2 mikmod openal timidity zzip bzip2 yaml-cpp python boost_date_time boost_filesystem boost_iostreams boost_program_options boost_regex boost_signals boost_system boost_thread glu avcodec avdevice avfilter avformat avresample avutil swscale swresample bzip2 +CompiledLibraries="jpeg png freetype sdl_ttf" + +# Application uses custom build script AndroidBuild.sh instead of Android.mk (y) or (n) +CustomBuildScript=y + +# Aditional CFLAGS for application +AppCflags='' + +# Additional LDFLAGS for application +AppLdflags='' + +# If application has headers with the same name as system headers, this option tries to fix compiler flags to make it compilable +AppOverlapsSystemHeaders= + +# Build only following subdirs (empty will build all dirs, ignored with custom script) +AppSubdirsBuild='' + +# Exclude these files from build +AppBuildExclude='' + +# Application command line parameters, including app name as 0-th param +AppCmdline='XSDL -nohelp -exec $SECURE_STORAGE_DIR/img/proot.sh -c ./startx.sh' + +# Screen size is used by Google Play to prevent an app to be installed on devices with smaller screens +# Minimum screen size that application supports: (s)mall / (m)edium / (l)arge +MinimumScreenSize=m + +# Your AdMob Publisher ID, (n) if you don't want advertisements +AdmobPublisherId=n + +# Your AdMob test device ID, to receive a test ad +AdmobTestDeviceId= + +# Your AdMob banner size (BANNER/IAB_BANNER/IAB_LEADERBOARD/IAB_MRECT/IAB_WIDE_SKYSCRAPER/SMART_BANNER) +AdmobBannerSize= + +# Right mouse button can do long-press/drag&drop action, necessary for some games (y) or (n) +# If you disable it, swiping with two fingers will send mouse wheel events +RightMouseButtonLongPress=n diff --git a/project/jni/application/xserver-debian/AndroidBuild.sh b/project/jni/application/xserver-debian/AndroidBuild.sh new file mode 120000 index 000000000..894909421 --- /dev/null +++ b/project/jni/application/xserver-debian/AndroidBuild.sh @@ -0,0 +1 @@ +../xserver/AndroidBuild.sh \ No newline at end of file diff --git a/project/jni/application/xserver-debian/AndroidData/DroidSansMono.ttf b/project/jni/application/xserver-debian/AndroidData/DroidSansMono.ttf new file mode 120000 index 000000000..0cfbee59b --- /dev/null +++ b/project/jni/application/xserver-debian/AndroidData/DroidSansMono.ttf @@ -0,0 +1 @@ +../../xserver/AndroidData/DroidSansMono.ttf \ No newline at end of file diff --git a/project/jni/application/xserver-debian/AndroidData/data-1.tgz b/project/jni/application/xserver-debian/AndroidData/data-1.tgz new file mode 120000 index 000000000..2a2d243ac --- /dev/null +++ b/project/jni/application/xserver-debian/AndroidData/data-1.tgz @@ -0,0 +1 @@ +../xserver/data/data-1.tgz \ No newline at end of file diff --git a/project/jni/application/xserver-debian/AndroidData/postinstall.sh b/project/jni/application/xserver-debian/AndroidData/postinstall.sh new file mode 100755 index 000000000..dbc3408ae --- /dev/null +++ b/project/jni/application/xserver-debian/AndroidData/postinstall.sh @@ -0,0 +1,10 @@ +#!/system/bin/sh + +rm -rf $SDCARD/ubuntu + +cd $SECURE_STORAGE_DIR +./busybox tar xzf $UNSECURE_STORAGE_DIR/data-1.tar.gz +rm -f $UNSECURE_STORAGE_DIR/data-1.tar.gz +export SECURE_STORAGE_DIR=$SECURE_STORAGE_DIR/img +cd $SECURE_STORAGE_DIR +./postinstall.sh diff --git a/project/jni/application/xserver-debian/gfx.c b/project/jni/application/xserver-debian/gfx.c new file mode 120000 index 000000000..ccab9cb4c --- /dev/null +++ b/project/jni/application/xserver-debian/gfx.c @@ -0,0 +1 @@ +../xserver/gfx.c \ No newline at end of file diff --git a/project/jni/application/xserver-debian/gfx.h b/project/jni/application/xserver-debian/gfx.h new file mode 120000 index 000000000..75e09da82 --- /dev/null +++ b/project/jni/application/xserver-debian/gfx.h @@ -0,0 +1 @@ +../xserver/gfx.h \ No newline at end of file diff --git a/project/jni/application/xserver-debian/icon.png b/project/jni/application/xserver-debian/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..89df44d621972e7c955078f2b6d9c41c8e27a648 GIT binary patch literal 31222 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 is path to this repo): + +sudo cp -a /project/jni/application/src/xserver/data/usr/ dist-gimp-wheezy/ +sudo cp -a /project/jni/application/src/xserver/android/xhost dist-gimp-wheezy/usr/bin/ +sudo cp -a /project/jni/application/src/xserver/android/xkbcomp dist-gimp-wheezy/usr/bin/ +sudo cp -a /project/jni/application/src/xserver/android/xli dist-gimp-wheezy/usr/bin/ + +Update system image archive + +cd dist-gimp-wheezy +sudo tar cvzf ../dist-gimp-wheezy.tar.gz * + +Upload resulting system image somewhere, and change download URL inside +AndroidAppSettings.cfg, then recompile .apk file. diff --git a/project/jni/application/xserver-debian/xserver b/project/jni/application/xserver-debian/xserver new file mode 160000 index 000000000..0d6c8e37a --- /dev/null +++ b/project/jni/application/xserver-debian/xserver @@ -0,0 +1 @@ +Subproject commit 0d6c8e37a0027ecbe865bc477e3fff237ed58aa2 diff --git a/project/jni/application/xserver/gfx.c b/project/jni/application/xserver/gfx.c index 6244305bf..1d2612243 100644 --- a/project/jni/application/xserver/gfx.c +++ b/project/jni/application/xserver/gfx.c @@ -19,6 +19,7 @@ static TTF_Font* sFont; static int unpackProgressMb; static int unpackProgressMbTotal = 1; +static int unpackProgressRunningScript = 0; static int unpackFinished = 0; static void renderString(const char *c, int x, int y); @@ -31,6 +32,7 @@ static void showErrorMessage(const char *msg); void * unpackFilesThread(void * unused) { char fname[PATH_MAX*2]; + char fname2[PATH_MAX*2]; char buf[1024 * 4]; strcpy( fname, getenv("SECURE_STORAGE_DIR") ); strcat( fname, "/usr/lib/xorg/protocol.txt" ); @@ -67,9 +69,9 @@ void * unpackFilesThread(void * unused) int unpackProgressKb = 0; for(;;) { - __android_log_print(ANDROID_LOG_INFO, "XSDL", "FREAD %d", unpackProgressKb); + //__android_log_print(ANDROID_LOG_INFO, "XSDL", "FREAD %d", unpackProgressKb); int cnt = fread( buf, 1, sizeof(buf), ff ); - __android_log_print(ANDROID_LOG_INFO, "XSDL", "FREAD %d READ %d", unpackProgressKb, cnt); + //__android_log_print(ANDROID_LOG_INFO, "XSDL", "FREAD %d READ %d", unpackProgressKb, cnt); if( cnt < 0 ) { __android_log_print(ANDROID_LOG_INFO, "XSDL", "Error extracting data"); @@ -86,7 +88,7 @@ void * unpackFilesThread(void * unused) unpackProgressMb++; } } - __android_log_print(ANDROID_LOG_INFO, "XSDL", "FREAD %d DONE", unpackProgressKb); + __android_log_print(ANDROID_LOG_INFO, "XSDL", "FREAD %dKb DONE", unpackProgressKb); fclose(ff); if( pclose(fo) != 0 ) // Returns error on Android 2.3 emulator! @@ -109,6 +111,13 @@ void * unpackFilesThread(void * unused) return (void *)1; } + unpackProgressRunningScript = 1; + __android_log_print(ANDROID_LOG_INFO, "XSDL", "Setting executable permissions on postinstall scipt"); + + strcpy( fname2, "chmod 755 " ); + strcat( fname2, fname ); + system( fname2 ); + __android_log_print(ANDROID_LOG_INFO, "XSDL", "Running postinstall scipt"); fo = popen(fname, "r"); @@ -144,7 +153,7 @@ void XSDL_unpackFiles() SDL_FillRect(SDL_GetVideoSurface(), NULL, 0); char s[128]; sprintf(s, "Unpacking data: %d/%d Mb, %d%%", unpackProgressMb, unpackProgressMbTotal, unpackProgressMb * 100 / (unpackProgressMbTotal > 0 ? unpackProgressMbTotal : 1)); - renderString(s, VID_X/2, VID_Y/3); + renderString(unpackProgressRunningScript ? "Running postinstall script..." : s, VID_X/2, VID_Y/3); renderString("You may put this app to background while it's unpacking", VID_X/2, VID_Y*2/3); SDL_Flip(SDL_GetVideoSurface()); } diff --git a/project/jni/boost/src b/project/jni/boost/src index 5824acb45..82900d3d0 160000 --- a/project/jni/boost/src +++ b/project/jni/boost/src @@ -1 +1 @@ -Subproject commit 5824acb451e671205afeb188576be1dd9a2674bd +Subproject commit 82900d3d0e9638172f7d65d130ca75f810cefb48 diff --git a/project/jni/shmem b/project/jni/shmem index c2a28f528..c46ed96dc 160000 --- a/project/jni/shmem +++ b/project/jni/shmem @@ -1 +1 @@ -Subproject commit c2a28f528d0b1b2528dda125e8fe8018609e7e9a +Subproject commit c46ed96dc63373ca46ecd026b25817266ce367ba