X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/99a33b77e15b9a075024701d060d912b2fd87caf..e4adb6cdf30706f28dada8aafd347549c84105ac:/lisp/dynamic-setting.el diff --git a/lisp/dynamic-setting.el b/lisp/dynamic-setting.el index 81531c4a21..6021a3ba6e 100644 --- a/lisp/dynamic-setting.el +++ b/lisp/dynamic-setting.el @@ -1,9 +1,9 @@ ;;; dynamic-setting.el --- Support dynamic changes -;; Copyright (C) 2009-2011 Free Software Foundation, Inc. +;; Copyright (C) 2009-2016 Free Software Foundation, Inc. ;; Author: Jan Djärv -;; Maintainer: FSF +;; Maintainer: emacs-devel@gnu.org ;; Keywords: font, system-font, tool-bar-style ;; Package: emacs @@ -42,51 +42,37 @@ If DISPLAY-OR-FRAME is a frame, the display is the one for that frame. If SET-FONT is non-nil, change the font for frames. Otherwise re-apply the current form for the frame (i.e. hinting or somesuch changed)." - (let ((new-font (and (fboundp 'font-get-system-font) - (font-get-system-font)))) - (when new-font - ;; Be careful here: when set-face-attribute is called for the - ;; :font attribute, Emacs tries to guess the best matching font - ;; by examining the other face attributes (Bug#2476). - + (font-get-system-font))) + (frame-list (frames-on-display-list display-or-frame))) + (when (and new-font (display-graphic-p display-or-frame)) (clear-font-cache) - ;; Set for current frames. Only change font for those that have - ;; the old font now. If they don't have the old font, the user - ;; probably changed it. - (dolist (f (frames-on-display-list display-or-frame)) - (if (display-graphic-p f) - (let* ((frame-font - (or (font-get (face-attribute 'default :font f - 'default) :user-spec) - (frame-parameter f 'font-parameter))) - (font-to-set - (if set-font new-font - ;; else set font again, hinting etc. may have changed. - frame-font))) - (if font-to-set - (progn - (set-frame-parameter f 'font-parameter font-to-set) - (set-face-attribute 'default f - :width 'normal - :weight 'normal - :slant 'normal - :font font-to-set)))))) - - ;; Set for future frames. - (set-face-attribute 'default t :font new-font) - (let ((spec (list (list t (face-attr-construct 'default))))) - (progn - (put 'default 'customized-face spec) - (custom-push-theme 'theme-face 'default 'user 'set spec) - (put 'default 'face-modified nil)))))) + (if set-font + ;; Set the font on all current and future frames, as though + ;; the `default' face had been "set for this session": + (set-frame-font new-font nil frame-list) + ;; Just redraw the existing fonts on all frames: + (dolist (f frame-list) + (let ((frame-font + (or (font-get (face-attribute 'default :font f 'default) + :user-spec) + (frame-parameter f 'font-parameter)))) + (when frame-font + (set-frame-parameter f 'font-parameter frame-font) + (set-face-attribute 'default f + :width 'normal + :weight 'normal + :slant 'normal + :font frame-font)))))))) (defun dynamic-setting-handle-config-changed-event (event) "Handle config-changed-event on the display in EVENT. Changes can be The monospace font. If `font-use-system-font' is nil, the font is not changed. + The normal font. Xft parameters, like DPI and hinting. + The Gtk+ theme name. The tool bar style." (interactive "e") (let ((type (nth 1 event))