Adjust default window sizes for fractional HiDPI scaling on Windows

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>
This commit is contained in:
anthropic-code-agent[bot]
2026-03-04 21:58:06 +00:00
co-authored by ashaduri
parent bd30bbe3e5
commit f1fd685441
6 changed files with 78 additions and 4 deletions
+13
View File
@@ -31,6 +31,19 @@ Copyright:
GscExecutorLogWindow::GscExecutorLogWindow(BaseObjectType* gtkcobj, Glib::RefPtr<Gtk::Builder> ui)
: AppBuilderWidget<GscExecutorLogWindow, false>(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<int>(glade_w * (1.0 + fraction_percent / 100.0));
const int scaled_h = static_cast<int>(glade_h * (1.0 + fraction_percent / 100.0));
set_default_size(scaled_w, scaled_h);
}
}
// Connect callbacks
Gtk::Button* window_close_button = nullptr;
+17 -2
View File
@@ -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<Gtk::Builder>
{
// Size
{
const int def_size_w = rconfig::get_data<int>("gui/info_window/default_size_w");
const int def_size_h = rconfig::get_data<int>("gui/info_window/default_size_h");
int def_size_w = rconfig::get_data<int>("gui/info_window/default_size_w");
int def_size_h = rconfig::get_data<int>("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<int>(glade_w * (1.0 + fraction_percent / 100.0));
def_size_h = static_cast<int>(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);
}
+13
View File
@@ -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<int>(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()
+5
View File
@@ -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
+16 -2
View File
@@ -58,8 +58,22 @@ GscMainWindow::GscMainWindow(BaseObjectType* gtkcobj, Glib::RefPtr<Gtk::Builder>
// Size
{
const int def_size_w = rconfig::get_data<int>("gui/main_window/default_size_w");
const int def_size_h = rconfig::get_data<int>("gui/main_window/default_size_h");
int def_size_w = rconfig::get_data<int>("gui/main_window/default_size_w");
int def_size_h = rconfig::get_data<int>("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<int>(glade_w * (1.0 + fraction_percent / 100.0));
def_size_h = static_cast<int>(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);
}
+14
View File
@@ -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<GscTextWindow<InstanceSwitch>, Ins
GscTextWindow(typename Gtk::Window::BaseObjectType* gtkcobj, Glib::RefPtr<Gtk::Builder> ui)
: AppBuilderWidget<GscTextWindow<InstanceSwitch>, 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<int>(glade_w * (1.0 + fraction_percent / 100.0));
const int scaled_h = static_cast<int>(glade_h * (1.0 + fraction_percent / 100.0));
this->set_default_size(scaled_w, scaled_h);
}
}
// Connect callbacks
Gtk::Button* save_as_button = nullptr;