From fbc75ec8e012d2eff3ab755a77dd3ba6c2964a26 Mon Sep 17 00:00:00 2001 From: iwbnwif Date: Mon, 4 Nov 2019 20:04:12 +0000 Subject: [PATCH] Add support for fractional font scaling to wxGTK3 Respect the system font scaling parameter (e.g. "Fonts->Scaling Factor" in Gnome Tweaks, "Force font DPI" in KDE System Settings or GDK_DPI_SCALE environment variable) when drawing text using wxFont. This ensures that generic widgets have their text scaled appropriately to be consistent with native widgets. Closes https://github.com/wxWidgets/wxWidgets/pull/1635 --- src/generic/graphicc.cpp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/generic/graphicc.cpp b/src/generic/graphicc.cpp index 4bbca0ae54..6f3480fbc7 100644 --- a/src/generic/graphicc.cpp +++ b/src/generic/graphicc.cpp @@ -526,6 +526,9 @@ protected: WindowHDC m_mswWindowHDC; int m_mswStateSavedDC; #endif +#ifdef __WXGTK__ + float m_fontScalingFactor; +#endif private: cairo_t* m_context; @@ -2360,6 +2363,14 @@ wxCairoContext::~wxCairoContext() void wxCairoContext::Init(cairo_t *context) { +#ifdef __WXGTK__ + // Attempt to find the system font scaling parameter (e.g. "Fonts->Scaling + // Factor" in Gnome Tweaks, "Force font DPI" in KDE System Settings or + // GDK_DPI_SCALE environment variable). + GdkScreen* screen = gdk_screen_get_default(); + m_fontScalingFactor = screen ? gdk_screen_get_resolution(screen) / 96.0 : 1.0; +#endif + m_context = context; if ( m_context ) { @@ -2660,9 +2671,12 @@ void wxCairoContext::DoDrawText(const wxString& str, wxDouble x, wxDouble y) fontData->Apply(this); #ifdef __WXGTK__ - const wxFont& font = fontData->GetFont(); + wxFont font = fontData->GetFont(); if ( font.IsOk() ) { + // Apply GDK font scaling factor. + font.Scale(m_fontScalingFactor); + wxGtkObject layout(pango_cairo_create_layout (m_context)); pango_layout_set_font_description(layout, font.GetNativeFontInfo()->description); pango_layout_set_text(layout, data, data.length()); @@ -2710,7 +2724,7 @@ void wxCairoContext::GetTextExtent( const wxString &str, wxDouble *width, wxDoub #ifdef __WXGTK__ // Use Pango instead of Cairo toy font API if we have the font. - const wxFont& font = fontData->GetFont(); + wxFont font = fontData->GetFont(); if ( font.IsOk() ) { // Note that there is no need to call Apply() at all in this case, it @@ -2718,6 +2732,9 @@ void wxCairoContext::GetTextExtent( const wxString &str, wxDouble *width, wxDoub // measuring its extent. int w, h; + // Apply GDK font scaling factor. + font.Scale(m_fontScalingFactor); + wxGtkObject layout(pango_cairo_create_layout (m_context)); pango_layout_set_font_description(layout, font.GetNativeFontInfo()->description); const wxCharBuffer data = str.utf8_str(); @@ -2787,7 +2804,11 @@ void wxCairoContext::GetPartialTextExtents(const wxString& text, wxArrayDouble& if (data.length()) { wxGtkObject layout(pango_cairo_create_layout(m_context)); - const wxFont& font = static_cast(m_font.GetRefData())->GetFont(); + wxFont font = static_cast(m_font.GetRefData())->GetFont(); + + // Apply GDK font scaling factor. + font.Scale(m_fontScalingFactor); + pango_layout_set_font_description(layout, font.GetNativeFontInfo()->description); pango_layout_set_text(layout, data, data.length()); PangoLayoutIter* iter = pango_layout_get_iter(layout);