From b83972715fda5d73cb5e14290cbc003e6ef90294 Mon Sep 17 00:00:00 2001 From: adrian17 Date: Wed, 30 Jul 2014 12:54:36 +0200 Subject: [PATCH 1/4] Basic support for switching window/fullscreen with Alt+Enter --- src/osinterface.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/osinterface.c b/src/osinterface.c index be2e2605f2..7edbe19395 100644 --- a/src/osinterface.c +++ b/src/osinterface.c @@ -310,6 +310,22 @@ void osinterface_draw() } } +static void osinterface_toggle_fullscreen(){ + //may be useful if we create a dropdown window with all three options + const int fullscreen_modes[] = { 0, SDL_WINDOW_FULLSCREEN, SDL_WINDOW_FULLSCREEN_DESKTOP }; + + //temporary, only switches between window and true fullscreen + static int mode = 0; + mode = !mode; + + if(SDL_SetWindowFullscreen(_window, fullscreen_modes[mode])){ + RCT2_ERROR("SDL_SetWindowFullscreen %s", SDL_GetError()); + exit(1); + } + //SDL automatically resizes the fullscreen window to the nearest allowed screen resolution + //No need to call osinterface_resize() here, SDL_WINDOWEVENT_SIZE_CHANGED event will be triggered anyway +} + void osinterface_process_messages() { SDL_Event e; @@ -382,6 +398,8 @@ void osinterface_process_messages() case SDL_KEYDOWN: gLastKeyPressed = e.key.keysym.sym; gKeysPressed[e.key.keysym.scancode] = 1; + if (e.key.keysym.sym == SDLK_RETURN && e.key.keysym.mod & KMOD_ALT) + osinterface_toggle_fullscreen(); break; default: break; From 7d3e7a596eba52ac45dffc563a774c5e0708f5c5 Mon Sep 17 00:00:00 2001 From: adrian17 Date: Wed, 30 Jul 2014 13:53:12 +0200 Subject: [PATCH 2/4] Create a dropdown for fullscreen in options window. Uses placeholder text. --- src/osinterface.c | 35 +++++++++++++------------- src/osinterface.h | 3 +++ src/window_options.c | 60 ++++++++++++++++++++++++++++++++------------ 3 files changed, 65 insertions(+), 33 deletions(-) diff --git a/src/osinterface.c b/src/osinterface.c index 7edbe19395..47b10de334 100644 --- a/src/osinterface.c +++ b/src/osinterface.c @@ -170,6 +170,7 @@ static void osinterface_create_window() RCT2_GLOBAL(0x009E2D8C, sint32) = 0; + g_current_fullscreen_mode = 0; _window = SDL_CreateWindow("OpenRCT2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_RESIZABLE); if (!_window) { @@ -310,22 +311,6 @@ void osinterface_draw() } } -static void osinterface_toggle_fullscreen(){ - //may be useful if we create a dropdown window with all three options - const int fullscreen_modes[] = { 0, SDL_WINDOW_FULLSCREEN, SDL_WINDOW_FULLSCREEN_DESKTOP }; - - //temporary, only switches between window and true fullscreen - static int mode = 0; - mode = !mode; - - if(SDL_SetWindowFullscreen(_window, fullscreen_modes[mode])){ - RCT2_ERROR("SDL_SetWindowFullscreen %s", SDL_GetError()); - exit(1); - } - //SDL automatically resizes the fullscreen window to the nearest allowed screen resolution - //No need to call osinterface_resize() here, SDL_WINDOWEVENT_SIZE_CHANGED event will be triggered anyway -} - void osinterface_process_messages() { SDL_Event e; @@ -399,7 +384,7 @@ void osinterface_process_messages() gLastKeyPressed = e.key.keysym.sym; gKeysPressed[e.key.keysym.scancode] = 1; if (e.key.keysym.sym == SDLK_RETURN && e.key.keysym.mod & KMOD_ALT) - osinterface_toggle_fullscreen(); + osinterface_set_fullscreen_mode(!g_current_fullscreen_mode); break; default: break; @@ -432,6 +417,22 @@ void osinterface_free() SDL_Quit(); } +static const int fullscreen_modes[] = { 0, SDL_WINDOW_FULLSCREEN, SDL_WINDOW_FULLSCREEN_DESKTOP }; + +void osinterface_set_fullscreen_mode(int mode){ + if (mode == g_current_fullscreen_mode) + return; + + if (SDL_SetWindowFullscreen(_window, fullscreen_modes[mode])){ + RCT2_ERROR("SDL_SetWindowFullscreen %s", SDL_GetError()); + exit(1); + } + //SDL automatically resizes the fullscreen window to the nearest allowed screen resolution + //No need to call osinterface_resize() here, SDL_WINDOWEVENT_SIZE_CHANGED event will be triggered anyway + + g_current_fullscreen_mode = mode; +} + /** * * rct2: 0x004080EA diff --git a/src/osinterface.h b/src/osinterface.h index ea91c79a85..a660086c50 100644 --- a/src/osinterface.h +++ b/src/osinterface.h @@ -77,6 +77,9 @@ void osinterface_draw(); void osinterface_free(); void osinterface_update_palette(char* colours, int start_index, int num_colours); +int g_current_fullscreen_mode; +void osinterface_set_fullscreen_mode(int mode); + void osinterface_set_cursor(char cursor); int osinterface_open_common_file_dialog(int type, char *title, char *filename, char *filterPattern, char *filterName); diff --git a/src/window_options.c b/src/window_options.c index abeba984b1..766f75a3f6 100644 --- a/src/window_options.c +++ b/src/window_options.c @@ -22,6 +22,7 @@ #include "audio.h" #include "config.h" #include "gfx.h" +#include "osinterface.h" #include "string_ids.h" #include "viewport.h" #include "widget.h" @@ -55,6 +56,8 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_DISPLAY_GROUP, WIDX_RESOLUTION, WIDX_RESOLUTION_DROPDOWN, + WIDX_FULLSCREEN, + WIDX_FULLSCREEN_DROPDOWN, WIDX_TILE_SMOOTHING_CHECKBOX, WIDX_GRIDLINES_CHECKBOX, WIDX_CONSTRUCTION_MARKER, @@ -68,7 +71,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { }; #define WW 310 -#define WH 384 +#define WH 399 static rct_widget window_options_widgets[] = { { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, STR_NONE, STR_NONE }, @@ -92,19 +95,21 @@ static rct_widget window_options_widgets[] = { { WWT_DROPDOWN_BUTTON, 0, 288, 298, 157, 166, 0x36C, STR_NONE }, //jjj { WWT_DROPDOWN, 0, 155, 299, 171, 182, 0x364, STR_NONE }, // height labels { WWT_DROPDOWN_BUTTON, 0, 288, 298, 172, 181, 0x36C, STR_NONE }, - { WWT_GROUPBOX, 0, 3, 306, 194, 270, STR_DISPLAY, STR_NONE },// + { WWT_GROUPBOX, 0, 3, 306, 194, 285, STR_DISPLAY, STR_NONE },// { WWT_DROPDOWN, 0, 155, 299, 208, 219, 0x348, STR_NONE }, // resolution { WWT_DROPDOWN_BUTTON, 0, 288, 298, 209, 218, 0x36C, STR_NONE }, - { WWT_CHECKBOX, 0, 10, 299, 224, 235, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, - { WWT_CHECKBOX, 0, 10, 299, 239, 250, STR_GRIDLINES, STR_GRIDLINES_TIP }, - { WWT_DROPDOWN, 0, 155, 299, 253, 264, STR_NONE, STR_NONE }, // construction marker - { WWT_DROPDOWN_BUTTON, 0, 288, 298, 254, 263, 0x36C, STR_NONE }, - { WWT_GROUPBOX, 0, 3, 306, 276, 322, STR_CONTROLS, STR_NONE }, - { WWT_CHECKBOX, 2, 10, 299, 291, 302, STR_SCREEN_EDGE_SCROLLING, STR_SCREEN_EDGE_SCROLLING_TIP }, - { WWT_DROPDOWN_BUTTON, 0, 26, 185, 306, 316, STR_HOTKEY, STR_HOTKEY_TIP }, - { WWT_GROUPBOX, 0, 3, 306, 329, 377, STR_GENERAL, STR_NONE }, - { WWT_CHECKBOX, 2, 10, 299, 343, 354, STR_REAL_NAME, STR_REAL_NAME_TIP }, - { WWT_CHECKBOX, 2, 10, 299, 357, 369, STR_SAVE_PLUGIN_DATA, STR_SAVE_PLUGIN_DATA_TIP }, + { WWT_DROPDOWN, 0, 155, 299, 223, 234, 0x348, STR_NONE }, // fullscreen + { WWT_DROPDOWN_BUTTON, 0, 288, 298, 224, 233, 0x36C, STR_NONE }, + { WWT_CHECKBOX, 0, 10, 299, 239, 250, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, + { WWT_CHECKBOX, 0, 10, 299, 254, 265, STR_GRIDLINES, STR_GRIDLINES_TIP }, + { WWT_DROPDOWN, 0, 155, 299, 268, 279, STR_NONE, STR_NONE }, // construction marker + { WWT_DROPDOWN_BUTTON, 0, 288, 298, 269, 278, 0x36C, STR_NONE }, + { WWT_GROUPBOX, 0, 3, 306, 291, 337, STR_CONTROLS, STR_NONE }, + { WWT_CHECKBOX, 2, 10, 299, 306, 317, STR_SCREEN_EDGE_SCROLLING, STR_SCREEN_EDGE_SCROLLING_TIP }, + { WWT_DROPDOWN_BUTTON, 0, 26, 185, 321, 331, STR_HOTKEY, STR_HOTKEY_TIP }, + { WWT_GROUPBOX, 0, 3, 306, 344, 392, STR_GENERAL, STR_NONE }, + { WWT_CHECKBOX, 2, 10, 299, 358, 369, STR_REAL_NAME, STR_REAL_NAME_TIP }, + { WWT_CHECKBOX, 2, 10, 299, 372, 384, STR_SAVE_PLUGIN_DATA, STR_SAVE_PLUGIN_DATA_TIP }, { WIDGETS_END }, }; @@ -177,10 +182,12 @@ void window_options_open() (1 << WIDX_DISTANCE_DROPDOWN) | (1 << WIDX_RESOLUTION) | (1 << WIDX_RESOLUTION_DROPDOWN) | + (1 << WIDX_FULLSCREEN) | + (1 << WIDX_FULLSCREEN_DROPDOWN) | (1 << WIDX_TEMPERATURE) | (1 << WIDX_TEMPERATURE_DROPDOWN) | - (1 << WIDX_HOTKEY_DROPDOWN) | - (1 << WIDX_SCREEN_EDGE_SCROLLING) | + (1ULL << WIDX_HOTKEY_DROPDOWN) | + (1ULL << WIDX_SCREEN_EDGE_SCROLLING) | (1ULL << WIDX_REAL_NAME_CHECKBOX) | (1 << WIDX_CONSTRUCTION_MARKER) | (1 << WIDX_CONSTRUCTION_MARKER_DROPDOWN) | @@ -382,6 +389,16 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* case WIDX_RESOLUTION_DROPDOWN: // RCT2_CALLPROC_EBPSAFE(0x006BB2AF); break; + case WIDX_FULLSCREEN_DROPDOWN: + window_options_draw_dropdown_box(w, widget, 3); + gDropdownItemsFormat[0] = 1142; + gDropdownItemsFormat[1] = 1142; + gDropdownItemsFormat[2] = 1142; + gDropdownItemsArgs[0] = STR_CELSIUS; + gDropdownItemsArgs[1] = STR_FAHRENHEIT; + gDropdownItemsArgs[2] = STR_METRIC; + gDropdownItemsChecked = 1 << g_current_fullscreen_mode; + break; case WIDX_TEMPERATURE_DROPDOWN: window_options_draw_dropdown_box(w, widget, 2); @@ -498,6 +515,11 @@ static void window_options_dropdown() // the switch replaces ax value RCT2_CALLPROC_EBPSAFE(0x006BB37D); break; + case WIDX_FULLSCREEN_DROPDOWN: + if (dropdownIndex != g_current_fullscreen_mode){ + osinterface_set_fullscreen_mode(dropdownIndex); + } + break; case WIDX_TEMPERATURE_DROPDOWN: if (dropdownIndex != RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_TEMPERATURE, uint8)) { RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_TEMPERATURE, uint8) = (uint8)dropdownIndex; @@ -587,9 +609,9 @@ static void window_options_update(rct_window *w) // screen edge scrolling checkbox if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_EDGE_SCROLLING, uint8)) - w->pressed_widgets |= (1 << WIDX_SCREEN_EDGE_SCROLLING); + w->pressed_widgets |= (1ULL << WIDX_SCREEN_EDGE_SCROLLING); else - w->pressed_widgets &= ~(1 << WIDX_SCREEN_EDGE_SCROLLING); + w->pressed_widgets &= ~(1ULL << WIDX_SCREEN_EDGE_SCROLLING); // real name checkbox if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SHOW_REAL_GUEST_NAMES) @@ -663,6 +685,12 @@ static void window_options_paint() // display gfx_draw_string_left(dpi, STR_DISPLAY_RESOLUTION, w, 0, w->x + 10, w->y + window_options_widgets[WIDX_RESOLUTION].top + 1); + + char buffer[256]; + sprintf(buffer, "%c%c%s", FORMAT_MEDIUMFONT, FORMAT_WINDOW_COLOUR_2, "Fullscreen mode:"); + gfx_draw_string(dpi, buffer, 0, w->x + 10, + w->y + window_options_widgets[WIDX_FULLSCREEN].top + 1); + gfx_draw_string_left(dpi, STR_CONSTRUCTION_MARKER, w, 0, w->x + 10, w->y + window_options_widgets[WIDX_CONSTRUCTION_MARKER].top + 1); From 5df3dbe6715e5c08a28b69780fa56a7f04afebbb Mon Sep 17 00:00:00 2001 From: adrian17 Date: Wed, 30 Jul 2014 14:13:32 +0200 Subject: [PATCH 3/4] Add the fullscreen mode to .ini config --- src/config.c | 18 ++++++++++++++++++ src/config.h | 3 +++ src/osinterface.c | 18 ++++++++++-------- src/osinterface.h | 1 - src/window_options.c | 4 ++-- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/config.c b/src/config.c index 0903f071b0..78a3d9d2cc 100644 --- a/src/config.c +++ b/src/config.c @@ -89,6 +89,7 @@ general_configuration_t gGeneral_config_default = { 1, // landscape_smoothing 0, // show_height_as_units 1, // save_plugin_data + 0, // fullscreen mode (default: windowed) }; sound_configuration_t gSound_config; @@ -373,6 +374,13 @@ void config_write_ini_general(FILE *fp) else { fprintf(fp, "save_plugin_data = false\n"); } + + if (gGeneral_config.fullscreen_mode == 0) + fprintf(fp, "fullscreen_mode = window\n"); + else if (gGeneral_config.fullscreen_mode == 1) + fprintf(fp, "fullscreen_mode = fullscreen\n"); + else + fprintf(fp, "fullscreen_mode = borderless_fullscreen\n"); } /** @@ -603,6 +611,16 @@ static void config_general(char *setting, char *value){ gGeneral_config.save_plugin_data = 0; } } + else if (strcmp(setting, "fullscreen_mode") == 0){ + if (strcmp(value, "window") == 0){ + gGeneral_config.fullscreen_mode = 0; + } + else if (strcmp(value, "fullscreen") == 0){ + gGeneral_config.fullscreen_mode = 1; + } + else + gGeneral_config.fullscreen_mode = 2; + } } /** diff --git a/src/config.h b/src/config.h index 0d3ffa8ad8..1bb1ea386f 100644 --- a/src/config.h +++ b/src/config.h @@ -127,6 +127,9 @@ typedef struct general_configuration { sint8 landscape_smoothing; sint8 show_height_as_units; sint8 save_plugin_data; + + //new + uint8 fullscreen_mode; } general_configuration_t; static const struct { char *key; int value; } _currencyLookupTable[] = { diff --git a/src/osinterface.c b/src/osinterface.c index 47b10de334..5efe2a2a75 100644 --- a/src/osinterface.c +++ b/src/osinterface.c @@ -26,6 +26,7 @@ #include #include "addresses.h" +#include "config.h" #include "gfx.h" #include "osinterface.h" #include "window.h" @@ -53,6 +54,8 @@ static void *_screenBuffer; static SDL_Cursor* _cursors[NO_CURSORS]; +static const int fullscreen_modes[] = { 0, SDL_WINDOW_FULLSCREEN, SDL_WINDOW_FULLSCREEN_DESKTOP }; + void osinterface_init() { osinterface_create_window(); @@ -170,9 +173,8 @@ static void osinterface_create_window() RCT2_GLOBAL(0x009E2D8C, sint32) = 0; - g_current_fullscreen_mode = 0; - - _window = SDL_CreateWindow("OpenRCT2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_RESIZABLE); + _window = SDL_CreateWindow("OpenRCT2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, + fullscreen_modes[gGeneral_config.fullscreen_mode]); if (!_window) { RCT2_ERROR("SDL_CreateWindow failed %s", SDL_GetError()); exit(-1); @@ -384,7 +386,7 @@ void osinterface_process_messages() gLastKeyPressed = e.key.keysym.sym; gKeysPressed[e.key.keysym.scancode] = 1; if (e.key.keysym.sym == SDLK_RETURN && e.key.keysym.mod & KMOD_ALT) - osinterface_set_fullscreen_mode(!g_current_fullscreen_mode); + osinterface_set_fullscreen_mode(!gGeneral_config.fullscreen_mode); break; default: break; @@ -417,10 +419,8 @@ void osinterface_free() SDL_Quit(); } -static const int fullscreen_modes[] = { 0, SDL_WINDOW_FULLSCREEN, SDL_WINDOW_FULLSCREEN_DESKTOP }; - void osinterface_set_fullscreen_mode(int mode){ - if (mode == g_current_fullscreen_mode) + if (mode == gGeneral_config.fullscreen_mode) return; if (SDL_SetWindowFullscreen(_window, fullscreen_modes[mode])){ @@ -430,7 +430,9 @@ void osinterface_set_fullscreen_mode(int mode){ //SDL automatically resizes the fullscreen window to the nearest allowed screen resolution //No need to call osinterface_resize() here, SDL_WINDOWEVENT_SIZE_CHANGED event will be triggered anyway - g_current_fullscreen_mode = mode; + gGeneral_config.fullscreen_mode = mode; + + config_save(); } /** diff --git a/src/osinterface.h b/src/osinterface.h index a660086c50..6d2cade7aa 100644 --- a/src/osinterface.h +++ b/src/osinterface.h @@ -77,7 +77,6 @@ void osinterface_draw(); void osinterface_free(); void osinterface_update_palette(char* colours, int start_index, int num_colours); -int g_current_fullscreen_mode; void osinterface_set_fullscreen_mode(int mode); void osinterface_set_cursor(char cursor); diff --git a/src/window_options.c b/src/window_options.c index 766f75a3f6..ca760d8980 100644 --- a/src/window_options.c +++ b/src/window_options.c @@ -397,7 +397,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* gDropdownItemsArgs[0] = STR_CELSIUS; gDropdownItemsArgs[1] = STR_FAHRENHEIT; gDropdownItemsArgs[2] = STR_METRIC; - gDropdownItemsChecked = 1 << g_current_fullscreen_mode; + gDropdownItemsChecked = 1 << gGeneral_config.fullscreen_mode; break; case WIDX_TEMPERATURE_DROPDOWN: window_options_draw_dropdown_box(w, widget, 2); @@ -516,7 +516,7 @@ static void window_options_dropdown() RCT2_CALLPROC_EBPSAFE(0x006BB37D); break; case WIDX_FULLSCREEN_DROPDOWN: - if (dropdownIndex != g_current_fullscreen_mode){ + if (dropdownIndex != gGeneral_config.fullscreen_mode){ osinterface_set_fullscreen_mode(dropdownIndex); } break; From ba08e4480cc0c344830f5ebdd600703460fd730b Mon Sep 17 00:00:00 2001 From: adrian17 Date: Wed, 30 Jul 2014 14:46:47 +0200 Subject: [PATCH 4/4] Disable resolution option when in borderless fullscreen --- src/window_options.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/window_options.c b/src/window_options.c index ca760d8980..9d89125b9e 100644 --- a/src/window_options.c +++ b/src/window_options.c @@ -517,6 +517,14 @@ static void window_options_dropdown() break; case WIDX_FULLSCREEN_DROPDOWN: if (dropdownIndex != gGeneral_config.fullscreen_mode){ + if (dropdownIndex == 2){ + w->disabled_widgets |= (1 << WIDX_RESOLUTION_DROPDOWN); + w->disabled_widgets |= (1 << WIDX_RESOLUTION); + } + else { + w->disabled_widgets &= ~(1 << WIDX_RESOLUTION_DROPDOWN); + w->disabled_widgets &= ~(1 << WIDX_RESOLUTION); + } osinterface_set_fullscreen_mode(dropdownIndex); } break;