X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=d3cb7b1f806b76902d6fd7c982a7f2da5e756e10;hb=a7c06161253796a30a0237a7f5a044f459c8cf35;hp=8c38785210b777bfdcb744723d2b1faf4a1d25a4;hpb=94f017e57e45fae89e35a4948fe7005bdf3f13ba;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 8c387852..d3cb7b1f 100644 --- a/src/screens.c +++ b/src/screens.c @@ -38,6 +38,8 @@ #define MAX_INFO_MODES 8 /* screens on the setup screen */ +/* (must match GFX_SPECIAL_ARG_SETUP_* values as defined in src/main.h) */ +/* (should also match corresponding entries in src/conf_gfx.c) */ #define SETUP_MODE_MAIN 0 #define SETUP_MODE_GAME 1 #define SETUP_MODE_EDITOR 2 @@ -59,15 +61,16 @@ /* sub-screens on the setup screen (specific) */ #define SETUP_MODE_CHOOSE_GAME_SPEED 15 #define SETUP_MODE_CHOOSE_SCREEN_MODE 16 -#define SETUP_MODE_CHOOSE_SCROLL_DELAY 17 -#define SETUP_MODE_CHOOSE_GRAPHICS 18 -#define SETUP_MODE_CHOOSE_SOUNDS 19 -#define SETUP_MODE_CHOOSE_MUSIC 20 -#define SETUP_MODE_CHOOSE_VOLUME_SIMPLE 21 -#define SETUP_MODE_CHOOSE_VOLUME_LOOPS 22 -#define SETUP_MODE_CHOOSE_VOLUME_MUSIC 23 +#define SETUP_MODE_CHOOSE_WINDOW_SIZE 17 +#define SETUP_MODE_CHOOSE_SCROLL_DELAY 18 +#define SETUP_MODE_CHOOSE_GRAPHICS 19 +#define SETUP_MODE_CHOOSE_SOUNDS 20 +#define SETUP_MODE_CHOOSE_MUSIC 21 +#define SETUP_MODE_CHOOSE_VOLUME_SIMPLE 22 +#define SETUP_MODE_CHOOSE_VOLUME_LOOPS 23 +#define SETUP_MODE_CHOOSE_VOLUME_MUSIC 24 -#define MAX_SETUP_MODES 24 +#define MAX_SETUP_MODES 25 /* for input setup functions */ #define SETUPINPUT_SCREEN_POS_START 0 @@ -174,6 +177,9 @@ static int setup_mode = SETUP_MODE_MAIN; static TreeInfo *screen_modes = NULL; static TreeInfo *screen_mode_current = NULL; +static TreeInfo *window_sizes = NULL; +static TreeInfo *window_size_current = NULL; + static TreeInfo *scroll_delays = NULL; static TreeInfo *scroll_delay_current = NULL; @@ -192,6 +198,28 @@ static TreeInfo *volume_music_current = NULL; static TreeInfo *level_number = NULL; static TreeInfo *level_number_current = NULL; +static struct +{ + int value; + char *text; +} window_sizes_list[] = +{ + { 50, "50 %" }, + { 80, "80 %" }, + { 90, "90 %" }, + { 100, "100 % (Default)" }, + { 110, "110 %" }, + { 120, "120 %" }, + { 130, "130 %" }, + { 140, "140 %" }, + { 150, "150 %" }, + { 200, "200 %" }, + { 250, "250 %" }, + { 300, "300 %" }, + + { -1, NULL }, +}; + static struct { int value; @@ -2969,9 +2997,16 @@ void DrawInfoScreen_Version() #if defined(TARGET_SDL) int xstart3 = mSX + 29 * xstep; SDL_version sdl_version_compiled; +#if defined(TARGET_SDL2) + SDL_version sdl_version_linked_ext; +#endif const SDL_version *sdl_version_linked; +#if defined(TARGET_SDL2) + const char *driver_name = NULL; +#else int driver_name_len = 8; char driver_name[driver_name_len]; +#endif #endif SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_VERSION); @@ -3011,7 +3046,12 @@ void DrawInfoScreen_Version() DrawTextF(xstart3, ystart2, font_header, "linked"); SDL_VERSION(&sdl_version_compiled); +#if defined(TARGET_SDL2) + SDL_GetVersion(&sdl_version_linked_ext); + sdl_version_linked = &sdl_version_linked_ext; +#else sdl_version_linked = SDL_Linked_Version(); +#endif ystart2 += 2 * ystep; DrawTextF(xstart1, ystart2, font_text, "SDL"); @@ -3071,14 +3111,22 @@ void DrawInfoScreen_Version() DrawTextF(xstart2, ystart2, font_header, "Requested"); DrawTextF(xstart3, ystart2, font_header, "Used"); +#if defined(TARGET_SDL2) + driver_name = SDL_GetVideoDriver(0); +#else SDL_VideoDriverName(driver_name, driver_name_len); +#endif ystart2 += 2 * ystep; DrawTextF(xstart1, ystart2, font_text, "SDL_VideoDriver"); DrawTextF(xstart2, ystart2, font_text, "%s", setup.system.sdl_videodriver); DrawTextF(xstart3, ystart2, font_text, "%s", driver_name); +#if defined(TARGET_SDL2) + driver_name = SDL_GetAudioDriver(0); +#else SDL_AudioDriverName(driver_name, driver_name_len); +#endif ystart2 += ystep; DrawTextF(xstart1, ystart2, font_text, "SDL_AudioDriver"); @@ -3570,6 +3618,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, if (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED) execSetupGame(); else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE || + setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE || setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY) execSetupGraphics(); else if (setup_mode == SETUP_MODE_CHOOSE_VOLUME_SIMPLE || @@ -3740,7 +3789,11 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } else { +#if 1 + FadeSetEnterMenu(); +#else FadeSetEnterScreen(); +#endif node_cursor->cl_first = ti->cl_first; node_cursor->cl_cursor = ti->cl_cursor; @@ -3760,6 +3813,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, if (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED) execSetupGame(); else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE || + setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE || setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY) execSetupGraphics(); else if (setup_mode == SETUP_MODE_CHOOSE_VOLUME_SIMPLE || @@ -4026,6 +4080,7 @@ static struct TokenInfo *setup_info; static int num_setup_info; static char *screen_mode_text; +static char *window_size_text; static char *scroll_delay_text; static char *game_speed_text; static char *graphics_set_name; @@ -4110,9 +4165,95 @@ static void execSetupEditor() DrawSetupScreen(); } -static void execSetupGraphics() +static void execSetupGraphics_setWindowSizes(boolean update_list) +{ + if (window_sizes != NULL && update_list) + { + freeTreeInfo(window_sizes); + + window_sizes = NULL; + } + + if (window_sizes == NULL) + { + boolean current_window_size_found = FALSE; + int i; + + for (i = 0; window_sizes_list[i].value != -1; i++) + { + TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED); + char identifier[32], name[32]; + int value = window_sizes_list[i].value; + char *text = window_sizes_list[i].text; + + ti->node_top = &window_sizes; + ti->sort_priority = value; + + sprintf(identifier, "%d", value); + sprintf(name, "%s", text); + + setString(&ti->identifier, identifier); + setString(&ti->name, name); + setString(&ti->name_sorting, name); + setString(&ti->infotext, "Window Scaling"); + + pushTreeInfo(&window_sizes, ti); + + if (value == setup.window_scaling_percent) + current_window_size_found = TRUE; + } + + if (!current_window_size_found) + { + // add entry for non-preset window scaling value + + TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED); + char identifier[32], name[32]; + int value = setup.window_scaling_percent; + + ti->node_top = &window_sizes; + ti->sort_priority = value; + + sprintf(identifier, "%d", value); + sprintf(name, "%d %% (Current)", value); + + setString(&ti->identifier, identifier); + setString(&ti->name, name); + setString(&ti->name_sorting, name); + setString(&ti->infotext, "Window Scaling"); + + pushTreeInfo(&window_sizes, ti); + } + + /* sort window size values to start with lowest window size value */ + sortTreeInfo(&window_sizes); + + /* set current window size value to configured window size value */ + window_size_current = + getTreeInfoFromIdentifier(window_sizes, + i_to_a(setup.window_scaling_percent)); + + /* if that fails, set current window size to reliable default value */ + if (window_size_current == NULL) + window_size_current = + getTreeInfoFromIdentifier(window_sizes, + i_to_a(STD_WINDOW_SCALING_PERCENT)); + + /* if that also fails, set current window size to first available value */ + if (window_size_current == NULL) + window_size_current = window_sizes; + } + + setup.window_scaling_percent = atoi(window_size_current->identifier); + + /* needed for displaying window size text instead of identifier */ + window_size_text = window_size_current->name; +} + +static void execSetupGraphics_setScreenModes() { - if (video.fullscreen_available && screen_modes == NULL) + // if (screen_modes == NULL && video.fullscreen_available) + if (screen_modes == NULL && video.fullscreen_modes != NULL) { int i; @@ -4160,15 +4301,18 @@ static void execSetupGraphics() video.fullscreen_available = FALSE; } - if (video.fullscreen_available) + // if (video.fullscreen_available) + if (screen_mode_current != NULL) { setup.fullscreen_mode = screen_mode_current->identifier; /* needed for displaying screen mode name instead of identifier */ screen_mode_text = screen_mode_current->name; } +} -#if 1 +static void execSetupGraphics_setScrollDelays() +{ if (scroll_delays == NULL) { int i; @@ -4215,13 +4359,37 @@ static void execSetupGraphics() /* needed for displaying scroll delay text instead of identifier */ scroll_delay_text = scroll_delay_current->name; -#endif +} + +static void execSetupGraphics() +{ + // update "setup.window_scaling_percent" from list selection + execSetupGraphics_setWindowSizes(FALSE); + // maybe remove non-preset value (if standard value was selected) + execSetupGraphics_setWindowSizes(TRUE); + + execSetupGraphics_setScreenModes(); + execSetupGraphics_setScrollDelays(); setup_mode = SETUP_MODE_GRAPHICS; DrawSetupScreen(); } +#if !defined(PLATFORM_ANDROID) +#if defined(TARGET_SDL2) +static void execSetupChooseWindowSize() +{ +#if 0 + if (!video.window_scaling_available) + return; +#endif + + setup_mode = SETUP_MODE_CHOOSE_WINDOW_SIZE; + + DrawSetupScreen(); +} +#else static void execSetupChooseScreenMode() { if (!video.fullscreen_available) @@ -4231,6 +4399,8 @@ static void execSetupChooseScreenMode() DrawSetupScreen(); } +#endif +#endif static void execSetupChooseScrollDelay() { @@ -4580,9 +4750,16 @@ static struct TokenInfo setup_info_editor[] = static struct TokenInfo setup_info_graphics[] = { +#if !defined(PLATFORM_ANDROID) { TYPE_SWITCH, &setup.fullscreen, "Fullscreen:" }, +#if defined(TARGET_SDL2) + { TYPE_ENTER_LIST, execSetupChooseWindowSize, "Window Scaling:" }, + { TYPE_STRING, &window_size_text, "" }, +#else { TYPE_ENTER_LIST, execSetupChooseScreenMode, "Fullscreen Mode:" }, { TYPE_STRING, &screen_mode_text, "" }, +#endif +#endif #if 0 { TYPE_SWITCH, &setup.scroll_delay, "Scroll Delay:" }, #endif @@ -5103,7 +5280,8 @@ static void DrawSetupScreen_Generic() (value_ptr == &setup.sound_loops && !audio.loops_available) || (value_ptr == &setup.sound_music && !audio.music_available) || (value_ptr == &setup.fullscreen && !video.fullscreen_available) || - (value_ptr == &screen_mode_text && !video.fullscreen_available)) + (value_ptr == &screen_mode_text && !video.fullscreen_available) || + (value_ptr == &window_size_text && !video.window_scaling_available)) setup_info[i].type |= TYPE_GHOSTED; if (setup_info[i].type & (TYPE_ENTER_MENU|TYPE_ENTER_LIST)) @@ -5939,6 +6117,8 @@ void DrawSetupScreen() DrawChooseTree(&game_speed_current); else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE) DrawChooseTree(&screen_mode_current); + else if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE) + DrawChooseTree(&window_size_current); else if (setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY) DrawChooseTree(&scroll_delay_current); else if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS) @@ -5962,8 +6142,19 @@ void DrawSetupScreen() void RedrawSetupScreenAfterFullscreenToggle() { +#if 1 + if (setup_mode == SETUP_MODE_GRAPHICS || + setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE) + { + // update "setup.window_scaling_percent" from list selection + execSetupGraphics_setWindowSizes(TRUE); + + DrawSetupScreen(); + } +#else if (setup_mode == SETUP_MODE_GRAPHICS) DrawSetupScreen(); +#endif } void HandleSetupScreen(int mx, int my, int dx, int dy, int button) @@ -5974,6 +6165,8 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button) HandleChooseTree(mx, my, dx, dy, button, &game_speed_current); else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE) HandleChooseTree(mx, my, dx, dy, button, &screen_mode_current); + else if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE) + HandleChooseTree(mx, my, dx, dy, button, &window_size_current); else if (setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY) HandleChooseTree(mx, my, dx, dy, button, &scroll_delay_current); else if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS)