diff --git a/gfx.c b/gfx.c index 2d0616fb88..bbd760f51c 100644 --- a/gfx.c +++ b/gfx.c @@ -1928,3 +1928,14 @@ bool ChangeResInGame(int w, int h) _cur_resolution[1] = h; return true; } + +void ToggleFullScreen(const bool full_screen) +{ + _fullscreen = full_screen; + /* use preset resolutions, not _screen.height and _screen.width. On windows for example + if Desktop-size is 1280x1024, and gamesize is also 1280x1024, _screen.height will be + only 1000 because of possible start-bar. For this reason you cannot switch to + fullscreen mode from this resolution. Use of preset resolution will fix this */ + if (!_video_driver->change_resolution(_cur_resolution[0], _cur_resolution[1])) + _fullscreen ^= true; // switching resolution failed, put back full_screen to original status +} diff --git a/gfx.h b/gfx.h index 747fdccd2d..bab426944e 100644 --- a/gfx.h +++ b/gfx.h @@ -78,6 +78,7 @@ void DrawMouseCursor(); void ScreenSizeChanged(); void UndrawMouseCursor(); bool ChangeResInGame(int w, int h); +void ToggleFullScreen(const bool full_screen); typedef struct { int xoffs, yoffs; diff --git a/lang/english.txt b/lang/english.txt index 569bb6650f..1c5eb14414 100644 --- a/lang/english.txt +++ b/lang/english.txt @@ -887,6 +887,9 @@ STR_OPTIONS_LANG :{BLACK}Language STR_OPTIONS_LANG_CBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING} STR_OPTIONS_LANG_TIP :{BLACK}Select the interface language to use +STR_OPTIONS_FULLSCREEN :{BLACK}Fullscreen +STR_OPTIONS_FULLSCREEN_TIP :{BLACK}Check this box to play OpenTTD fullscreen mode + STR_OPTIONS_RES :{BLACK}Screen resolution STR_OPTIONS_RES_CBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING} STR_OPTIONS_RES_TIP :{BLACK}Select the screen resolution to use diff --git a/settings_gui.c b/settings_gui.c index 75e141319e..ab413a8580 100644 --- a/settings_gui.c +++ b/settings_gui.c @@ -77,7 +77,10 @@ static void GameOptionsWndProc(Window *w, WindowEvent *e) i = GetCurRes(); SET_DPARAM16(7, i == _num_resolutions ? STR_RES_OTHER : SPECSTR_RESOLUTION_START + i); SET_DPARAM16(8, SPECSTR_SCREENSHOT_START + _cur_screenshot_format); + (_fullscreen) ? SETBIT(w->click_state, 28) : CLRBIT(w->click_state, 28); // fullscreen button + DrawWindowWidgets(w); + DrawString(20, 175, STR_OPTIONS_FULLSCREEN, 0); // fullscreen } break; case WE_CLICK: @@ -113,8 +116,12 @@ static void GameOptionsWndProc(Window *w, WindowEvent *e) // setup resolution dropdown ShowDropDownMenu(w, BuildDynamicDropdown(SPECSTR_RESOLUTION_START, _num_resolutions), GetCurRes(), e->click.widget, 0); return; - case 30: - // setup screenshot format dropdown + case 28: /* Click fullscreen on/off */ + (_fullscreen) ? CLRBIT(w->click_state, 28) : SETBIT(w->click_state, 28); + ToggleFullScreen(!_fullscreen); // toggle full-screen on/off + SetWindowDirty(w); + return; + case 31: /* Setup screenshot format dropdown */ ShowDropDownMenu(w, BuildDynamicDropdown(SPECSTR_SCREENSHOT_START, _num_screenshot_formats), _cur_screenshot_format, e->click.widget, 0); return; @@ -197,7 +204,7 @@ int32 CmdSetTownNameType(int x, int y, uint32 flags, uint32 p1, uint32 p2) static const Widget _game_options_widgets[] = { { WWT_CLOSEBOX, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, { WWT_CAPTION, 14, 11, 369, 0, 13, STR_00B1_GAME_OPTIONS, STR_018C_WINDOW_TITLE_DRAG_THIS}, -{ WWT_PANEL, 14, 0, 369, 14, 233, 0x0, STR_NULL}, +{ WWT_PANEL, 14, 0, 369, 14, 238, 0x0, STR_NULL}, { WWT_FRAME, 14, 10, 179, 20, 55, STR_02E0_CURRENCY_UNITS, STR_NULL}, { WWT_6, 14, 20, 169, 34, 45, STR_02E1, STR_02E2_CURRENCY_UNITS_SELECTION}, { WWT_CLOSEBOX, 14, 158, 168, 35, 44, STR_0225, STR_02E2_CURRENCY_UNITS_SELECTION}, @@ -214,27 +221,29 @@ static const Widget _game_options_widgets[] = { { WWT_6, 14, 20, 169, 118, 129, STR_02F5, STR_02F6_SELECT_INTERVAL_BETWEEN}, { WWT_CLOSEBOX, 14, 158, 168, 119, 128, STR_0225, STR_02F6_SELECT_INTERVAL_BETWEEN}, -{ WWT_FRAME, 14, 10, 359, 188, 223, STR_02BC_VEHICLE_DESIGN_NAMES, STR_NULL}, -{ WWT_6, 14, 20, 119, 202, 213, STR_02BD, STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION}, -{ WWT_CLOSEBOX, 14, 108, 118, 203, 212, STR_0225, STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION}, -{ WWT_CLOSEBOX, 14, 130, 349, 202, 213, STR_02C0_SAVE_CUSTOM_NAMES_TO_DISK, STR_02C2_SAVE_CUSTOMIZED_VEHICLE}, +{ WWT_FRAME, 14, 10, 359, 194, 228, STR_02BC_VEHICLE_DESIGN_NAMES, STR_NULL}, +{ WWT_6, 14, 20, 119, 207, 218, STR_02BD, STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION}, +{ WWT_CLOSEBOX, 14, 108, 118, 208, 217, STR_0225, STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION}, +{ WWT_CLOSEBOX, 14, 130, 349, 207, 218, STR_02C0_SAVE_CUSTOM_NAMES_TO_DISK, STR_02C2_SAVE_CUSTOMIZED_VEHICLE}, { WWT_FRAME, 14, 190, 359, 104, 139, STR_OPTIONS_LANG, STR_NULL}, { WWT_6, 14, 200, 349, 118, 129, STR_OPTIONS_LANG_CBO, STR_OPTIONS_LANG_TIP}, { WWT_CLOSEBOX, 14, 338, 348, 119, 128, STR_0225, STR_OPTIONS_LANG_TIP}, -{ WWT_FRAME, 14, 10, 179, 146, 181, STR_OPTIONS_RES, STR_NULL}, + +{ WWT_FRAME, 14, 10, 179, 146, 190, STR_OPTIONS_RES, STR_NULL}, { WWT_6, 14, 20, 169, 160, 171, STR_OPTIONS_RES_CBO, STR_OPTIONS_RES_TIP}, { WWT_CLOSEBOX, 14, 158, 168, 161, 170, STR_0225, STR_OPTIONS_RES_TIP}, +{ WWT_TEXTBTN, 14, 149, 169, 176, 184, STR_EMPTY, STR_OPTIONS_FULLSCREEN_TIP}, -{ WWT_FRAME, 14, 190, 359, 146, 181, STR_OPTIONS_SCREENSHOT_FORMAT, STR_NULL}, -{ WWT_6, 14, 200, 349, 160, 171, STR_OPTIONS_SCREENSHOT_FORMAT_CBO, STR_OPTIONS_SCREENSHOT_FORMAT_TIP}, +{ WWT_FRAME, 14, 190, 359, 146, 190, STR_OPTIONS_SCREENSHOT_FORMAT, STR_NULL}, +{ WWT_6, 14, 200, 349, 160, 171, STR_OPTIONS_SCREENSHOT_FORMAT_CBO, STR_OPTIONS_SCREENSHOT_FORMAT_TIP}, { WWT_CLOSEBOX, 14, 338, 348, 161, 170, STR_0225, STR_OPTIONS_SCREENSHOT_FORMAT_TIP}, { WIDGETS_END}, }; static const WindowDesc _game_options_desc = { - WDP_CENTER, WDP_CENTER, 370, 234, + WDP_CENTER, WDP_CENTER, 370, 239, WC_GAME_OPTIONS,0, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESTORE_DPARAM | WDF_UNCLICK_BUTTONS, _game_options_widgets, diff --git a/win32.c b/win32.c index 52235c94b4..91c523cd10 100644 --- a/win32.c +++ b/win32.c @@ -498,6 +498,7 @@ static void MakeWindow(bool full_screen) error("CreateWindow failed"); } } + GameSizeChanged(); // invalidate all windows, force redraw } static bool AllocateDibSection(int w, int h) @@ -727,7 +728,7 @@ static bool Win32GdiChangeRes(int w, int h) _wnd.width = _wnd.width_org = w; _wnd.height = _wnd.height_org = h; - MakeWindow(_wnd.fullscreen); + MakeWindow(_fullscreen); // _wnd.fullscreen screws up ingame resolution switching return true; }