diff --git a/project/jni/application/xserver/AndroidAppSettings.cfg b/project/jni/application/xserver/AndroidAppSettings.cfg index 7eb68c13f..13e7aae1e 100644 --- a/project/jni/application/xserver/AndroidAppSettings.cfg +++ b/project/jni/application/xserver/AndroidAppSettings.cfg @@ -7,10 +7,10 @@ AppName="XServer XSDL" AppFullName=x.org.server # Application version code (integer) -AppVersionCode=11130 +AppVersionCode=11131 # Application user-visible version name (string) -AppVersionName="1.11.30" +AppVersionName="1.11.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 diff --git a/project/jni/application/xserver/main.c b/project/jni/application/xserver/main.c index 04d3a8761..a463b1cdd 100644 --- a/project/jni/application/xserver/main.c +++ b/project/jni/application/xserver/main.c @@ -10,21 +10,23 @@ #include #include #include +#include #include #include "gfx.h" extern int android_main( int argc, char *argv[], char *envp[] ); -static void setupEnv(void); +static void retryLaunchWithDifferentPort(void); static void showError(void); +static void setupEnv(void); +static char port[16] = ":0"; int main( int argc, char* argv[] ) { int i; char screenres[128] = "640x480x24"; char clientcmd[PATH_MAX] = ""; - char port[16] = ":1111"; char * cmd = ""; char fontpath[PATH_MAX] = ""; char* args[64] = { @@ -32,12 +34,15 @@ int main( int argc, char* argv[] ) port, "-nolock", "-noreset", + "-nopn", + "-nolisten", + "unix", "-fp", fontpath, "-screen", screenres, }; - int argnum = 8; + int argnum = 11; char * envp[] = { NULL }; int printHelp = 1; int screenResOverride = 0; @@ -56,52 +61,6 @@ int main( int argc, char* argv[] ) XSDL_initSDL(); - for(i = 0; i < 1024; i++) - { - int s = socket(AF_INET, SOCK_STREAM, 0); - if( s >= 0 ) - { - struct sockaddr_in addr; - - memset(&addr, 0, sizeof(addr)); - - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = INADDR_ANY; - addr.sin_port = htons(6000 + i); - - if( bind (s, (struct sockaddr *) &addr, sizeof(addr) ) != 0 ) - { - __android_log_print(ANDROID_LOG_INFO, "XSDL", "TCP port %d already used, trying next one: %s", 6000 + i, strerror(errno)); - close(s); - continue; - } - close(s); - } - - FILE * ff = fopen("/proc/net/unix", "rb"); - if( ff ) - { - char buf[512], name[512]; - int found = 0; - sprintf(name, "/tmp/.X11-unix/X%d", i); - while( fgets(buf, sizeof(buf), ff) ) - { - if( strstr(buf, name) != NULL ) - { - __android_log_print(ANDROID_LOG_INFO, "XSDL", "UNIX path %s already used, trying next one", name); - found = 1; - break; - } - } - fclose(ff); - if( found ) - continue; - } - - sprintf( port, ":%d", i ); - break; - } - while( argc > 1 ) { if( argv[1][0] == ':') @@ -138,6 +97,9 @@ int main( int argc, char* argv[] ) argv++; } + if (getenv("SDL_RESTART_PARAMS") && getenv("SDL_RESTART_PARAMS")[0]) + strcpy(port, getenv("SDL_RESTART_PARAMS")); + sprintf(fontpath, "%s/img/usr/share/fonts/X11/misc," "%s/img/usr/share/fonts/X11/Type1," "%s/img/usr/share/fonts/X11/100dpi," @@ -188,11 +150,15 @@ int main( int argc, char* argv[] ) for( i = 0; i < argnum; i++ ) __android_log_print(ANDROID_LOG_INFO, "XSDL", "> %s", args[i]); - // We should never quit. If that happens, then the server did not start - show error. - atexit( &showError ); + // We should never quit. If that happens, then the server did not start - try with different port number. + atexit( &retryLaunchWithDifferentPort ); + __android_log_print(ANDROID_LOG_INFO, "XSDL", "XSDL chdir to: %s", getenv("SECURE_STORAGE_DIR")); chdir( getenv("SECURE_STORAGE_DIR") ); // Megahack: change /proc/self/cwd to the X.org data dir, and use /proc/self/cwd path in libX11 - return android_main( argnum, args, envp ); + + android_main( argnum, args, envp ); // Should never exit on success, if we want to terminate we kill ourselves + + return 0; } void setupEnv(void) @@ -220,9 +186,18 @@ void setupEnv(void) sprintf( buf, "%s/usr/share/X11/locale", getenv("SECURE_STORAGE_DIR") ); } -void showError(void) +void retryLaunchWithDifferentPort(void) { - XSDL_initSDL(); - XSDL_showServerLaunchErrorMessage(); - XSDL_deinitSDL(); + int portNum = atoi(port + 1); + if (portNum > 10) + { + // Server was ultimately unable to start - show error and exit + XSDL_initSDL(); + XSDL_showServerLaunchErrorMessage(); + XSDL_deinitSDL(); + return; + } + sprintf(port, ":%d", portNum + 1); + __android_log_print(ANDROID_LOG_INFO, "XSDL", "XSDL launch failed, retrying with new display number %s", port); + SDL_ANDROID_RestartMyself(port); } diff --git a/project/jni/application/xserver/xserver b/project/jni/application/xserver/xserver index 5177211f7..6c5b2f113 160000 --- a/project/jni/application/xserver/xserver +++ b/project/jni/application/xserver/xserver @@ -1 +1 @@ -Subproject commit 5177211f7bf8d67eb912f75c9dafdc63935d0b9b +Subproject commit 6c5b2f113d4b761b5d367655dfb92a9eb3d5cfce