Function: make-frame
make-frame is an interactive and byte-compiled function defined in
frame.el.gz.
Signature
(make-frame &optional PARAMETERS)
Documentation
Return a newly created frame displaying the current buffer.
Optional argument PARAMETERS is an alist of frame parameters for the new frame. Each element of PARAMETERS should have the form (NAME . VALUE), for example:
(name . STRING) The frame should be named STRING.
(width . NUMBER) The frame should be NUMBER characters in width.
(height . NUMBER) The frame should be NUMBER text lines high.
(minibuffer . t) The frame should have a minibuffer.
(minibuffer . nil) The frame should have no minibuffer.
(minibuffer . only) The frame should contain only a minibuffer.
(minibuffer . WINDOW) The frame should use WINDOW as its minibuffer window.
(window-system . nil) The frame should be displayed on a terminal device.
(window-system . x) The frame should be displayed in an X window.
(display . ":0") The frame should appear on display :0.
(terminal . TERMINAL) The frame should use the terminal object TERMINAL.
In addition, any parameter specified in default-frame-alist,
but not present in PARAMETERS, is applied.
Before creating the frame (via frame-creation-function), this
function runs the hook before-make-frame-hook. After creating
the frame, it runs the hook after-make-frame-functions with one
argument, the newly created frame.
If a display parameter is supplied and a window-system is not, guess the window-system from the display.
On graphical displays, this function does not itself make the new frame the selected frame. However, the window system may select the new frame according to its own rules.
Probably introduced at or before Emacs version 19.20.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/frame.el.gz
(defun make-frame (&optional parameters)
"Return a newly created frame displaying the current buffer.
Optional argument PARAMETERS is an alist of frame parameters for
the new frame. Each element of PARAMETERS should have the
form (NAME . VALUE), for example:
(name . STRING) The frame should be named STRING.
(width . NUMBER) The frame should be NUMBER characters in width.
(height . NUMBER) The frame should be NUMBER text lines high.
(minibuffer . t) The frame should have a minibuffer.
(minibuffer . nil) The frame should have no minibuffer.
(minibuffer . only) The frame should contain only a minibuffer.
(minibuffer . WINDOW) The frame should use WINDOW as its minibuffer window.
(window-system . nil) The frame should be displayed on a terminal device.
(window-system . x) The frame should be displayed in an X window.
(display . \":0\") The frame should appear on display :0.
(terminal . TERMINAL) The frame should use the terminal object TERMINAL.
In addition, any parameter specified in `default-frame-alist',
but not present in PARAMETERS, is applied.
Before creating the frame (via `frame-creation-function'), this
function runs the hook `before-make-frame-hook'. After creating
the frame, it runs the hook `after-make-frame-functions' with one
argument, the newly created frame.
If a display parameter is supplied and a window-system is not,
guess the window-system from the display.
On graphical displays, this function does not itself make the new
frame the selected frame. However, the window system may select
the new frame according to its own rules."
(interactive)
(let* ((display (cdr (assq 'display parameters)))
(w (cond
((assq 'terminal parameters)
(let ((type (terminal-live-p
(cdr (assq 'terminal parameters)))))
(cond
((eq t type) nil)
((null type) (error "Terminal %s does not exist"
(cdr (assq 'terminal parameters))))
(t type))))
((assq 'window-system parameters)
(cdr (assq 'window-system parameters)))
(display
(or (window-system-for-display display)
(error "Don't know how to interpret display %S"
display)))
(t window-system)))
(oldframe (selected-frame))
(params parameters)
frame child-frame)
(unless (get w 'window-system-initialized)
(let ((window-system w)) ;Hack attack!
(window-system-initialization display))
(setq x-display-name display)
(put w 'window-system-initialized t))
;; Add parameters from `window-system-default-frame-alist'.
(dolist (p (cdr (assq w window-system-default-frame-alist)))
(unless (assq (car p) params)
(push p params)))
;; Add parameters from `default-frame-alist'.
(dolist (p default-frame-alist)
(unless (assq (car p) params)
(push p params)))
;; (setq frame-size-history '(1000))
(when (eq (cdr (or (assq 'minibuffer params) '(minibuffer . t)))
'child-frame)
;; If the 'minibuffer' parameter equals 'child-frame' make a
;; frame without minibuffer first using the root window of
;; 'default-minibuffer-frame' as its minibuffer window
(setq child-frame t)
(setq params (cons '(minibuffer)
(delq (assq 'minibuffer params) params))))
;; Now make the frame.
(run-hooks 'before-make-frame-hook)
(setq frame (let ((window-system w)) ; Hack attack!
(frame-creation-function params)))
(when child-frame
;; When we want to equip the new frame with a minibuffer-only
;; child frame, make that frame and reparent it immediately.
(setq child-frame
(make-frame
(append
`((display . ,display) (minibuffer . only)
(parent-frame . ,frame))
minibuffer-frame-alist)))
(when (frame-live-p child-frame)
;; Have the 'minibuffer' parameter of our new frame refer to
;; its child frame's root window.
(set-frame-parameter
frame 'minibuffer (frame-root-window child-frame))))
(normal-erase-is-backspace-setup-frame frame)
;; Inherit original frame's parameters unless they are overridden
;; by explicit parameters.
(dolist (param frame-inherited-parameters)
(unless (assq param parameters)
(let ((val (frame-parameter oldframe param)))
(when val (set-frame-parameter frame param val)))))
;; We can run `window-configuration-change-hook' for this frame now.
(frame-after-make-frame frame t)
(run-hook-with-args 'after-make-frame-functions frame)
frame))