;;; frame.el --- multi-frame management independent of window systems
-;; Copyright (C) 1993-1994, 1996-1997, 2000-2011
+;; Copyright (C) 1993-1994, 1996-1997, 2000-2012
;; Free Software Foundation, Inc.
;; Maintainer: FSF
;;; Commentary:
;;; Code:
-(eval-when-compile (require 'cl))
-
(defvar frame-creation-function-alist
(list (cons nil
(if (fboundp 'tty-create-frame-with-faces)
as its argument.")
(defvar window-system-default-frame-alist nil
- "Alist of window-system dependent default frame parameters.
-Parameters specified here supersede the values given in
+ "Window-system dependent default frame parameters.
+The value should be an alist of elements (WINDOW-SYSTEM . ALIST),
+where WINDOW-SYSTEM is a window system symbol (see `window-system')
+and ALIST is a frame parameter alist like `default-frame-alist'.
+Then, for frames on WINDOW-SYSTEM, any parameters specified in
+ALIST supersede the corresponding parameters specified in
`default-frame-alist'.")
;; The initial value given here used to ask for a minibuffer.
;; Finally, get rid of the old frame.
(delete-frame frame-initial-frame t))
- ;; Otherwise, we don't need all that rigamarole; just apply
+ ;; Otherwise, we don't need all that rigmarole; just apply
;; the new parameters.
(let (newparms allparms tail)
(setq allparms (append initial-frame-alist
(pattern &optional face frame maximum width))
(define-obsolete-function-alias 'set-default-font 'set-frame-font "23.1")
-(defun set-frame-font (font-name &optional keep-size)
- "Set the font of the selected frame to FONT-NAME.
-When called interactively, prompt for the name of the font to use.
-To get the frame's current default font, use `frame-parameters'.
-
-The default behavior is to keep the numbers of lines and columns in
-the frame, thus may change its pixel size. If optional KEEP-SIZE is
-non-nil (interactively, prefix argument) the current frame size (in
-pixels) is kept by adjusting the numbers of the lines and columns."
+
+(defun set-frame-font (font &optional keep-size frames)
+ "Set the default font to FONT.
+When called interactively, prompt for the name of a font, and use
+that font on the selected frame. When called from Lisp, FONT
+should be a font name (a string), a font object, font entity, or
+font spec.
+
+If KEEP-SIZE is nil, keep the number of frame lines and columns
+fixed. If KEEP-SIZE is non-nil (or with a prefix argument), try
+to keep the current frame size fixed (in pixels) by adjusting the
+number of lines and columns.
+
+If FRAMES is nil, apply the font to the selected frame only.
+If FRAMES is non-nil, it should be a list of frames to act upon,
+or t meaning all graphical frames. Also, if FRAME is non-nil,
+alter the user's Customization settings as though the
+font-related attributes of the `default' face had been \"set in
+this session\", so that the font is applied to future frames."
(interactive
(let* ((completion-ignore-case t)
(font (completing-read "Font name: "
(x-list-fonts "*" nil (selected-frame))
nil nil nil nil
(frame-parameter nil 'font))))
- (list font current-prefix-arg)))
- (let (fht fwd)
- (if keep-size
- (setq fht (* (frame-parameter nil 'height) (frame-char-height))
- fwd (* (frame-parameter nil 'width) (frame-char-width))))
- (modify-frame-parameters (selected-frame)
- (list (cons 'font font-name)))
- (if keep-size
- (modify-frame-parameters
- (selected-frame)
- (list (cons 'height (round fht (frame-char-height)))
- (cons 'width (round fwd (frame-char-width)))))))
- (run-hooks 'after-setting-font-hook 'after-setting-font-hooks))
+ (list font current-prefix-arg nil)))
+ (when (or (stringp font) (fontp font))
+ (let* ((this-frame (selected-frame))
+ ;; FRAMES nil means affect the selected frame.
+ (frame-list (cond ((null frames)
+ (list this-frame))
+ ((eq frames t)
+ (frame-list))
+ (t frames)))
+ height width)
+ (dolist (f frame-list)
+ (when (display-multi-font-p f)
+ (if keep-size
+ (setq height (* (frame-parameter f 'height)
+ (frame-char-height f))
+ width (* (frame-parameter f 'width)
+ (frame-char-width f))))
+ ;; When set-face-attribute is called for :font, Emacs
+ ;; guesses the best font according to other face attributes
+ ;; (:width, :weight, etc.) so reset them too (Bug#2476).
+ (set-face-attribute 'default f
+ :width 'normal :weight 'normal
+ :slant 'normal :font font)
+ (if keep-size
+ (modify-frame-parameters
+ f
+ (list (cons 'height (round height (frame-char-height f)))
+ (cons 'width (round width (frame-char-width f))))))))
+ (when frames
+ ;; Alter the user's Custom setting of the `default' face, but
+ ;; only for font-related attributes.
+ (let ((specs (cadr (assq 'user (get 'default 'theme-face))))
+ (attrs '(:family :foundry :slant :weight :height :width))
+ (new-specs nil))
+ (if (null specs) (setq specs '((t nil))))
+ (dolist (spec specs)
+ ;; Each SPEC has the form (DISPLAY ATTRIBUTE-PLIST)
+ (let ((display (nth 0 spec))
+ (plist (copy-tree (nth 1 spec))))
+ ;; Alter only DISPLAY conditions matching this frame.
+ (when (or (memq display '(t default))
+ (face-spec-set-match-display display this-frame))
+ (dolist (attr attrs)
+ (setq plist (plist-put plist attr
+ (face-attribute 'default attr)))))
+ (push (list display plist) new-specs)))
+ (setq new-specs (nreverse new-specs))
+ (put 'default 'customized-face new-specs)
+ (custom-push-theme 'theme-face 'default 'user 'set new-specs)
+ (put 'default 'face-modified nil))))
+ (run-hooks 'after-setting-font-hook 'after-setting-font-hooks)))
(defun set-frame-parameter (frame parameter value)
"Set frame parameter PARAMETER to VALUE on FRAME.
(defun set-cursor-color (color-name)
"Set the text cursor color of the selected frame to COLOR-NAME.
When called interactively, prompt for the name of the color to use.
-To get the frame's current cursor color, use `frame-parameters'."
+This works by setting the `cursor-color' frame parameter on the
+selected frame.
+
+You can also set the text cursor color, for all frames, by
+customizing the `cursor' face."
(interactive (list (read-color "Cursor color: ")))
(modify-frame-parameters (selected-frame)
(list (cons 'cursor-color color-name))))
(defun set-frame-name (name)
"Set the name of the selected frame to NAME.
When called interactively, prompt for the name of the frame.
-The frame name is displayed on the modeline if the terminal displays only
-one frame, otherwise the name is displayed on the frame's caption bar."
+On text terminals, the frame name is displayed on the mode line.
+On graphical displays, it is displayed on the frame's title bar."
(interactive "sFrame name: ")
(modify-frame-parameters (selected-frame)
(list (cons 'name name))))
'delete-frame-functions "22.1")
\f
-;; Highlighting trailing whitespace.
-
-(make-variable-buffer-local 'show-trailing-whitespace)
-
-\f
-;; Scrolling
-
-(defgroup scrolling nil
- "Scrolling windows."
- :version "21.1"
- :group 'frames)
-
-(defvaralias 'automatic-hscrolling 'auto-hscroll-mode)
-
-\f
;; Blinking cursor
(defgroup cursor nil
(cancel-timer blink-cursor-timer)
(setq blink-cursor-timer nil)))
+(define-obsolete-variable-alias 'blink-cursor 'blink-cursor-mode "22.1")
+
(define-minor-mode blink-cursor-mode
"Toggle cursor blinking (Blink Cursor mode).
With a prefix argument ARG, enable Blink Cursor mode if ARG is
blink-cursor-delay
'blink-cursor-start))))
-(define-obsolete-variable-alias 'blink-cursor 'blink-cursor-mode "22.1")
-
\f
;;;; Key bindings
(define-key ctl-x-5-map "0" 'delete-frame)
(define-key ctl-x-5-map "o" 'other-frame)
+\f
+;; Misc.
+
+;; Only marked as obsolete in 24.3.
+(define-obsolete-variable-alias 'automatic-hscrolling
+ 'auto-hscroll-mode "22.1")
+
+(make-variable-buffer-local 'show-trailing-whitespace)
+
(provide 'frame)
;;; frame.el ends here