diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index 16bc26e532..24e4ae5305 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -1,6 +1,7 @@ #include "dusk/settings.h" #include #include "dusk/config.hpp" +#include "dusk/ui/ui.hpp" #include "dusk/game_mode.hpp" namespace dusk { @@ -16,6 +17,7 @@ UserSettings g_userSettings = { .rememberWindowSize {"video.rememberWindowSize", false}, .lastWindowWidth {"video.lastWindowWidth", 0}, .lastWindowHeight {"video.lastWindowHeight", 0}, + .uiScale {"video.uiScale", 100}, }, .audio = { @@ -228,6 +230,8 @@ void registerSettings() { Register(g_userSettings.video.rememberWindowSize); Register(g_userSettings.video.lastWindowWidth); Register(g_userSettings.video.lastWindowHeight); + Register(g_userSettings.video.uiScale, + [](const int&, const int&) { dusk::ui::apply_scale(); }); // Audio Register(g_userSettings.audio.masterVolume); diff --git a/src/dusk/settings.h b/src/dusk/settings.h index 2713812ac3..8e9a31a075 100644 --- a/src/dusk/settings.h +++ b/src/dusk/settings.h @@ -145,6 +145,7 @@ struct UserSettings { ConfigVar rememberWindowSize; ConfigVar lastWindowWidth; ConfigVar lastWindowHeight; + ConfigVar uiScale; } video; struct { diff --git a/src/dusk/ui/settings.cpp b/src/dusk/ui/settings.cpp index 80bcf908e7..05173f79f4 100644 --- a/src/dusk/ui/settings.cpp +++ b/src/dusk/ui/settings.cpp @@ -770,6 +770,12 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) { }, .isDisabled = [] { return IsMobile; }, }); + + config_int_select(leftPane, rightPane, getSettings().video.uiScale, + "UI Scale", + "Scales the Dusklight interface relative to the display's DPI scale. Has no effect on the game's UI and HUD.", + 50, 200, 25, {}, {}, "%"); + leftPane.add_section("Resolution"); graphics_tuner_control(*this, leftPane, rightPane, getSettings().game.internalResolutionScale, diff --git a/src/dusk/ui/ui.cpp b/src/dusk/ui/ui.cpp index 079f3186ba..34a13b3180 100644 --- a/src/dusk/ui/ui.cpp +++ b/src/dusk/ui/ui.cpp @@ -214,6 +214,8 @@ void handle_event(const SDL_Event& event) noexcept { }); } sConnectedGamepads.erase(event.gdevice.which); + } else if (event.type == SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED) { + apply_scale(); } input::handle_event(event); } @@ -491,4 +493,14 @@ bool consume_menu_notification_request() noexcept { return requested; } +void apply_scale() noexcept { + const auto userScale = getSettings().video.uiScale.getValue(); + auto scale = 0.0f; + if (userScale != 0) { + const auto displayScale = aurora::window::get_window_size().scale; + scale = static_cast(userScale) / 100.0f * (displayScale > 0.0f ? displayScale : 1.0f); + } + aurora::rmlui::set_ui_scale(scale); +} + } // namespace dusk::ui diff --git a/src/dusk/ui/ui.hpp b/src/dusk/ui/ui.hpp index b0af9ca5a3..27ee39f35a 100644 --- a/src/dusk/ui/ui.hpp +++ b/src/dusk/ui/ui.hpp @@ -114,4 +114,6 @@ bool consume_menu_notification_request() noexcept; const char* battery_icon(SDL_PowerState state, int level) noexcept; const char* connection_state_icon(SDL_JoystickConnectionState state) noexcept; +void apply_scale() noexcept; + } // namespace dusk::ui diff --git a/src/m_Do/m_Do_main.cpp b/src/m_Do/m_Do_main.cpp index 2312deed48..3ae4af3349 100644 --- a/src/m_Do/m_Do_main.cpp +++ b/src/m_Do/m_Do_main.cpp @@ -776,6 +776,7 @@ int game_main(int argc, char* argv[]) { dusk::texture_replacements::reload(); dusk::ui::initialize(); + dusk::ui::apply_scale(); dusk::ui::push_document(std::make_unique(), true, true); dusk::ui::push_document(std::make_unique(), false, true); dusk::ui::push_document(std::make_unique(), false);