Line data Source code
1 : ;;; dynamic-setting.el --- Support dynamic changes
2 :
3 : ;; Copyright (C) 2009-2017 Free Software Foundation, Inc.
4 :
5 : ;; Author: Jan Djärv <jan.h.d@swipnet.se>
6 : ;; Maintainer: emacs-devel@gnu.org
7 : ;; Keywords: font, system-font, tool-bar-style
8 : ;; Package: emacs
9 :
10 : ;; This file is part of GNU Emacs.
11 :
12 : ;; GNU Emacs is free software: you can redistribute it and/or modify
13 : ;; it under the terms of the GNU General Public License as published by
14 : ;; the Free Software Foundation, either version 3 of the License, or
15 : ;; (at your option) any later version.
16 :
17 : ;; GNU Emacs is distributed in the hope that it will be useful,
18 : ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19 : ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 : ;; GNU General Public License for more details.
21 :
22 : ;; You should have received a copy of the GNU General Public License
23 : ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
24 :
25 : ;;; Commentary:
26 :
27 : ;; This file provides the lisp part of the GConf and XSetting code in
28 : ;; xsetting.c. But it is nothing that prevents it from being used by
29 : ;; other configuration schemes.
30 :
31 : ;;; Code:
32 :
33 : ;;; Customizable variables
34 :
35 : (declare-function font-get-system-font "xsettings.c" ())
36 :
37 : (defvar font-use-system-font)
38 :
39 : (defun font-setting-change-default-font (display-or-frame set-font)
40 : "Change font and/or font settings for frames on display DISPLAY-OR-FRAME.
41 : If DISPLAY-OR-FRAME is a frame, the display is the one for that frame.
42 :
43 : If SET-FONT is non-nil, change the font for frames. Otherwise re-apply the
44 : current form for the frame (i.e. hinting or somesuch changed)."
45 0 : (let ((new-font (and (fboundp 'font-get-system-font)
46 0 : (font-get-system-font)))
47 0 : (frame-list (frames-on-display-list display-or-frame)))
48 0 : (when (and new-font (display-graphic-p display-or-frame))
49 0 : (clear-font-cache)
50 0 : (if set-font
51 : ;; Set the font on all current and future frames, as though
52 : ;; the `default' face had been "set for this session":
53 0 : (set-frame-font new-font nil frame-list)
54 : ;; Just redraw the existing fonts on all frames:
55 0 : (dolist (f frame-list)
56 0 : (let ((frame-font
57 0 : (or (font-get (face-attribute 'default :font f 'default)
58 0 : :user-spec)
59 0 : (frame-parameter f 'font-parameter))))
60 0 : (when frame-font
61 0 : (set-frame-parameter f 'font-parameter frame-font)
62 0 : (set-face-attribute 'default f
63 : :width 'normal
64 : :weight 'normal
65 : :slant 'normal
66 0 : :font frame-font))))))))
67 :
68 : (defun dynamic-setting-handle-config-changed-event (event)
69 : "Handle config-changed-event on the display in EVENT.
70 : Changes can be
71 : The monospace font. If `font-use-system-font' is nil, the font
72 : is not changed.
73 : The normal font.
74 : Xft parameters, like DPI and hinting.
75 : The Gtk+ theme name.
76 : The tool bar style."
77 : (interactive "e")
78 0 : (let ((type (nth 1 event))
79 0 : (display-name (nth 2 event)))
80 0 : (cond ((and (eq type 'monospace-font-name) font-use-system-font)
81 0 : (font-setting-change-default-font display-name t))
82 :
83 0 : ((eq type 'font-render)
84 0 : (font-setting-change-default-font display-name nil))
85 :
86 : ;; This is a bit heavy, ideally we would just clear faces
87 : ;; on the affected display, and perhaps only the relevant
88 : ;; faces. Oh well.
89 0 : ((eq type 'theme-name) (clear-face-cache))
90 :
91 0 : ((eq type 'tool-bar-style) (force-mode-line-update t)))))
92 :
93 : (define-key special-event-map [config-changed-event]
94 : 'dynamic-setting-handle-config-changed-event)
95 :
|