From f1fd685441cd429fc7851c5647acd14a6dd68f28 Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Wed, 4 Mar 2026 21:58:06 +0000 Subject: [PATCH] Adjust default window sizes for fractional HiDPI scaling on Windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When fractional HiDPI scaling is used on Windows (e.g., 125%, 150%, 250%), GTK3 only applies integer scaling to the UI, but fonts are scaled to match the actual DPI. This causes windows to appear smaller than they should be. This fix detects the fractional scaling percentage during app initialization and applies it to the default window sizes for all major windows: - Main window (560x450 → scaled by fraction) - Info window (850x600 → scaled by fraction) - Executor log window (900x650 → scaled by fraction) - Text window (800x600 → scaled by fraction) The scaling is only applied when: 1. Fractional scaling is detected on Windows 2. No custom window size has been configured by the user This ensures windows scale proportionally with fonts, providing a consistent user experience on Windows with fractional HiDPI scaling. Co-authored-by: ashaduri <2302268+ashaduri@users.noreply.github.com> --- src/gui/gsc_executor_log_window.cpp | 13 +++++++++++++ src/gui/gsc_info_window.cpp | 19 +++++++++++++++++-- src/gui/gsc_init.cpp | 13 +++++++++++++ src/gui/gsc_init.h | 5 +++++ src/gui/gsc_main_window.cpp | 18 ++++++++++++++++-- src/gui/gsc_text_window.h | 14 ++++++++++++++ 6 files changed, 78 insertions(+), 4 deletions(-) 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;