From d18b240d6d608e0285a8a57b4f389c5ba2519d6d Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Mon, 15 May 2023 19:44:02 +0300 Subject: [PATCH] Added separate borderless & exclusive fullscreen options --- Mods/vcmi/config/vcmi/english.json | 6 ++- Mods/vcmi/config/vcmi/german.json | 2 - Mods/vcmi/config/vcmi/polish.json | 3 -- Mods/vcmi/config/vcmi/russian.json | 3 -- Mods/vcmi/config/vcmi/spanish.json | 3 -- Mods/vcmi/config/vcmi/ukrainian.json | 9 ++-- client/gui/InterfaceObjectConfigurable.cpp | 3 +- client/windows/settings/GeneralOptionsTab.cpp | 46 +++++++++++-------- client/windows/settings/GeneralOptionsTab.h | 2 +- .../widgets/settings/generalOptionsTab.json | 24 ++++++++-- 10 files changed, 58 insertions(+), 43 deletions(-) diff --git a/Mods/vcmi/config/vcmi/english.json b/Mods/vcmi/config/vcmi/english.json index f604b2cc6..cb05adf4c 100644 --- a/Mods/vcmi/config/vcmi/english.json +++ b/Mods/vcmi/config/vcmi/english.json @@ -46,8 +46,10 @@ "vcmi.systemOptions.otherGroup" : "Other Settings", // unused right now "vcmi.systemOptions.townsGroup" : "Town Screen", - "vcmi.systemOptions.fullscreenButton.hover" : "Fullscreen", - "vcmi.systemOptions.fullscreenButton.help" : "{Fullscreen}\n\nIf selected, VCMI will run in fullscreen mode, otherwise it will run in windowed mode", + "vcmi.systemOptions.fullscreenBorderless.hover" : "Fullscreen (borderless)", + "vcmi.systemOptions.fullscreenBorderless.help" : "{Borderless Fullscreen}\n\nIf selected, VCMI will run in borderless fullscreen mode. In this mode, game will always use same resolution as desktop, ignoring selected resolution.", + "vcmi.systemOptions.fullscreenExclusive.hover" : "Fullscreen (exclusive)", + "vcmi.systemOptions.fullscreenExclusive.help" : "{Fullscreen}\n\nIf selected, VCMI will run in exclusive fullscreen mode. In this mode, game will change resolution of monitor to selected resolution.", "vcmi.systemOptions.resolutionButton.hover" : "Resolution: %wx%h", "vcmi.systemOptions.resolutionButton.help" : "{Select Resolution}\n\nChange in-game screen resolution.", "vcmi.systemOptions.resolutionMenu.hover" : "Select Resolution", diff --git a/Mods/vcmi/config/vcmi/german.json b/Mods/vcmi/config/vcmi/german.json index 105af9ab8..3f17d3910 100644 --- a/Mods/vcmi/config/vcmi/german.json +++ b/Mods/vcmi/config/vcmi/german.json @@ -46,8 +46,6 @@ "vcmi.systemOptions.otherGroup" : "Andere Einstellungen", // unused right now "vcmi.systemOptions.townsGroup" : "Stadt-Bildschirm", - "vcmi.systemOptions.fullscreenButton.hover" : "Vollbild", - "vcmi.systemOptions.fullscreenButton.help" : "{Vollbild}\n\n Wenn ausgewählt wird VCMI im Vollbildmodus laufen, ansonsten im Fenstermodus", "vcmi.systemOptions.resolutionButton.hover" : "Auflösung: %wx%h", "vcmi.systemOptions.resolutionButton.help" : "{Wähle Auflösung}\n\n Ändert die Spielauflösung. Spielneustart ist erforderlich um neue Auflösung zu übernehmen.", "vcmi.systemOptions.resolutionMenu.hover" : "Wähle Auflösung", diff --git a/Mods/vcmi/config/vcmi/polish.json b/Mods/vcmi/config/vcmi/polish.json index a33d2f5a2..8d07deb36 100644 --- a/Mods/vcmi/config/vcmi/polish.json +++ b/Mods/vcmi/config/vcmi/polish.json @@ -37,13 +37,10 @@ "vcmi.systemOptions.otherGroup" : "Inne ustawienia", // unused right now "vcmi.systemOptions.townsGroup" : "Ekran miasta", - "vcmi.systemOptions.fullscreenButton.hover" : "Pełny ekran", - "vcmi.systemOptions.fullscreenButton.help" : "{Pełny ekran}\n\n Po wybraniu VCMI uruchomi się w trybie pełnoekranowym, w przeciwnym wypadku uruchomi się w oknie", "vcmi.systemOptions.resolutionButton.hover" : "Rozdzielczość: %wx%h", "vcmi.systemOptions.resolutionButton.help" : "{Wybierz rozdzielczość}\n\n Zmień rozdzielczość ekranu w grze. Restart gry jest wymagany, by zmiany zostały uwzględnione.", "vcmi.systemOptions.resolutionMenu.hover" : "Wybierz rozdzielczość", "vcmi.systemOptions.resolutionMenu.help" : "Zmień rozdzielczość ekranu w grze.", - "vcmi.systemOptions.fullscreenFailed" : "{Pełny ekran}\n\n Nieudane przełączenie w tryb pełnoekranowy! Obecna rozdzielczość nie jest wspierana przez wyświetlacz!", "vcmi.systemOptions.framerateButton.hover" : "Pokaż FPS", "vcmi.systemOptions.framerateButton.help" : "{Pokaż FPS}\n\n Przełącza widoczność licznika klatek na sekundę (FPS) w rogu okna gry.", diff --git a/Mods/vcmi/config/vcmi/russian.json b/Mods/vcmi/config/vcmi/russian.json index 1996637ee..36c45cf84 100644 --- a/Mods/vcmi/config/vcmi/russian.json +++ b/Mods/vcmi/config/vcmi/russian.json @@ -37,13 +37,10 @@ "vcmi.systemOptions.otherGroup" : "Иное", // unused right now "vcmi.systemOptions.townsGroup" : "Экран города", - "vcmi.systemOptions.fullscreenButton.hover" : "Полный экран", - "vcmi.systemOptions.fullscreenButton.help" : "{Полный экран}\n\n Если выбрано, то VCMI будет работать в полноэкранном режиме, если нет - в окне", "vcmi.systemOptions.resolutionButton.hover" : "Разрешение %wx%h", "vcmi.systemOptions.resolutionButton.help" : "{Разрешение экрана}\n\n Изменение разрешения экрана. Для применения нового разрешения требуется перезапуск игры.", "vcmi.systemOptions.resolutionMenu.hover" : "Выбрать разрешения экрана", "vcmi.systemOptions.resolutionMenu.help" : "Изменение разрешения экрана в игре.", - "vcmi.systemOptions.fullscreenFailed" : "{Полный экран}\n\n Невозможно переключиться в полноэкранный режим - выбранное разрешение не поддерживается дисплеем!", "vcmi.systemOptions.framerateButton.hover" : "Показывать частоту кадров", "vcmi.systemOptions.framerateButton.help" : "{Показывать частоту кадров}\n\n Включить счетчик частоты кадров в углу игрового клиента", diff --git a/Mods/vcmi/config/vcmi/spanish.json b/Mods/vcmi/config/vcmi/spanish.json index 2d6e5e32c..2e98760a1 100644 --- a/Mods/vcmi/config/vcmi/spanish.json +++ b/Mods/vcmi/config/vcmi/spanish.json @@ -46,13 +46,10 @@ "vcmi.systemOptions.otherGroup" : "Otras configuraciones", // actualmente no utilizada "vcmi.systemOptions.townsGroup" : "Pantalla de la ciudad", - "vcmi.systemOptions.fullscreenButton.hover" : "Pantalla completa", - "vcmi.systemOptions.fullscreenButton.help" : "{Pantalla completa}\n\n Si se selecciona, VCMI se ejecutará en modo de pantalla completa, de lo contrario se ejecutará en ventana", "vcmi.systemOptions.resolutionButton.hover" : "Resolución: %wx%h", "vcmi.systemOptions.resolutionButton.help" : "{Seleccionar resolución}\n\n Cambia la resolución de la pantalla del juego. Se requiere reiniciar el juego para aplicar la nueva resolución.", "vcmi.systemOptions.resolutionMenu.hover" : "Seleccionar resolución", "vcmi.systemOptions.resolutionMenu.help" : "Cambia la resolución de la pantalla del juego.", - "vcmi.systemOptions.fullscreenFailed" : "{Pantalla completa}\n\n ¡Fallo al cambiar a modo de pantalla completa! ¡La resolución actual no es compatible con la pantalla!", "vcmi.systemOptions.framerateButton.hover" : "Mostrar FPS", "vcmi.systemOptions.framerateButton.help" : "{Mostrar FPS}\n\n Muestra el contador de Frames Por Segundo en la esquina de la ventana del juego.", diff --git a/Mods/vcmi/config/vcmi/ukrainian.json b/Mods/vcmi/config/vcmi/ukrainian.json index 9723d9fca..bc33ddb0b 100644 --- a/Mods/vcmi/config/vcmi/ukrainian.json +++ b/Mods/vcmi/config/vcmi/ukrainian.json @@ -38,15 +38,18 @@ "vcmi.systemOptions.otherGroup" : "Інші налаштування", "vcmi.systemOptions.townsGroup" : "Екран міста", - "vcmi.adventureOptions.infoBarPick.help" : "{Повідомлення у панелі статусу}\n\nЗа можливості, повідомлення про відвідування об'єктів карти пригод будуть відображені у панелі статусу замість окремого вікна", - "vcmi.adventureOptions.infoBarPick.hover" : "Повідомлення у панелі статусу", + "vcmi.systemOptions.fullscreenBorderless.hover" : "На весь екран (безрамкове вікно)", + "vcmi.systemOptions.fullscreenBorderless.help" : "{На весь екран (безрамкове вікно)}\n\nЯкщо обрано, VCMI працюватиме у режимі безрамкового вікна на весь екран. У цьому режимі гра завжди використовує ту саму роздільну здатність, що й робочий стіл, ігноруючи вибрану роздільну здатність", + "vcmi.systemOptions.fullscreenExclusive.hover" : "На весь екран (ексклюзивний режим)", + "vcmi.systemOptions.fullscreenExclusive.help" : "{На весь екран (ексклюзивний режим)}\n\nnЯкщо вибрано, VCMI працюватиме у ексклюзивному повноекранному режимі. У цьому режимі гра змінюватиме роздільну здатність монітора на вибрану роздільну здатність", + "vcmi.adventureOptions.infoBarPick.help" : "{Повідомлення у панелі статусу}\n\nЗа можливості, повідомлення про відвідування об'єктів карти пригод будуть відображені у панелі статусу замість окремого вікна", + "vcmi.adventureOptions.infoBarPick.hover" : "Повідомлення у панелі статусу", "vcmi.systemOptions.fullscreenButton.hover" : "Повноекранний режим", "vcmi.systemOptions.fullscreenButton.help" : "{Повноекранний режим}\n\n Якщо обрано, VCMI буде запускатися в режимі на весь екран, інакше — віконний режим", "vcmi.systemOptions.resolutionButton.hover" : "Роздільна здатність: %wx%h", "vcmi.systemOptions.resolutionButton.help" : "{Роздільна здатність}\n\n Зміна розширення екрану в грі. Аби зміни набули чинності необхідно перезавантажити гру.", "vcmi.systemOptions.resolutionMenu.hover" : "Обрати роздільну здатність", "vcmi.systemOptions.resolutionMenu.help" : "Змінити роздільну здатність екрану в грі.", - "vcmi.systemOptions.fullscreenFailed" : "{Повноекранний режим}\n\n Не вдалося перейти в повноекранний режим! Поточна роздільна здатність не підтримується дисплеєм!", "vcmi.systemOptions.framerateButton.hover" : "Лічильник кадрів", "vcmi.systemOptions.framerateButton.help" : "{Лічильник кадрів}\n\n Перемикає видимість лічильника кадрів на секунду у кутку ігрового вікна", diff --git a/client/gui/InterfaceObjectConfigurable.cpp b/client/gui/InterfaceObjectConfigurable.cpp index a107222d5..273f5fd3d 100644 --- a/client/gui/InterfaceObjectConfigurable.cpp +++ b/client/gui/InterfaceObjectConfigurable.cpp @@ -297,7 +297,8 @@ std::shared_ptr InterfaceObjectConfigurable::buildToggleGroup(cons for(const auto & item : config["items"].Vector()) { itemIdx = item["index"].isNull() ? itemIdx + 1 : item["index"].Integer(); - group->addToggle(itemIdx, std::dynamic_pointer_cast(buildWidget(item))); + auto newToggle = std::dynamic_pointer_cast(buildWidget(item)); + group->addToggle(itemIdx, newToggle); } } if(!config["selected"].isNull()) diff --git a/client/windows/settings/GeneralOptionsTab.cpp b/client/windows/settings/GeneralOptionsTab.cpp index ff80b29a9..d34c152a3 100644 --- a/client/windows/settings/GeneralOptionsTab.cpp +++ b/client/windows/settings/GeneralOptionsTab.cpp @@ -102,9 +102,13 @@ GeneralOptionsTab::GeneralOptionsTab() targetLabel->setText(std::to_string(value) + "%"); }); //settings that do not belong to base game: - addCallback("fullscreenChanged", [this](bool value) + addCallback("fullscreenBorderlessChanged", [this](bool value) { - setFullscreenMode(value); + setFullscreenMode(value, false); + }); + addCallback("fullscreenExclusiveChanged", [this](bool value) + { + setFullscreenMode(value, true); }); addCallback("setGameResolution", [this](int dummyValue) { @@ -135,7 +139,8 @@ GeneralOptionsTab::GeneralOptionsTab() const auto & currentResolution = settings["video"]["resolution"]; std::shared_ptr resolutionLabel = widget("resolutionLabel"); - resolutionLabel->setText(resolutionToLabelString(currentResolution["width"].Integer(), currentResolution["height"].Integer())); + if (resolutionLabel) + resolutionLabel->setText(resolutionToLabelString(currentResolution["width"].Integer(), currentResolution["height"].Integer())); std::shared_ptr scalingLabel = widget("scalingLabel"); scalingLabel->setText(scalingToLabelString(currentResolution["scaling"].Integer())); @@ -143,12 +148,13 @@ GeneralOptionsTab::GeneralOptionsTab() std::shared_ptr spellbookAnimationCheckbox = widget("spellbookAnimationCheckbox"); spellbookAnimationCheckbox->setSelected(settings["video"]["spellbookAnimation"].Bool()); - std::shared_ptr fullscreenCheckbox = widget("fullscreenCheckbox"); - fullscreenCheckbox->setSelected(settings["video"]["fullscreen"].Bool()); - onFullscreenChanged([&](const JsonNode &newState) //used when pressing F4 etc. to change fullscreen checkbox state - { - widget("fullscreenCheckbox")->setSelected(newState.Bool()); - }); + std::shared_ptr fullscreenBorderlessCheckbox = widget("fullscreenBorderlessCheckbox"); + if (fullscreenBorderlessCheckbox) + fullscreenBorderlessCheckbox->setSelected(settings["video"]["fullscreen"].Bool() && !settings["video"]["realFullscreen"].Bool()); + + std::shared_ptr fullscreenExclusiveCheckbox = widget("fullscreenExclusiveCheckbox"); + if (fullscreenExclusiveCheckbox) + fullscreenExclusiveCheckbox->setSelected(settings["video"]["fullscreen"].Bool() && settings["video"]["realFullscreen"].Bool()); std::shared_ptr framerateCheckbox = widget("framerateCheckbox"); framerateCheckbox->setSelected(settings["video"]["showfps"].Bool()); @@ -170,16 +176,6 @@ GeneralOptionsTab::GeneralOptionsTab() std::shared_ptr soundVolumeLabel = widget("soundValueLabel"); soundVolumeLabel->setText(std::to_string(CCS->soundh->getVolume()) + "%"); - -#ifdef VCMI_MOBILE - // On mobile platforms, VCMI always uses OS screen resolutions - // Players can control UI size via "Interface Scaling" option instead - std::shared_ptr resolutionButton = widget("resolutionButton"); - - resolutionButton->disable(); - resolutionLabel->disable(); - fullscreenCheckbox->block(true); -#endif } void GeneralOptionsTab::selectGameResolution() @@ -224,9 +220,19 @@ void GeneralOptionsTab::setGameResolution(int index) widget("resolutionLabel")->setText(resolutionToLabelString(resolution.x, resolution.y)); } -void GeneralOptionsTab::setFullscreenMode(bool on) +void GeneralOptionsTab::setFullscreenMode(bool on, bool exclusive) { + setBoolSetting("video", "realFullscreen", exclusive); setBoolSetting("video", "fullscreen", on); + + std::shared_ptr fullscreenExclusiveCheckbox = widget("fullscreenExclusiveCheckbox"); + std::shared_ptr fullscreenBorderlessCheckbox = widget("fullscreenBorderlessCheckbox"); + + if (fullscreenBorderlessCheckbox) + fullscreenBorderlessCheckbox->setSelected(on && !exclusive); + + if (fullscreenExclusiveCheckbox) + fullscreenExclusiveCheckbox->setSelected(on && exclusive); } void GeneralOptionsTab::selectGameScaling() diff --git a/client/windows/settings/GeneralOptionsTab.h b/client/windows/settings/GeneralOptionsTab.h index 907957753..b7cb75b42 100644 --- a/client/windows/settings/GeneralOptionsTab.h +++ b/client/windows/settings/GeneralOptionsTab.h @@ -21,7 +21,7 @@ private: std::vector supportedResolutions; std::vector supportedScaling; - void setFullscreenMode( bool on); + void setFullscreenMode( bool on, bool exclusive); void selectGameResolution(); void setGameResolution(int index); diff --git a/config/widgets/settings/generalOptionsTab.json b/config/widgets/settings/generalOptionsTab.json index 5a87015d8..30612b188 100644 --- a/config/widgets/settings/generalOptionsTab.json +++ b/config/widgets/settings/generalOptionsTab.json @@ -32,14 +32,20 @@ "items" : [ { "name": "resolutionLabel", - "text": "vcmi.systemOptions.resolutionButton.hover" + "text": "vcmi.systemOptions.resolutionButton.hover", + "created" : "desktop" }, { "name": "scalingLabel", "text": "vcmi.systemOptions.scalingButton.hover" }, { - "text": "vcmi.systemOptions.fullscreenButton.hover" + "text": "vcmi.systemOptions.fullscreenBorderless.hover", + "created" : "desktop" + }, + { + "text": "vcmi.systemOptions.fullscreenExclusive.hover", + "created" : "desktop" }, { "text": "vcmi.systemOptions.framerateButton.hover" @@ -59,6 +65,7 @@ "type": "buttonGear", "help": "vcmi.systemOptions.resolutionButton", "callback": "setGameResolution", + "created" : "desktop" }, { "name": "scalingButton", @@ -67,9 +74,16 @@ "callback": "setGameScaling", }, { - "name": "fullscreenCheckbox", - "help": "vcmi.systemOptions.fullscreenButton", - "callback": "fullscreenChanged" + "name": "fullscreenBorderlessCheckbox", + "help": "vcmi.systemOptions.fullscreenBorderless", + "callback": "fullscreenBorderlessChanged" + "created" : "desktop" + }, + { + "name": "fullscreenExclusiveCheckbox", + "help": "vcmi.systemOptions.fullscreenExclusive", + "callback": "fullscreenExclusiveChanged" + "created" : "desktop" }, { "name": "framerateCheckbox",