diff --git a/src/gui/gsc_executor_log_window.cpp b/src/gui/gsc_executor_log_window.cpp index 55f04d1..fb74830 100644 --- a/src/gui/gsc_executor_log_window.cpp +++ b/src/gui/gsc_executor_log_window.cpp @@ -31,6 +31,19 @@ Copyright: GscExecutorLogWindow::GscExecutorLogWindow(BaseObjectType* gtkcobj, Glib::RefPtr ui) : AppBuilderWidget(gtkcobj, std::move(ui)) { + // Apply fractional scaling adjustment on Windows to default window size + // This compensates for GTK3's lack of fractional scaling support + const int fraction_percent = app_get_windows_fractional_scaling_percent(); + if (fraction_percent > 0) { + int glade_w = 0, glade_h = 0; + get_default_size(glade_w, glade_h); + if (glade_w > 0 && glade_h > 0) { + const int scaled_w = static_cast(glade_w * (1.0 + fraction_percent / 100.0)); + const int scaled_h = static_cast(glade_h * (1.0 + fraction_percent / 100.0)); + set_default_size(scaled_w, scaled_h); + } + } + // Connect callbacks Gtk::Button* window_close_button = nullptr; diff --git a/src/gui/gsc_info_window.cpp b/src/gui/gsc_info_window.cpp index ae32000..b6ec702 100644 --- a/src/gui/gsc_info_window.cpp +++ b/src/gui/gsc_info_window.cpp @@ -35,6 +35,7 @@ Copyright: #include "gsc_info_window.h" #include "gsc_executor_error_dialog.h" #include "gsc_startup_settings.h" +#include "gsc_init.h" // app_get_windows_fractional_scaling_percent() @@ -164,8 +165,22 @@ GscInfoWindow::GscInfoWindow(BaseObjectType* gtkcobj, Glib::RefPtr { // Size { - const int def_size_w = rconfig::get_data("gui/info_window/default_size_w"); - const int def_size_h = rconfig::get_data("gui/info_window/default_size_h"); + int def_size_w = rconfig::get_data("gui/info_window/default_size_w"); + int def_size_h = rconfig::get_data("gui/info_window/default_size_h"); + + // Apply fractional scaling adjustment on Windows if no custom size is configured + // This compensates for GTK3's lack of fractional scaling support + const int fraction_percent = app_get_windows_fractional_scaling_percent(); + if (fraction_percent > 0 && def_size_w == 0 && def_size_h == 0) { + // Get the default size from glade and scale it + int glade_w = 0, glade_h = 0; + get_default_size(glade_w, glade_h); + if (glade_w > 0 && glade_h > 0) { + def_size_w = static_cast(glade_w * (1.0 + fraction_percent / 100.0)); + def_size_h = static_cast(glade_h * (1.0 + fraction_percent / 100.0)); + } + } + if (def_size_w > 0 && def_size_h > 0) { set_default_size(def_size_w, def_size_h); } diff --git a/src/gui/gsc_init.cpp b/src/gui/gsc_init.cpp index 0dff60c..d333e60 100644 --- a/src/gui/gsc_init.cpp +++ b/src/gui/gsc_init.cpp @@ -80,6 +80,10 @@ namespace { return channel; } + + /// Storage for Windows fractional scaling percentage (0 if no fractional scaling) + inline int g_windows_fractional_scaling_percent = 0; + } @@ -91,6 +95,13 @@ std::string app_get_debug_buffer_str() +int app_get_windows_fractional_scaling_percent() +{ + return g_windows_fractional_scaling_percent; +} + + + namespace { @@ -521,6 +532,8 @@ bool app_init_and_loop(int& argc, char**& argv) debug_out_info("app", "Windows system DPI: " << h_ppi << ", scale: " << scale << "\n"); const int fraction_percent = static_cast(std::round(scale * 100)) % 100; if (fraction_percent != 0) { // fractional scaling + // Store for use in window sizing + g_windows_fractional_scaling_percent = fraction_percent; // Increase the font size by fraction, but round down the size to match the Windows behavior (?) debug_out_dump("app", "Fractional scaling detected, increasing font size by " << fraction_percent << "%.\n"); Gtk::Settings::get_default()->property_gtk_font_name() diff --git a/src/gui/gsc_init.h b/src/gui/gsc_init.h index b0ae517..f2f6b49 100644 --- a/src/gui/gsc_init.h +++ b/src/gui/gsc_init.h @@ -28,6 +28,11 @@ void app_quit(); std::string app_get_debug_buffer_str(); +/// Get the fractional scaling percentage detected on Windows (0 if not detected). +/// For example, at 150% scaling, this returns 50; at 125% scaling, this returns 25. +int app_get_windows_fractional_scaling_percent(); + + #endif diff --git a/src/gui/gsc_main_window.cpp b/src/gui/gsc_main_window.cpp index f784f39..cfe640e 100644 --- a/src/gui/gsc_main_window.cpp +++ b/src/gui/gsc_main_window.cpp @@ -58,8 +58,22 @@ GscMainWindow::GscMainWindow(BaseObjectType* gtkcobj, Glib::RefPtr // Size { - const int def_size_w = rconfig::get_data("gui/main_window/default_size_w"); - const int def_size_h = rconfig::get_data("gui/main_window/default_size_h"); + int def_size_w = rconfig::get_data("gui/main_window/default_size_w"); + int def_size_h = rconfig::get_data("gui/main_window/default_size_h"); + + // Apply fractional scaling adjustment on Windows if no custom size is configured + // This compensates for GTK3's lack of fractional scaling support + const int fraction_percent = app_get_windows_fractional_scaling_percent(); + if (fraction_percent > 0 && def_size_w == 0 && def_size_h == 0) { + // Get the default size from glade and scale it + int glade_w = 0, glade_h = 0; + get_default_size(glade_w, glade_h); + if (glade_w > 0 && glade_h > 0) { + def_size_w = static_cast(glade_w * (1.0 + fraction_percent / 100.0)); + def_size_h = static_cast(glade_h * (1.0 + fraction_percent / 100.0)); + } + } + if (def_size_w > 0 && def_size_h > 0) { set_default_size(def_size_w, def_size_h); } diff --git a/src/gui/gsc_text_window.h b/src/gui/gsc_text_window.h index 3b1cf0e..5d3b0c5 100644 --- a/src/gui/gsc_text_window.h +++ b/src/gui/gsc_text_window.h @@ -24,6 +24,7 @@ Copyright: #include "applib/app_builder_widget.h" #include "applib/app_gtkmm_tools.h" +#include "gsc_init.h" // app_get_windows_fractional_scaling_percent() @@ -49,6 +50,19 @@ class GscTextWindow : public AppBuilderWidget, Ins GscTextWindow(typename Gtk::Window::BaseObjectType* gtkcobj, Glib::RefPtr ui) : AppBuilderWidget, InstanceSwitch::multi_instance>(gtkcobj, std::move(ui)) { + // Apply fractional scaling adjustment on Windows to default window size + // This compensates for GTK3's lack of fractional scaling support + const int fraction_percent = app_get_windows_fractional_scaling_percent(); + if (fraction_percent > 0) { + int glade_w = 0, glade_h = 0; + this->get_default_size(glade_w, glade_h); + if (glade_w > 0 && glade_h > 0) { + const int scaled_w = static_cast(glade_w * (1.0 + fraction_percent / 100.0)); + const int scaled_h = static_cast(glade_h * (1.0 + fraction_percent / 100.0)); + this->set_default_size(scaled_w, scaled_h); + } + } + // Connect callbacks Gtk::Button* save_as_button = nullptr;