DrRacket now saves the font size preference on a per-monitor-configuration basis

This commit is contained in:
Robby Findler 2013-05-10 08:20:03 -05:00
parent 20ad11a830
commit 9a7af8c840
10 changed files with 208 additions and 46 deletions

View File

@ -30,10 +30,8 @@
(parent options-panel) (parent options-panel)
(label (string-constant font-size)))) (label (string-constant font-size))))
(define (adjust-font-size f) (define (adjust-font-size f)
(preferences:set (editor:set-current-preferred-font-size
'framework:standard-style-list:font-size (f (editor:get-current-preferred-font-size))))
(f (preferences:get
'framework:standard-style-list:font-size))))
(define size-slider (define size-slider
(new slider% (new slider%
(label #f) (label #f)
@ -46,7 +44,7 @@
(λ (old-size) (λ (old-size)
(send size get-value))))) (send size get-value)))))
(init-value (init-value
(preferences:get 'framework:standard-style-list:font-size)))) (editor:get-current-preferred-font-size))))
(define size-hp (new horizontal-pane% (parent size-panel))) (define size-hp (new horizontal-pane% (parent size-panel)))
(define (mk-size-button label chng) (define (mk-size-button label chng)
(new button% (new button%
@ -196,7 +194,9 @@
(send text end-edit-sequence)) (send text end-edit-sequence))
(preferences:add-callback (preferences:add-callback
'framework:standard-style-list:font-size 'framework:standard-style-list:font-size
(λ (p v) (send size-slider set-value v))) (λ (p v) (send size-slider set-value
(editor:font-size-pref->current-font-size
v))))
(preferences:add-callback (preferences:add-callback
drracket:language-configuration:settings-preferences-symbol drracket:language-configuration:settings-preferences-symbol
(λ (p v) (λ (p v)

View File

@ -649,6 +649,8 @@
(drracket:module-language:initialize-prefs-panel) (drracket:module-language:initialize-prefs-panel)
(editor:set-change-font-size-when-monitors-change? #t)
(let* ([find-frame (let* ([find-frame
(λ (item) (λ (item)
(let loop ([item item]) (let loop ([item item])
@ -751,6 +753,11 @@
;; that is uninitialized (phase level 0); ;; that is uninitialized (phase level 0);
;; reference appears in module: ...) ;; reference appears in module: ...)
;; we also do this as a low-priority callback since work above
;; (specifically the call to editor:set-change-font-size-when-monitors-change?)
;; may have triggered other low-priority callbacks that we
;; want to complete before we open up that first DrRacket window.
(queue-callback (queue-callback
(λ () (λ ()
@ -786,4 +793,5 @@
(make-basic)) (make-basic))
(when (and (preferences:get 'drracket:open-in-tabs) (when (and (preferences:get 'drracket:open-in-tabs)
(not (null? no-dups))) (not (null? no-dups)))
(handler:edit-file (car no-dups)))))) (handler:edit-file (car no-dups)))))
#f)

View File

@ -1721,7 +1721,7 @@
(set! msgs _msgs) (set! msgs _msgs)
(set! err? _err?) (set! err? _err?)
(set! copy-msg _copy-msg) (set! copy-msg _copy-msg)
(set-the-height/dc-font (preferences:get 'framework:standard-style-list:font-size)) (set-the-height/dc-font (editor:get-current-preferred-font-size))
(refresh)) (refresh))
(define/override (on-event evt) (define/override (on-event evt)
(cond (cond
@ -1756,7 +1756,8 @@
;; need object to hold onto this function, so this is ;; need object to hold onto this function, so this is
;; intentionally a private field, not a method ;; intentionally a private field, not a method
(define (font-size-changed-callback _ new-size) (define (font-size-changed-callback _ new-prefs)
(define new-size (editor:font-size-pref->current-font-size new-prefs))
(set-the-height/dc-font new-size) (set-the-height/dc-font new-size)
(refresh)) (refresh))
(preferences:add-callback (preferences:add-callback
@ -1784,7 +1785,7 @@
(inherit min-height) (inherit min-height)
(set-the-height/dc-font (set-the-height/dc-font
(preferences:get 'framework:standard-style-list:font-size)))) (editor:get-current-preferred-font-size))))
(define yellow-message% (define yellow-message%
(class canvas% (class canvas%

View File

@ -3417,17 +3417,15 @@ module browser threading seems wrong.
(let () (let ()
(define (font-adjust adj label key shortcut) (define (font-adjust adj label key shortcut)
(define (adj-font _1 _2) (define (adj-font _1 _2)
(preferences:set (editor:set-current-preferred-font-size
'framework:standard-style-list:font-size (adj
(adj (preferences:get (editor:get-current-preferred-font-size))))
'framework:standard-style-list:font-size))))
(define (on-demand item) (define (on-demand item)
(define lab (define lab
(format (format
label label
(adj (adj
(preferences:get (editor:get-current-preferred-font-size))))
'framework:standard-style-list:font-size))))
(send item set-label lab)) (send item set-label lab))
(define item (define item
(new menu:can-restore-menu-item% (new menu:can-restore-menu-item%

View File

@ -1510,6 +1510,85 @@
(keymap) (keymap)
@{Initializes @racket[keymap] with Racket-mode keybindings.}) @{Initializes @racket[keymap] with Racket-mode keybindings.})
(proc-doc/names
editor:set-current-preferred-font-size
(-> exact-nonnegative-integer? void?)
(new-size)
@{Sets the font preference for the current monitor configuration to
@racket[new-size].
See also @racket[editor:get-current-preferred-font-size]
and @racket[editor:font-size-pref->current-font-size].})
(proc-doc
editor:get-current-preferred-font-size
(-> exact-nonnegative-integer?)
@{Gets the current setting for the font size preference. Calls
@racket[editor:font-size-pref->current-font-size] with the
current preference setting.
See also @racket[editor:set-current-preferred-font-size] and
@racket[editor:get-change-font-size-when-monitors-change?].
})
(proc-doc/names
editor:font-size-pref->current-font-size
(-> (vector/c
;; font sizes for specific monitor configurations
(hash/c
;; a particular monitor configuration: the widths and heights
(non-empty-listof (list/c exact-nonnegative-integer?
exact-nonnegative-integer?))
;; the font size for that configuration
exact-nonnegative-integer?
#:flat? #t)
;; default font size, when none of the configs above apply
exact-nonnegative-integer?
#:flat? #t)
exact-nonnegative-integer?)
(font-preference)
@{Determines the current monitor configuration and uses that to pick
one of the sizes from its argument. The argument is expected
to come from the preference value of @racket['framework:standard-style-list:font-size].
Except if @racket[editor:get-change-font-size-when-monitors-change?] returns
@racket[#f], in which case the current monitor configuration is not considered
and the last-set size (the second position in the vector) is always returned.
As background, the font size
preference is actually saved on a per-monitor configuration basis; specifically
the preference value (using the same contract as the argument of this function)
contains a table mapping a list of monitor sizes (but not their
positions) obtained by @racket[get-display-size] to the preferred font size
(plus a default size used for new configurations).
See also @racket[editor:get-current-preferred-font-size],
@racket[editor:get-current-preferred-font-size], and
@racket[editor:get-change-font-size-when-monitors-change?].})
(proc-doc/names
editor:get-change-font-size-when-monitors-change?
(-> boolean?)
()
@{Returns @racket[#t] when the framework will automatically
adjust the current font size in the @racket["Standard"]
style of the result of @racket[editor:get-standard-style-list]
based on the monitor configuration.
Defaults to @racket[#f]
See also @racket[editor:set-change-font-size-when-monitors-change?];
@racket[editor:font-size-pref->current-font-size].})
(proc-doc/names
editor:set-change-font-size-when-monitors-change?
(-> boolean? void?)
(b?)
@{Controls the result of @racket[editor:get-change-font-size-when-monitors-change?].
See also @racket[editor:get-change-font-size-when-monitors-change?].})
(proc-doc/names (proc-doc/names
editor:set-default-font-color editor:set-default-font-color
(-> (is-a?/c color%) void?) (-> (is-a?/c color%) void?)

View File

@ -1,4 +1,4 @@
#lang scheme/unit #lang racket/unit
(require mzlib/class (require mzlib/class
string-constants string-constants
@ -360,35 +360,35 @@
delta)))) delta))))
(define (set-default-font-color color) (define (set-default-font-color color)
(let* ([scheme-standard (send standard-style-list find-named-style default-color-style-name)] (let* ([the-standard (send standard-style-list find-named-style default-color-style-name)]
[scheme-delta (make-object style-delta%)]) [the-delta (make-object style-delta%)])
(send scheme-standard get-delta scheme-delta) (send the-standard get-delta the-delta)
(send scheme-delta set-delta-foreground color) (send the-delta set-delta-foreground color)
(send scheme-standard set-delta scheme-delta))) (send the-standard set-delta the-delta)))
(define (set-font-size size) (define (set-font-size size)
(update-standard-style (update-standard-style
(λ (scheme-delta) (λ (the-delta)
(send scheme-delta set-size-mult 0) (send the-delta set-size-mult 0)
(send scheme-delta set-size-add size)))) (send the-delta set-size-add size))))
(define (set-font-name name) (define (set-font-name name)
(update-standard-style (update-standard-style
(λ (scheme-delta) (λ (the-delta)
(send scheme-delta set-delta-face name) (send the-delta set-delta-face name)
(send scheme-delta set-family 'modern)))) (send the-delta set-family 'modern))))
(define (set-font-smoothing sym) (define (set-font-smoothing sym)
(update-standard-style (update-standard-style
(λ (scheme-delta) (λ (the-delta)
(send scheme-delta set-smoothing-on sym)))) (send the-delta set-smoothing-on sym))))
(define (update-standard-style cng-delta) (define (update-standard-style cng-delta)
(let* ([scheme-standard (send standard-style-list find-named-style "Standard")] (let* ([the-standard (send standard-style-list find-named-style "Standard")]
[scheme-delta (make-object style-delta%)]) [the-delta (make-object style-delta%)])
(send scheme-standard get-delta scheme-delta) (send the-standard get-delta the-delta)
(cng-delta scheme-delta) (cng-delta the-delta)
(send scheme-standard set-delta scheme-delta))) (send the-standard set-delta the-delta)))
(define standard-style-list<%> (define standard-style-list<%>
(interface (editor<%>) (interface (editor<%>)
@ -396,7 +396,7 @@
(define standard-style-list-mixin (define standard-style-list-mixin
(mixin (editor<%>) (standard-style-list<%>) (mixin (editor<%>) (standard-style-list<%>)
(super-instantiate ()) (super-new)
(inherit set-style-list set-load-overwrites-styles) (inherit set-style-list set-load-overwrites-styles)
(set-style-list standard-style-list) (set-style-list standard-style-list)
(set-load-overwrites-styles #f))) (set-load-overwrites-styles #f)))
@ -421,16 +421,62 @@
(define set-font-size-callback-size #f) (define set-font-size-callback-size #f)
(define (set-standard-style-list-pref-callbacks) (define (set-standard-style-list-pref-callbacks)
(set-font-size (preferences:get 'framework:standard-style-list:font-size)) (set-font-size (get-current-preferred-font-size))
(set-font-name (preferences:get 'framework:standard-style-list:font-name)) (set-font-name (preferences:get 'framework:standard-style-list:font-name))
(set-font-smoothing (preferences:get 'framework:standard-style-list:smoothing)) (set-font-smoothing (preferences:get 'framework:standard-style-list:smoothing))
(preferences:add-callback 'framework:standard-style-list:font-size (λ (p v) (set-font-size/callback v))) (preferences:add-callback 'framework:standard-style-list:font-size
(λ (p v)
(set-font-size/callback (font-size-pref->current-font-size v))))
(preferences:add-callback 'framework:standard-style-list:font-name (λ (p v) (set-font-name v))) (preferences:add-callback 'framework:standard-style-list:font-name (λ (p v) (set-font-name v)))
(preferences:add-callback 'framework:standard-style-list:smoothing (λ (p v) (set-font-smoothing v))) (preferences:add-callback 'framework:standard-style-list:smoothing (λ (p v) (set-font-smoothing v)))
(unless (member (preferences:get 'framework:standard-style-list:font-name) (get-face-list)) (unless (member (preferences:get 'framework:standard-style-list:font-name) (get-face-list))
(preferences:set 'framework:standard-style-list:font-name (get-family-builtin-face 'modern)))) (preferences:set 'framework:standard-style-list:font-name (get-family-builtin-face 'modern))))
(define (get-current-preferred-font-size)
(font-size-pref->current-font-size (preferences:get 'framework:standard-style-list:font-size)))
(define (font-size-pref->current-font-size v)
(define default-size (vector-ref v 1))
(cond
[change-font-size-when-monitors-change?
(define monitor-sizes (get-current-monitor-sizes))
(hash-ref (vector-ref v 0) monitor-sizes default-size)]
[else
default-size]))
(define change-font-size-when-monitors-change? #f)
(define (get-change-font-size-when-monitors-change?)
change-font-size-when-monitors-change?)
(define (set-change-font-size-when-monitors-change? b?)
(unless (equal? change-font-size-when-monitors-change? b?)
(set! change-font-size-when-monitors-change? b?)
(set-current-preferred-font-size
(get-current-preferred-font-size))))
(define (set-current-preferred-font-size new-size)
(define old-pref (preferences:get 'framework:standard-style-list:font-size))
(define current-mons (get-current-monitor-sizes))
(define new-monitor-sizes
(hash-set (vector-ref old-pref 0)
current-mons
new-size))
(preferences:set 'framework:standard-style-list:font-size
(vector new-monitor-sizes new-size)))
(define (get-current-monitor-sizes)
(let loop ([m (get-display-count)]
[sizes '()])
(cond
[(zero? m) sizes]
[else
(define-values (w h) (get-display-size #:monitor (- m 1)))
(loop (- m 1)
(if (and w h)
(cons (list w h) sizes)
sizes))])))
;; set-standard-style-list-delta : string (is-a?/c style-delta<%>) -> void ;; set-standard-style-list-delta : string (is-a?/c style-delta<%>) -> void
(define (set-standard-style-list-delta name delta) (define (set-standard-style-list-delta name delta)
(let* ([style-list (get-standard-style-list)] (let* ([style-list (get-standard-style-list)]

View File

@ -480,6 +480,9 @@
(set! latest-monitor-information new-monitor-information) (set! latest-monitor-information new-monitor-information)
(queue-callback (queue-callback
(λ () (λ ()
(when (editor:get-change-font-size-when-monitors-change?)
(editor:set-current-preferred-font-size
(editor:get-current-preferred-font-size)))
(for ([frame (in-list (get-top-level-windows))]) (for ([frame (in-list (get-top-level-windows))])
(when (is-a? frame size-pref<%>) (when (is-a? frame size-pref<%>)
(send frame monitor-setup-changed))) (send frame monitor-setup-changed)))

View File

@ -1,5 +1,6 @@
#lang racket/unit #lang racket/unit
(require racket/class (require racket/class
racket/contract
"sig.rkt" "sig.rkt"
"../preferences.rkt" "../preferences.rkt"
mred/mred-sig) mred/mred-sig)
@ -143,11 +144,32 @@
(preferences:set-default (preferences:set-default
'framework:standard-style-list:font-size 'framework:standard-style-list:font-size
(let* ([txt (make-object text%)] (vector (hash)
[stl (send txt get-style-list)] (let* ([txt (make-object text%)]
[bcs (send stl basic-style)]) [stl (send txt get-style-list)]
(send bcs get-size)) [bcs (send stl basic-style)])
(λ (x) (and (number? x) (exact? x) (integer? x) (positive? x)))) (send bcs get-size)))
(vector/c
;; font sizes for specific monitor configurations
(hash/c
;; a particular monitor configuration: the widths and heights
(non-empty-listof (list/c exact-nonnegative-integer?
exact-nonnegative-integer?))
;; the font size for that configuration
exact-nonnegative-integer?
#:flat? #t)
;; default font size, when none of the configs above apply
exact-nonnegative-integer?
#:flat? #t))
(preferences:set-un/marshall
'framework:standard-style-list:font-size
values
(λ (x)
(if (exact-nonnegative-integer? x)
;; coerce old pref settings to new
(vector (hash) x)
x)))
(preferences:set-default (preferences:set-default
'framework:standard-style-list:smoothing 'framework:standard-style-list:smoothing

View File

@ -162,7 +162,12 @@
set-standard-style-list-delta set-standard-style-list-delta
set-default-font-color set-default-font-color
get-default-color-style-name get-default-color-style-name
add-after-user-keymap)) add-after-user-keymap
get-current-preferred-font-size
set-current-preferred-font-size
font-size-pref->current-font-size
set-change-font-size-when-monitors-change?
get-change-font-size-when-monitors-change?))
(define-signature pasteboard-class^ (define-signature pasteboard-class^
(basic% (basic%

View File

@ -3744,14 +3744,14 @@ designates the character that triggers autocompletion
(define/private (get-mt-font) (define/private (get-mt-font)
(send the-font-list find-or-create-font (send the-font-list find-or-create-font
(preferences:get 'framework:standard-style-list:font-size) (editor:get-current-preferred-font-size)
'default 'default
'italic 'italic
'normal)) 'normal))
(define/private (get-reg-font) (define/private (get-reg-font)
(send the-font-list find-or-create-font (send the-font-list find-or-create-font
(preferences:get 'framework:standard-style-list:font-size) (editor:get-current-preferred-font-size)
'default 'default
'normal 'normal
'normal)) 'normal))