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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
1 ;; msw-font-menu.el --- Managing menus of mswindows fonts.
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
2
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
3 ;; Copyright (C) 1999 Free Software Foundation, Inc.
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
4 ;; Copyright (C) 2002 Ben Wing.
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
5
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
6 ;; Adapted from x-font-menu.el by Andy Piper <andy@xemacs.org>
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
7
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
8 ;; This file is part of XEmacs.
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
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
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
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
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
19
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
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
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
22
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
23 ;;; Known Problems:
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
24 ;;; ===============
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
25 ;;; There is knowledge here about the regexp match numbers in
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
26 ;;; `mswindows-font-regexp' and `mswindows-font-regexp-foundry-and-family' defined in
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
27 ;;; mswindows-faces.el.
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
28 ;;;
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
29
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
30 ;;; mswindows fonts look like:
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
31 ;;; fontname[:[weight][ style][:pointsize[:effects]]][:charset]
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
32 ;;; ie:
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
33 ;;; Lucida Console:Regular:10
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
34 ;;; minimal:
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
35 ;;; Courier New
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
36 ;;; maximal:
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
37 ;;; Courier New:Bold Italic:10:underline strikeout:western
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
38
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
39 ;;; Code:
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
40
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
41 ;; #### - implement these...
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
42 ;;
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
43 ;;; (defvar font-menu-ignore-proportional-fonts nil
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
44 ;;; "*If non-nil, then the font menu will only show fixed-width fonts.")
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
45
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
46 (require 'font-menu)
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 771
diff changeset
47 (globally-declare-boundp 'mswindows-font-regexp)
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
48
4103
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 2527
diff changeset
49 (globally-declare-fboundp
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 2527
diff changeset
50 '(mswindows-parse-font-style
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 2527
diff changeset
51 mswindows-construct-font-style))
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 2527
diff changeset
52
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
53 (defvar mswindows-font-menu-junk-families
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 398
diff changeset
54 (mapconcat
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 398
diff changeset
55 #'identity
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 398
diff changeset
56 '("Symbol"
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 398
diff changeset
57 )
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 398
diff changeset
58 "\\|")
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
59 "A regexp matching font families which are uninteresting (e.g. cursor fonts).")
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
60
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
61 (defvar mswindows-font-regexp-ascii nil
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
62 "This is used to filter out font families that can't display ASCII text.
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
63 It must be set at run-time.")
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
64
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
65 ;;;###autoload
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
66 (defun mswindows-reset-device-font-menus (device &optional debug)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
67 "Generates the `Font', `Size', and `Weight' submenus for the Options menu.
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
68 This is run the first time that a font-menu is needed for each device.
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
69 If you don't like the lazy invocation of this function, you can add it to
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
70 `create-device-hook' and that will make the font menus respond more quickly
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
71 when they are selected for the first time. If you add fonts to your system,
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
72 or if you change your font path, you can call this to re-initialize the menus."
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
73 (unless mswindows-font-regexp-ascii
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 502
diff changeset
74 (setq mswindows-font-regexp-ascii "Western"))
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
75 (let ((case-fold-search t)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
76 family size weight entry
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
77 dev-cache cache families sizes weights)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
78 (dolist (name (cond ((null debug) ; debugging kludge
2527
491f8cf78a9c [xemacs-hg @ 2005-01-28 02:58:38 by ben]
ben
parents: 872
diff changeset
79 (font-list "::::" device))
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
80 ((stringp debug) (split-string debug "\n"))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
81 (t debug)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
82 (when (and (string-match mswindows-font-regexp-ascii name)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
83 (string-match mswindows-font-regexp name))
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
84 (setq weight (capitalize (car (mswindows-parse-font-style
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
85 (match-string 2 name))))
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
86 size (string-to-int (match-string 3 name))
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
87 family (match-string 1 name))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
88 (unless (string-match mswindows-font-menu-junk-families family)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
89 (setq entry (or (vassoc name cache)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
90 (car (setq cache
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
91 (cons (vector family nil nil t)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
92 cache)))))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
93 (or (member family families) (push family families))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
94 (or (member weight weights) (push weight weights))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
95 (or (member size sizes) (push size sizes))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
96 (or (member weight (aref entry 1)) (push weight (aref entry 1)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
97 (or (member size (aref entry 2)) (push size (aref entry 2))))))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
98 ;;
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
99 ;; Hack scalable fonts.
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
100 ;; Some fonts come only in scalable versions (the only size is 0)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
101 ;; and some fonts come in both scalable and non-scalable versions
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
102 ;; (one size is 0). If there are any scalable fonts at all, make
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
103 ;; sure that the union of all point sizes contains at least some
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
104 ;; common sizes - it's possible that some sensible sizes might end
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
105 ;; up not getting mentioned explicitly.
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
106 ;;
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
107 (if (member 0 sizes)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
108 (let ((common '(6 8 10 12 14 16 18 24)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
109 (while common
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
110 (or;;(member (car common) sizes) ; not enough slack
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
111 (let ((rest sizes)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
112 (done nil))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
113 (while (and (not done) rest)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
114 (if (and (> (car common) (- (car rest) 1))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
115 (< (car common) (+ (car rest) 1)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
116 (setq done t))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
117 (setq rest (cdr rest)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
118 done)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
119 (setq sizes (cons (car common) sizes)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
120 (setq common (cdr common)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
121 (setq sizes (delq 0 sizes))))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
122
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
123 (setq families (sort families 'string-lessp)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
124 weights (sort weights 'string-lessp)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
125 sizes (sort sizes '<))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
126
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
127 (dolist (entry cache)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
128 (aset entry 1 (sort (aref entry 1) 'string-lessp))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
129 (aset entry 2 (sort (aref entry 2) '<)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
130
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
131 (setq dev-cache (assq device device-fonts-cache))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
132 (or dev-cache
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
133 (setq dev-cache (car (push (list device) device-fonts-cache))))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
134 (setcdr
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
135 dev-cache
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
136 (vector
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
137 cache
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
138 (mapcar (lambda (x)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
139 (vector x
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
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
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
142 families)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
143 (mapcar (lambda (x)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
144 (vector (int-to-string x)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
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
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
147 sizes)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
148 (mapcar (lambda (x)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
149 (vector x
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
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
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
152 weights)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
153 (cdr dev-cache)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
154
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
155 ;; Extract font information from a face. We examine both the
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
156 ;; user-specified font name and the canonical (`true') font name.
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
157 ;; These can appear to have totally different properties.
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
158
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
159 ;; We use the user-specified one if possible, else use the truename.
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
160 ;; If the user didn't specify one get the truename and use the
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
161 ;; possibly suboptimal data from that.
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
162 ;;;###autoload
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
163 (defun* mswindows-font-menu-font-data (face dcache)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
164 (let* ((case-fold-search t)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
165 (domain (if font-menu-this-frame-only-p
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
166 (selected-frame)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
167 (selected-device)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
168 (name (font-instance-name (face-font-instance face domain)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
169 (truename (font-instance-truename
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
170 (face-font-instance face domain
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
171 (if (featurep 'mule) 'ascii))))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
172 family size weight entry slant)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
173 (when (string-match mswindows-font-regexp name)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
174 (setq family (match-string 1 name))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
175 (setq entry (vassoc family (aref dcache 0))))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
176 (when (and (null entry)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
177 (string-match mswindows-font-regexp truename))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
178 (setq family (match-string 1 truename))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
179 (setq entry (vassoc family (aref dcache 0))))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
180 (when (null entry)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
181 (return-from mswindows-font-menu-font-data (make-vector 5 nil)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
182
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
183 (when (string-match mswindows-font-regexp name)
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
184 (setq weight (car (mswindows-parse-font-style (match-string 2 name))))
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
185 (setq size (string-to-int (match-string 3 name))))
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
186
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
187 (when (string-match mswindows-font-regexp truename)
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
188 (destructuring-bind (newweight . slant)
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
189 (mswindows-parse-font-style (match-string 2 truename))
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
190 (when (not (member weight (aref entry 1)))
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
191 (setq weight newweight))
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
192 (when (not (member size (aref entry 2)))
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
193 (setq size (string-to-int (match-string 3 truename))))))
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
194
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
195 (vector entry family size weight slant)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
196
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
197 (defun mswindows-font-menu-load-font (family weight size slant resolution)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
198 "Try to load a font with the requested properties.
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
199 The weight, slant and resolution are only hints."
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
200 (when (integerp size) (setq size (int-to-string size)))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
201 (let (font)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
202 (catch 'got-font
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
203 (dolist (weight (list weight ""))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
204 (dolist (slant
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
205 ;; oblique is not currently implemented
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
206 (cond ((string-equal slant "Oblique") '("Italic" ""))
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
207 ((string-equal slant "Italic") '("Italic" ""))
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
208 (t (list slant ""))))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
209 (when (setq font
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
210 (make-font-instance
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
211 (concat
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
212 family ":"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
213 (mswindows-construct-font-style weight slant) ":"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 793
diff changeset
214 size "::")
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
215 nil t))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
216 (throw 'got-font font)))))))
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
217
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
218 (provide 'mswindows-font-menu)
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
219
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents:
diff changeset
220 ;;; msw-font-menu.el ends here