int main( int argc, char* argv[] ) { int i; char screenres[128] = "640x480x24"; char clientcmd[PATH_MAX] = ""; char * cmd = ""; char fontpath[PATH_MAX] = ""; char* args[64] = { "XSDL", port, "-nolock", "-noreset", "-nopn", "-nolisten", "unix", "-fp", fontpath, "-screen", screenres, }; int argnum = 11; char * envp[] = { NULL }; int printHelp = 1; int screenResOverride = 0; int screenButtons = 0; int warnDiskSpaceMb = 0; int builtinKeyboard = 0; int resolutionW = atoi(getenv("DISPLAY_RESOLUTION_WIDTH")); int resolutionH = atoi(getenv("DISPLAY_RESOLUTION_HEIGHT")); int displayW = atoi(getenv("DISPLAY_WIDTH_MM")); int displayH = atoi(getenv("DISPLAY_HEIGHT_MM")); __android_log_print(ANDROID_LOG_INFO, "XSDL", "Actual video resolution %d/%dx%d/%d", resolutionW, displayW, resolutionH, displayH); setupEnv(); SDL_ANDROID_SetScreenKeyboardShown(0); XSDL_initSDL(); while( argc > 1 ) { if( argv[1][0] == ':') { strcpy(port, argv[1]); } else if( strcmp(argv[1], "-nohelp") == 0 ) { printHelp = 0; } else if( strcmp(argv[1], "-screen") == 0 ) { screenResOverride = 1; argc--; argv++; strcpy(screenres, argv[1]); } else if( strcmp(argv[1], "-screenbuttons") == 0 ) { screenButtons = 1; } else if( strcmp(argv[1], "-warndiskspacemb") == 0 && argc > 2 ) { warnDiskSpaceMb = atoi(argv[2]); argc--; argv++; } else { args[argnum] = argv[1]; argnum++; } argc--; argv++; } if (getenv("SDL_RESTART_PARAMS") && getenv("SDL_RESTART_PARAMS")[0]) strcpy(port, getenv("SDL_RESTART_PARAMS")); snprintf(fontpath, sizeof(fontpath), "%s/img/usr/share/fonts/X11/misc," "%s/img/usr/share/fonts/X11/Type1," "%s/img/usr/share/fonts/X11/100dpi," "%s/img/usr/share/fonts/X11/75dpi," "%s/img/usr/share/fonts/X11/cyrillic," "%s/usr/share/fonts", getenv("SECURE_STORAGE_DIR"), getenv("SECURE_STORAGE_DIR"), getenv("SECURE_STORAGE_DIR"), getenv("SECURE_STORAGE_DIR"), getenv("SECURE_STORAGE_DIR"), getenv("SECURE_STORAGE_DIR") ); XSDL_unpackFiles(warnDiskSpaceMb); if( !screenResOverride ) { XSDL_showConfigMenu(&resolutionW, &displayW, &resolutionH, &displayH, &builtinKeyboard, &screenButtons); sprintf( screenres, "%d/%dx%d/%dx%d", resolutionW, displayW, resolutionH, displayH, SDL_GetVideoInfo()->vfmt->BitsPerPixel ); } XSDL_generateBackground( port, printHelp, resolutionW, resolutionH ); XSDL_deinitSDL(); if( printHelp ) { sprintf( clientcmd, "%s/usr/bin/xhost + ; %s/usr/bin/xli -onroot -center %s/background.bmp", getenv("SECURE_STORAGE_DIR"), getenv("SECURE_STORAGE_DIR"), getenv("UNSECURE_STORAGE_DIR") ); args[argnum] = "-exec"; args[argnum+1] = clientcmd; argnum += 2; } SDL_ANDROID_SetScreenKeyboardShown( 1 ); if( screenButtons && !SDL_ANDROID_GetScreenKeyboardRedefinedByUser() ) { // Button coords are handled inside xserver/hw/kdrive/sdl/sdl.c SDL_ANDROID_SetScreenKeyboardButtonShown(SDL_ANDROID_SCREENKEYBOARD_BUTTON_0, 1); } else { SDL_ANDROID_SetScreenKeyboardButtonShown(SDL_ANDROID_SCREENKEYBOARD_BUTTON_0, 0); SDL_ANDROID_SetScreenKeyboardButtonShown(SDL_ANDROID_SCREENKEYBOARD_BUTTON_1, 0); SDL_ANDROID_SetScreenKeyboardButtonShown(SDL_ANDROID_SCREENKEYBOARD_BUTTON_2, 0); } { char s[16]; sprintf(s, "%d", builtinKeyboard); setenv("XSDL_BUILTIN_KEYBOARD", s, 1); } __android_log_print(ANDROID_LOG_INFO, "XSDL", "XSDL video resolution %s, args:", screenres); 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 - 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 android_main( argnum, args, envp ); // Should never exit on success, if we want to terminate we kill ourselves return 0; }
static void IN_ShowHideScreenButtons( void ) { #ifdef __ANDROID__ SDL_Rect rect, rect2; int i; static SDL_Rect userRedefinedPos[SDL_ANDROID_SCREENKEYBOARD_BUTTON_NUM]; if( hideScreenKeys ) return; // Show/hide Android on-screen buttons, when we enter/leave menu SDL_ANDROID_GetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD, &rect); if( Key_GetCatcher( ) & ~KEYCATCH_CGAME || clc.state != CA_ACTIVE ) { if( rect.w > 0 ) { for( i = 0; i < SDL_ANDROID_SCREENKEYBOARD_BUTTON_NUM; i++ ) SDL_ANDROID_GetScreenKeyboardButtonPos(i, &userRedefinedPos[i]); rect.w = rect.h = 0; SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD, &rect); SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_0, &rect); SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_1, &rect); SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_2, &rect); SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_3, &rect); SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_4, &rect); SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_5, &rect); // TODO: implement automatic keyboard toggling from text fields - see MenuField_Key() rect.w = rect.h = cls.glconfig.vidHeight / 10; rect.x = rect.y = 0; SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT, &rect); } } else { if( rect.w <= 0 ) { // Four buttons in a row, plus joystick, which is 2x bigger than buttons. // Text input rect.x = rect.y = rect2.x = rect2.y = 0; rect.w = rect.h = cls.glconfig.vidHeight / 6; rect2.w = rect2.h = rect.w / 2; rect2.y += rect2.h/2; SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT, &rect); SDL_ANDROID_SetScreenKeyboardButtonImagePos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT, &rect2); // Scoretable rect.y += rect.h; rect2.y += rect.h; SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_2, &rect); SDL_ANDROID_SetScreenKeyboardButtonImagePos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_2, &rect2); // Sniper view rect.x = cls.glconfig.vidWidth - rect.w; rect2.x = cls.glconfig.vidWidth - rect2.w; SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_1, &rect); SDL_ANDROID_SetScreenKeyboardButtonImagePos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_1, &rect2); // Change weapon rect.y += rect.h; rect2.y += rect.h; rect.x = 0; rect2.x = 0; SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_0, &rect); SDL_ANDROID_SetScreenKeyboardButtonImagePos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_0, &rect2); // Jump rect.x = cls.glconfig.vidWidth - rect.w; rect2.x = cls.glconfig.vidWidth - rect2.w; SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_5, &rect); SDL_ANDROID_SetScreenKeyboardButtonImagePos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_5, &rect2); if ( cg_touchscreenControls->integer == TOUCHSCREEN_SWIPE_FREE_AIMING ) { // Centerview rect.y += rect.h; rect.x = 0; rect.w *= 2; SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_3, &rect); // Dpad rect.y += rect.h; rect.x = 0; rect.w = rect.h = cls.glconfig.vidHeight - rect.y; SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD, &rect); } else { // Dpad rect.y += rect.h; rect.x = 0; rect.w = rect.h = cls.glconfig.vidHeight - rect.y; rect2.w = rect2.h = rect.w / 2; rect2.x = rect.x + rect2.w / 2; rect2.y = rect.y + rect2.h / 2; SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD, &rect); SDL_ANDROID_SetScreenKeyboardButtonImagePos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD, &rect2); } if( cg_touchscreenControls->integer == TOUCHSCREEN_FIRE_BUTTON ) { rect.w = cls.glconfig.vidHeight * 2 / 9; rect.h = rect.w; rect.x = cls.glconfig.vidWidth - rect.w * 2; rect.y = cls.glconfig.vidHeight - rect.h * 2; // Fire button SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_4, &rect); SDL_ANDROID_SetScreenKeyboardButtonGenerateTouchEvents(SDL_ANDROID_SCREENKEYBOARD_BUTTON_4, 1); } if( SDL_ANDROID_GetScreenKeyboardRedefinedByUser() ) { for( i = 0; i < SDL_ANDROID_SCREENKEYBOARD_BUTTON_NUM; i++ ) { if( !( cg_touchscreenControls->integer != TOUCHSCREEN_FIRE_BUTTON && i == SDL_ANDROID_SCREENKEYBOARD_BUTTON_4 ) ) SDL_ANDROID_SetScreenKeyboardButtonPos(i, &userRedefinedPos[i]); } } } } #endif }
void CUI::AndroidShowScreenKeys(bool shown) { #if defined(__ANDROID__) static bool ScreenKeyboardInitialized = false; static bool ScreenKeyboardShown = true; static SDL_Rect Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_NUM]; static SDL_Rect ButtonHidden = { 0, 0, 0, 0 }; if( !ScreenKeyboardInitialized ) { ScreenKeyboardInitialized = true; for( int i = 0; i < SDL_ANDROID_SCREENKEYBOARD_BUTTON_NUM; i++ ) SDL_ANDROID_GetScreenKeyboardButtonPos( i, &Buttons[i] ); if( !SDL_ANDROID_GetScreenKeyboardRedefinedByUser() ) { int ScreenW = Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD2].x + Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD2].w; int ScreenH = Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD2].y + Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD2].h; // Hide Hook button(it was above Weapnext) Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_0].x = Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_1].x; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_0].y = Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_1].y - Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_0].h; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_0].w = 0; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_0].h = 0; // Hide Weapprev button Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_2].x = Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_0].x; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_2].y = Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_1].y - Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_2].h; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_2].w = 0; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_2].h = 0; // Scores button above left joystick Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_3].x = 0; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_3].y = Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD].y - Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_3].h * 2.0f; // Text input button above scores //Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT].w = // Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_3].w; //Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT].h = // Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_3].h; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT].x = 0; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT].y = Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_3].y - Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT].h; // Spec next button Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_5].x = ScreenW - Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_4].w; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_5].y = Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD2].y - Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_5].h; // Spec prev button Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_4].x = Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_5].x - Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_4].w; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_4].y = Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_5].y; // Weap next button Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_1].x = ScreenW - Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_1].w; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_1].y = Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_5].y - Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_1].h; // Bigger joysticks /* Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD].w *= 1.25; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD].h *= 1.25; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD].y = ScreenH - Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD].h; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD2].w *= 1.25; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD2].h *= 1.25; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD2].x = ScreenW - Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD2].w; Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD2].y = ScreenH - Buttons[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD2].h; */ } } if( ScreenKeyboardShown == shown ) return; ScreenKeyboardShown = shown; for( int i = 0; i < SDL_ANDROID_SCREENKEYBOARD_BUTTON_NUM; i++ ) SDL_ANDROID_SetScreenKeyboardButtonPos( i, shown ? &Buttons[i] : &ButtonHidden ); #endif }