gui/gui-lib/mred/private/wx/gtk/message.rkt
Matthew Flatt 5b7bf69a13 HiDPI support on Unix (Gtk2)
Support GUI scaling in much the same way as on Windows, where
the OS setting ("org.gnome.desktop.interface.scaling-factor"
times "...text-scaling-factor") determines the scale that is
used for both graphics and GUI sizing.

As I understand it, a complete solution requires porting to
Gtk3. With Gtk2, the graphical part of a widget doesn't scale.
Text and image labels should scale correctly, though.
2015-08-01 18:06:12 -06:00

83 lines
2.7 KiB
Racket

#lang racket/base
(require racket/class
ffi/unsafe
"../../syntax.rkt"
"../../lock.rkt"
"item.rkt"
"utils.rkt"
"types.rkt"
"pixbuf.rkt"
"window.rkt")
(provide
(protect-out message%
gtk_label_new_with_mnemonic
gtk_label_set_text_with_mnemonic))
;; ----------------------------------------
(define-gtk gtk_label_new (_fun _string -> _GtkWidget))
(define-gtk gtk_label_set_text (_fun _GtkWidget _string -> _void))
(define-gtk gtk_label_set_text_with_mnemonic (_fun _GtkWidget _string -> _void))
(define-gtk gtk_image_new_from_stock (_fun _string _int -> _GtkWidget))
(define-gtk gtk_misc_set_alignment (_fun _GtkWidget _float _float -> _void))
(define-gtk gtk_image_set_from_pixbuf (_fun _GtkWidget _GdkPixbuf -> _void))
(define (gtk_label_new_with_mnemonic s)
(let ([l (gtk_label_new s)])
(when (regexp-match? #rx"&" s)
(let ([s (mnemonic-string s)])
(gtk_label_set_text_with_mnemonic l s)))
l))
(define icon-size 6) ; = GTK_ICON_SIZE_DIALOG
(defclass message% item%
(init parent label
x y
style font)
(inherit set-auto-size get-gtk)
(super-new [parent parent]
[gtk (if (or (string? label)
(not label))
(as-gtk-allocation (gtk_label_new_with_mnemonic (or label "")))
(if (symbol? label)
(as-gtk-allocation
(case label
[(caution) (gtk_image_new_from_stock "gtk-dialog-warning" icon-size)]
[(stop) (gtk_image_new_from_stock "gtk-dialog-error" icon-size)]
[else (gtk_image_new_from_stock "gtk-dialog-question" icon-size)]))
(let ([pixbuf (bitmap->pixbuf label (->screen 1.0))])
(begin0
(as-gtk-allocation
(gtk_image_new_from_pixbuf pixbuf))
(release-pixbuf pixbuf)))))]
[font font]
[no-show? (memq 'deleted style)])
(when (string? label)
(gtk_misc_set_alignment (get-gtk) 0.0 0.0))
(set-auto-size)
(define/override (set-label s)
(cond
[(string? s)
(gtk_label_set_text_with_mnemonic (get-gtk) (mnemonic-string s))]
[else
(let ([pixbuf (bitmap->pixbuf s (->screen 1.0))])
(atomically
(gtk_image_set_from_pixbuf (get-gtk) pixbuf)
(release-pixbuf pixbuf)))]))
(define/public (set-preferred-size)
(gtk_widget_set_size_request (get-gtk) -1 -1)
(set-auto-size)
#t)
(define/override (gets-focus?) #f)
(def/public-unimplemented get-font))