comparison lisp/font-menu.el @ 404:2f8bb876ab1d r21-2-32

Import from CVS: tag r21-2-32
author cvs
date Mon, 13 Aug 2007 11:16:07 +0200
parents 74fd4e045ea6
children
comparison
equal deleted inserted replaced
403:9f011ab08d48 404:2f8bb876ab1d
165 165
166 (defvar font-menu-size-scaling 166 (defvar font-menu-size-scaling
167 (make-specifier-and-init 'integer '((global ((mswindows) . 1) 167 (make-specifier-and-init 'integer '((global ((mswindows) . 1)
168 ((x) . 10))) t) 168 ((x) . 10))) t)
169 "Scale factor used in defining font sizes.") 169 "Scale factor used in defining font sizes.")
170
171 (defun vassoc (key valist)
172 "Search VALIST for a vector whose first element is equal to KEY.
173 See also `assoc'."
174 ;; by Stig@hackvan.com
175 (let (el)
176 (catch 'done
177 (while (setq el (pop valist))
178 (and (equal key (aref el 0))
179 (throw 'done el))))))
180 170
181 ;; only call XListFonts (and parse) once per device. 171 ;; only call XListFonts (and parse) once per device.
182 ;; ( (device . [parsed-list-fonts family-menu size-menu weight-menu]) ...) 172 ;; ( (device . [parsed-list-fonts family-menu size-menu weight-menu]) ...)
183 (defvar device-fonts-cache nil) 173 (defvar device-fonts-cache nil)
184 174
205 nil 195 nil
206 (call-device-method 'reset-device-font-menus device device debug) 196 (call-device-method 'reset-device-font-menus device device debug)
207 (message "Getting list of fonts from server... done."))) 197 (message "Getting list of fonts from server... done.")))
208 198
209 (defun font-menu-split-long-menu (menu) 199 (defun font-menu-split-long-menu (menu)
210 "Split MENU according to `font-menu-max-items'." 200 "Split MENU according to `font-menu-max-items' and add accelerator specs."
211 (let ((len (length menu))) 201 (let ((len (length menu)))
212 (if (or (null font-menu-max-items) 202 (if (or (null font-menu-max-items)
213 (null (featurep 'lisp-float-type)) 203 (null (featurep 'lisp-float-type))
214 (<= len font-menu-max-items)) 204 (<= len font-menu-max-items))
215 menu 205 (submenu-generate-accelerator-spec menu)
216 ;; Submenu is max 2 entries longer than menu, never shorter, number of 206 ;; Submenu is max 2 entries longer than menu, never shorter, number of
217 ;; entries in submenus differ by at most one (with longer submenus first) 207 ;; entries in submenus differ by at most one (with longer submenus first)
218 (let* ((outer (floor (sqrt len))) 208 (let* ((outer (floor (sqrt len)))
219 (inner (/ len outer)) 209 (inner (/ len outer))
220 (rest (% len outer)) 210 (rest (% len outer))
229 sub (cons (car menu) sub) 219 sub (cons (car menu) sub)
230 menu (cdr menu))) 220 menu (cdr menu)))
231 (setq result 221 (setq result
232 (cons (cons (if (stringp font-menu-submenu-name-format) 222 (cons (cons (if (stringp font-menu-submenu-name-format)
233 (format font-menu-submenu-name-format 223 (format font-menu-submenu-name-format
234 (aref (car sub) 0) (aref to 0)) 224 (menu-item-strip-accelerator-spec
225 (aref (car sub) 0))
226 (menu-item-strip-accelerator-spec
227 (aref to 0)))
235 (funcall font-menu-submenu-name-format 228 (funcall font-menu-submenu-name-format
236 (aref (car sub) 0) (aref to 0))) 229 (menu-item-strip-accelerator-spec
237 sub) 230 (aref (car sub) 0))
231 (menu-item-strip-accelerator-spec
232 (aref to 0))))
233 (submenu-generate-accelerator-spec sub))
238 result) 234 result)
239 rest (1+ rest)) 235 rest (1+ rest))
240 (if (= rest outer) (setq inner (1+ inner))))) 236 (if (= rest outer) (setq inner (1+ inner)))))
241 result)))) 237 (submenu-generate-accelerator-spec result)))))
242 238
243 ;;;###autoload 239 ;;;###autoload
244 (defun font-menu-family-constructor (ignored) 240 (defun font-menu-family-constructor (ignored)
245 (catch 'menu 241 (catch 'menu
246 (unless (console-on-window-system-p) 242 (unless (console-on-window-system-p)
259 ;; exist in every size). Only the current font is marked as 255 ;; exist in every size). Only the current font is marked as
260 ;; selected. 256 ;; selected.
261 (font-menu-split-long-menu 257 (font-menu-split-long-menu
262 (mapcar 258 (mapcar
263 (lambda (item) 259 (lambda (item)
264 (setq f (aref item 0) 260 (setq f (menu-item-strip-accelerator-spec (aref item 0))
265 entry (vassoc f (aref dcache 0))) 261 entry (vassoc f (aref dcache 0)))
266 (if (and (or (member weight (aref entry 1)) 262 (if (and (or (member weight (aref entry 1))
267 ;; mswindows often allows any weight 263 ;; mswindows often allows any weight
268 (member "" (aref entry 1))) 264 (member "" (aref entry 1)))
269 (or (member size (aref entry 2)) 265 (or (member size (aref entry 2))
307 (disable-menu-item item)) 303 (disable-menu-item item))
308 (if (eq size s) 304 (if (eq size s)
309 (select-toggle-menu-item item) 305 (select-toggle-menu-item item)
310 (deselect-toggle-menu-item item)) 306 (deselect-toggle-menu-item item))
311 item) 307 item)
312 (aref dcache 2))))) 308 (submenu-generate-accelerator-spec (aref dcache 2))))))
313 309
314 ;;;###autoload 310 ;;;###autoload
315 (defun font-menu-weight-constructor (ignored) 311 (defun font-menu-weight-constructor (ignored)
316 (catch 'menu 312 (catch 'menu
317 (unless (console-on-window-system-p) 313 (unless (console-on-window-system-p)
336 (disable-menu-item item)) 332 (disable-menu-item item))
337 (if (string-equal weight w) 333 (if (string-equal weight w)
338 (select-toggle-menu-item item) 334 (select-toggle-menu-item item)
339 (deselect-toggle-menu-item item)) 335 (deselect-toggle-menu-item item))
340 item) 336 item)
341 (aref dcache 3))))) 337 (submenu-generate-accelerator-spec (aref dcache 3))))))
342 338
343 339
344 ;;; Changing font sizes 340 ;;; Changing font sizes
345 341
346 (defun font-menu-set-font (family weight size) 342 (defun font-menu-set-font (family weight size)
349 ;; (size is measured in 10ths of points.) 345 ;; (size is measured in 10ths of points.)
350 (let* ((dcache (device-fonts-cache)) 346 (let* ((dcache (device-fonts-cache))
351 (font-data (font-menu-font-data 'default dcache)) 347 (font-data (font-menu-font-data 'default dcache))
352 (from-family (aref font-data 1)) 348 (from-family (aref font-data 1))
353 (from-size (aref font-data 2)) 349 (from-size (aref font-data 2))
354 (from-weight (aref font-data 3)) 350 (from-weight (aref font-data 3))
355 (from-slant (aref font-data 4)) 351 (from-slant (aref font-data 4))
356 (face-list-to-change (delq 'default (face-list))) 352 (face-list-to-change (delq 'default (face-list)))
357 new-default-face-font 353 new-default-face-font)
358 new-props)
359 (unless from-family 354 (unless from-family
360 (signal 'error '("couldn't parse font name for default face"))) 355 (signal 'error '("couldn't parse font name for default face")))
361 (when weight 356 (when weight
362 (signal 'error '("Setting weight currently not supported"))) 357 (signal 'error '("Setting weight currently not supported")))
363 (setq new-default-face-font 358 (setq new-default-face-font
394 ;;; WMP - we need to honor font-menu-this-frame-only-p here! 389 ;;; WMP - we need to honor font-menu-this-frame-only-p here!
395 (set-face-font 'default new-default-face-font 390 (set-face-font 'default new-default-face-font
396 (and font-menu-this-frame-only-p (selected-frame))) 391 (and font-menu-this-frame-only-p (selected-frame)))
397 ;; OK Let Customize do it. 392 ;; OK Let Customize do it.
398 (custom-set-face-update-spec 'default 393 (custom-set-face-update-spec 'default
399 (list (list 'type (device-type))) 394 (list (list 'type (device-type)))
400 (list :family family 395 (list :family family
401 :size (concat 396 :size (concat
402 (int-to-string 397 (int-to-string
403 (/ (or size from-size) 398 (/ (or size from-size)
404 (specifier-instance font-menu-size-scaling 399 (specifier-instance font-menu-size-scaling
405 (selected-device)))) 400 (selected-device))))
406 "pt"))) 401 "pt")))
407 (message "Font %s" (face-font-name 'default))))) 402 (message "Font %s" (face-font-name 'default)))))
408 403
409 404
410 (defun font-menu-change-face (face 405 (defun font-menu-change-face (face
411 from-family from-weight from-size 406 from-family from-weight from-size