Mercurial > hg > xemacs-beta
annotate lisp/msw-font-menu.el @ 5569:d19b6e3bdf91
#'cl-defsubst-expand; avoid mutually-recursive symbol macros.
lisp/ChangeLog addition:
2011-09-10 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (cl-defsubst-expand):
Change set 2a6a8da4dd7c of
http://mid.gmane.org/19966.17522.332164.615228@parhasard.net
wasn't sufficiently comprehensive, symbol macros can be mutually
rather than simply recursive, and they can equally hang. Thanks
for the bug report, Michael Sperber, and for the test case,
Stephen Turnbull.
| author | Aidan Kehoe <kehoea@parhasard.net> |
|---|---|
| date | Sat, 10 Sep 2011 13:17:29 +0100 |
| parents | 0af042a0c116 |
| children | cc6f0266bc36 |
| rev | line source |
|---|---|
| 398 | 1 ;; msw-font-menu.el --- Managing menus of mswindows fonts. |
| 2 | |
| 3 ;; Copyright (C) 1999 Free Software Foundation, Inc. | |
| 872 | 4 ;; Copyright (C) 2002 Ben Wing. |
| 398 | 5 |
| 6 ;; Adapted from x-font-menu.el by Andy Piper <andy@xemacs.org> | |
| 7 | |
| 8 ;; This file is part of XEmacs. | |
| 9 | |
|
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4103
diff
changeset
|
10 ;; XEmacs is free software: you can redistribute it and/or modify it |
|
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4103
diff
changeset
|
11 ;; under the terms of the GNU General Public License as published by the |
|
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4103
diff
changeset
|
12 ;; Free Software Foundation, either version 3 of the License, or (at your |
|
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4103
diff
changeset
|
13 ;; option) any later version. |
| 398 | 14 |
|
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4103
diff
changeset
|
15 ;; XEmacs is distributed in the hope that it will be useful, but WITHOUT |
|
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4103
diff
changeset
|
16 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4103
diff
changeset
|
17 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4103
diff
changeset
|
18 ;; for more details. |
| 398 | 19 |
| 20 ;; You should have received a copy of the GNU General Public License | |
|
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4103
diff
changeset
|
21 ;; along with XEmacs. If not, see <http://www.gnu.org/licenses/>. |
| 398 | 22 |
| 872 | 23 ;;; Known Problems: |
| 24 ;;; =============== | |
| 25 ;;; There is knowledge here about the regexp match numbers in | |
| 26 ;;; `mswindows-font-regexp' and `mswindows-font-regexp-foundry-and-family' defined in | |
| 27 ;;; mswindows-faces.el. | |
| 28 ;;; | |
| 29 | |
| 398 | 30 ;;; mswindows fonts look like: |
| 31 ;;; fontname[:[weight][ style][:pointsize[:effects]]][:charset] | |
| 32 ;;; ie: | |
| 33 ;;; Lucida Console:Regular:10 | |
| 34 ;;; minimal: | |
| 35 ;;; Courier New | |
| 36 ;;; maximal: | |
| 37 ;;; Courier New:Bold Italic:10:underline strikeout:western | |
| 38 | |
| 39 ;;; Code: | |
| 40 | |
| 41 ;; #### - implement these... | |
| 42 ;; | |
| 43 ;;; (defvar font-menu-ignore-proportional-fonts nil | |
| 44 ;;; "*If non-nil, then the font menu will only show fixed-width fonts.") | |
| 45 | |
| 46 (require 'font-menu) | |
| 778 | 47 (globally-declare-boundp 'mswindows-font-regexp) |
| 398 | 48 |
| 4103 | 49 (globally-declare-fboundp |
| 50 '(mswindows-parse-font-style | |
| 51 mswindows-construct-font-style)) | |
| 52 | |
| 398 | 53 (defvar mswindows-font-menu-junk-families |
| 444 | 54 (mapconcat |
| 55 #'identity | |
| 56 '("Symbol" | |
| 57 ) | |
| 58 "\\|") | |
| 398 | 59 "A regexp matching font families which are uninteresting (e.g. cursor fonts).") |
| 60 | |
| 61 (defvar mswindows-font-regexp-ascii nil | |
| 62 "This is used to filter out font families that can't display ASCII text. | |
| 63 It must be set at run-time.") | |
| 64 | |
| 65 ;;;###autoload | |
| 66 (defun mswindows-reset-device-font-menus (device &optional debug) | |
| 67 "Generates the `Font', `Size', and `Weight' submenus for the Options menu. | |
| 68 This is run the first time that a font-menu is needed for each device. | |
| 69 If you don't like the lazy invocation of this function, you can add it to | |
| 70 `create-device-hook' and that will make the font menus respond more quickly | |
| 71 when they are selected for the first time. If you add fonts to your system, | |
| 72 or if you change your font path, you can call this to re-initialize the menus." | |
| 73 (unless mswindows-font-regexp-ascii | |
| 771 | 74 (setq mswindows-font-regexp-ascii "Western")) |
| 398 | 75 (let ((case-fold-search t) |
| 76 family size weight entry | |
| 77 dev-cache cache families sizes weights) | |
| 78 (dolist (name (cond ((null debug) ; debugging kludge | |
| 2527 | 79 (font-list "::::" device)) |
| 398 | 80 ((stringp debug) (split-string debug "\n")) |
| 81 (t debug))) | |
| 82 (when (and (string-match mswindows-font-regexp-ascii name) | |
| 83 (string-match mswindows-font-regexp name)) | |
| 872 | 84 (setq weight (capitalize (car (mswindows-parse-font-style |
| 85 (match-string 2 name)))) | |
| 86 size (string-to-int (match-string 3 name)) | |
| 398 | 87 family (match-string 1 name)) |
| 88 (unless (string-match mswindows-font-menu-junk-families family) | |
| 89 (setq entry (or (vassoc name cache) | |
| 90 (car (setq cache | |
| 91 (cons (vector family nil nil t) | |
| 92 cache))))) | |
| 93 (or (member family families) (push family families)) | |
| 94 (or (member weight weights) (push weight weights)) | |
| 95 (or (member size sizes) (push size sizes)) | |
| 96 (or (member weight (aref entry 1)) (push weight (aref entry 1))) | |
| 97 (or (member size (aref entry 2)) (push size (aref entry 2)))))) | |
| 98 ;; | |
| 99 ;; Hack scalable fonts. | |
| 100 ;; Some fonts come only in scalable versions (the only size is 0) | |
| 101 ;; and some fonts come in both scalable and non-scalable versions | |
| 102 ;; (one size is 0). If there are any scalable fonts at all, make | |
| 103 ;; sure that the union of all point sizes contains at least some | |
| 104 ;; common sizes - it's possible that some sensible sizes might end | |
| 105 ;; up not getting mentioned explicitly. | |
| 106 ;; | |
| 107 (if (member 0 sizes) | |
| 108 (let ((common '(6 8 10 12 14 16 18 24))) | |
| 109 (while common | |
| 110 (or;;(member (car common) sizes) ; not enough slack | |
| 111 (let ((rest sizes) | |
| 112 (done nil)) | |
| 113 (while (and (not done) rest) | |
| 114 (if (and (> (car common) (- (car rest) 1)) | |
| 115 (< (car common) (+ (car rest) 1))) | |
| 116 (setq done t)) | |
| 117 (setq rest (cdr rest))) | |
| 118 done) | |
| 119 (setq sizes (cons (car common) sizes))) | |
| 120 (setq common (cdr common))) | |
| 121 (setq sizes (delq 0 sizes)))) | |
| 122 | |
| 123 (setq families (sort families 'string-lessp) | |
| 124 weights (sort weights 'string-lessp) | |
| 125 sizes (sort sizes '<)) | |
| 126 | |
| 127 (dolist (entry cache) | |
| 128 (aset entry 1 (sort (aref entry 1) 'string-lessp)) | |
| 129 (aset entry 2 (sort (aref entry 2) '<))) | |
| 130 | |
| 131 (setq dev-cache (assq device device-fonts-cache)) | |
| 132 (or dev-cache | |
| 133 (setq dev-cache (car (push (list device) device-fonts-cache)))) | |
| 134 (setcdr | |
| 135 dev-cache | |
| 136 (vector | |
| 137 cache | |
| 138 (mapcar (lambda (x) | |
| 139 (vector x | |
| 140 (list 'font-menu-set-font x nil nil) | |
|
5344
2a54dfbe434f
Don't quote keywords, they've been self-quoting for well over a decade.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4103
diff
changeset
|
141 :style 'radio :active nil :selected nil)) |
| 398 | 142 families) |
| 143 (mapcar (lambda (x) | |
| 144 (vector (int-to-string x) | |
| 145 (list 'font-menu-set-font nil nil x) | |
|
5344
2a54dfbe434f
Don't quote keywords, they've been self-quoting for well over a decade.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4103
diff
changeset
|
146 :style 'radio :active nil :selected nil)) |
| 398 | 147 sizes) |
| 148 (mapcar (lambda (x) | |
| 149 (vector x | |
| 150 (list 'font-menu-set-font nil x nil) | |
|
5344
2a54dfbe434f
Don't quote keywords, they've been self-quoting for well over a decade.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4103
diff
changeset
|
151 :style 'radio :active nil :selected nil)) |
| 398 | 152 weights))) |
| 153 (cdr dev-cache))) | |
| 154 | |
| 155 ;; Extract font information from a face. We examine both the | |
| 156 ;; user-specified font name and the canonical (`true') font name. | |
| 157 ;; These can appear to have totally different properties. | |
| 158 | |
| 159 ;; We use the user-specified one if possible, else use the truename. | |
| 160 ;; If the user didn't specify one get the truename and use the | |
| 161 ;; possibly suboptimal data from that. | |
| 162 ;;;###autoload | |
| 163 (defun* mswindows-font-menu-font-data (face dcache) | |
| 164 (let* ((case-fold-search t) | |
| 165 (domain (if font-menu-this-frame-only-p | |
| 166 (selected-frame) | |
| 167 (selected-device))) | |
| 168 (name (font-instance-name (face-font-instance face domain))) | |
| 169 (truename (font-instance-truename | |
| 170 (face-font-instance face domain | |
| 171 (if (featurep 'mule) 'ascii)))) | |
| 172 family size weight entry slant) | |
| 173 (when (string-match mswindows-font-regexp name) | |
| 174 (setq family (match-string 1 name)) | |
| 175 (setq entry (vassoc family (aref dcache 0)))) | |
| 176 (when (and (null entry) | |
| 177 (string-match mswindows-font-regexp truename)) | |
| 178 (setq family (match-string 1 truename)) | |
| 179 (setq entry (vassoc family (aref dcache 0)))) | |
| 180 (when (null entry) | |
| 181 (return-from mswindows-font-menu-font-data (make-vector 5 nil))) | |
| 182 | |
| 183 (when (string-match mswindows-font-regexp name) | |
| 872 | 184 (setq weight (car (mswindows-parse-font-style (match-string 2 name)))) |
| 185 (setq size (string-to-int (match-string 3 name)))) | |
| 398 | 186 |
| 187 (when (string-match mswindows-font-regexp truename) | |
| 872 | 188 (destructuring-bind (newweight . slant) |
| 189 (mswindows-parse-font-style (match-string 2 truename)) | |
| 190 (when (not (member weight (aref entry 1))) | |
| 191 (setq weight newweight)) | |
| 192 (when (not (member size (aref entry 2))) | |
| 193 (setq size (string-to-int (match-string 3 truename)))))) | |
| 398 | 194 |
| 195 (vector entry family size weight slant))) | |
| 196 | |
| 197 (defun mswindows-font-menu-load-font (family weight size slant resolution) | |
| 198 "Try to load a font with the requested properties. | |
| 199 The weight, slant and resolution are only hints." | |
| 200 (when (integerp size) (setq size (int-to-string size))) | |
| 201 (let (font) | |
| 202 (catch 'got-font | |
| 203 (dolist (weight (list weight "")) | |
| 204 (dolist (slant | |
| 205 ;; oblique is not currently implemented | |
| 872 | 206 (cond ((string-equal slant "Oblique") '("Italic" "")) |
| 207 ((string-equal slant "Italic") '("Italic" "")) | |
| 398 | 208 (t (list slant "")))) |
| 209 (when (setq font | |
| 210 (make-font-instance | |
| 872 | 211 (concat |
| 212 family ":" | |
| 213 (mswindows-construct-font-style weight slant) ":" | |
| 214 size "::") | |
| 398 | 215 nil t)) |
| 216 (throw 'got-font font))))))) | |
| 217 | |
| 218 (provide 'mswindows-font-menu) | |
| 219 | |
| 220 ;;; msw-font-menu.el ends here |
