From 5e70534b43ad9161e14001238aea46b25c96676f Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 19 Dec 2016 07:17:37 -0700 Subject: [PATCH] adjust workaround for GTK+3 before version 3.22 Adjust a workaround for versions before 3.22 when setting the font for a control. GTK+ version 3.22 starts paying attention to whether a font size for a control is absolute (as opposed to being in points), so the workaround that was put in place for earlier versions breaks. In addition, some part of the drawing stack seems to round point sizes to an integeral size after DPI conversion. Take that rounding into account when setting the font size in `normal-control-font`. Closes #1522 --- gui-lib/mred/private/wx/gtk/item.rkt | 12 ++++++++---- gui-lib/mred/private/wx/gtk/procs.rkt | 13 +++++++++++-- gui-lib/mred/private/wx/gtk/utils.rkt | 4 ++++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/gui-lib/mred/private/wx/gtk/item.rkt b/gui-lib/mred/private/wx/gtk/item.rkt index f38d8074..8dc95ee7 100644 --- a/gui-lib/mred/private/wx/gtk/item.rkt +++ b/gui-lib/mred/private/wx/gtk/item.rkt @@ -26,10 +26,14 @@ (when font (let* ([target-size (cond - [gtk3? - ;; Gtk3 ignores the "size-in-pixels" part of a - ;; font spec, so we have to adjust the text size - ;; to compensate. + [(and gtk3? + ((gtk_get_minor_version) . < . 22)) + ;; Prior to version 3.22, GTK+3 ignores the + ;; "size-in-pixels" part of a font spec, so we have to + ;; adjust the text size to compensate. + ;; With 3.22 and later, a size in points is effectively + ;; rounded to an integer absolute size; the `get-control-font-size` + ;; function takes that rounding into account. (* (send font get-size) (/ 72.0 (pango_cairo_font_map_get_resolution diff --git a/gui-lib/mred/private/wx/gtk/procs.rkt b/gui-lib/mred/private/wx/gtk/procs.rkt index f05a92c1..db6bd448 100644 --- a/gui-lib/mred/private/wx/gtk/procs.rkt +++ b/gui-lib/mred/private/wx/gtk/procs.rkt @@ -116,8 +116,17 @@ (g_free f)))))) default)) (define (get-control-font-size) - (get-control-font (lambda (m) (string->number (cadr m))) - 10)) + (define s (get-control-font (lambda (m) (string->number (cadr m))) + 10)) + (cond + [(and gtk3? + ((gtk_get_minor_version) . >= . 22)) + ;; As of version 3.22, a size in points ends up rounded + ;; to an integral absolute size for 96 DPI; see also + ;; `install-control-font` + (* (round (* s (/ 96.0 72.0))) (/ 72.0 96.0))] + [else s])) + (define (get-control-font-face) (get-control-font (lambda (m) (car m)) "Sans")) diff --git a/gui-lib/mred/private/wx/gtk/utils.rkt b/gui-lib/mred/private/wx/gtk/utils.rkt index 85dc57d8..b698ec65 100644 --- a/gui-lib/mred/private/wx/gtk/utils.rkt +++ b/gui-lib/mred/private/wx/gtk/utils.rkt @@ -51,6 +51,8 @@ gdk_screen_get_default + gtk_get_minor_version + ;; for declaring derived structures: _GtkObject @@ -200,6 +202,8 @@ (define-gdk gdk_screen_get_default (_fun -> _GdkScreen)) +(define-gtk gtk_get_minor_version (_fun -> _uint)) + (define (mnemonic-string orig-s) (string-join (for/list ([s (in-list (regexp-split #rx"&&" orig-s))])