Function: ediff-setup-control-frame
ediff-setup-control-frame is a byte-compiled function defined in
ediff-wind.el.gz.
Signature
(ediff-setup-control-frame CTL-BUFFER DESIGNATED-MINIBUFFER-FRAME)
Source Code
;; Defined in /usr/src/emacs/lisp/vc/ediff-wind.el.gz
;; Prepare or refresh control frame
(defun ediff-setup-control-frame (ctl-buffer designated-minibuffer-frame)
(let ((window-min-height 1)
ctl-frame-iconified-p dont-iconify-ctl-frame deiconify-ctl-frame
ctl-frame old-ctl-frame lines
;; user-grabbed-mouse
fheight fwidth adjusted-parameters)
(with-current-buffer ctl-buffer
(run-hooks 'ediff-before-setup-control-frame-hook))
(setq old-ctl-frame (with-current-buffer ctl-buffer ediff-control-frame))
(with-current-buffer ctl-buffer
(setq ctl-frame (if (frame-live-p old-ctl-frame)
old-ctl-frame
(make-frame ediff-control-frame-parameters))
ediff-control-frame ctl-frame)
;; protect against undefined face-attribute
(condition-case nil
(if (face-attribute 'mode-line :box)
(set-face-attribute 'mode-line ctl-frame :box nil))
(error)))
(setq ctl-frame-iconified-p (ediff-frame-iconified-p ctl-frame))
(select-frame ctl-frame)
(if (window-dedicated-p)
()
(delete-other-windows)
(switch-to-buffer ctl-buffer))
;; must be before ediff-setup-control-buffer
;; just a precaution--we should be in ctl-buffer already
(with-current-buffer ctl-buffer
(make-local-variable 'frame-title-format)
(make-local-variable 'icon-title-format))
(ediff-setup-control-buffer ctl-buffer)
(setq dont-iconify-ctl-frame
(not (string= ediff-help-message ediff-brief-help-message)))
(setq deiconify-ctl-frame
(and (eq this-command 'ediff-toggle-help)
dont-iconify-ctl-frame))
;; 1 more line for the mode line
(setq lines (1+ (count-lines (point-min) (point-max)))
fheight lines
fwidth (max (+ (ediff-help-message-line-length) 2) 0)
adjusted-parameters
(list
;; possibly change surrogate minibuffer
(cons 'minibuffer
(minibuffer-window
designated-minibuffer-frame))
(cons 'width fwidth)
(cons 'height fheight)
(cons 'user-position t)
))
;; adjust autoraise
(setq adjusted-parameters
(cons (if ediff-use-long-help-message
'(auto-raise . nil)
'(auto-raise . t))
adjusted-parameters))
;; As a precaution, we call modify frame parameters twice, in
;; order to make sure that at least once we do it for
;; a non-iconified frame. (It appears that in the Windows port of
;; Emacs, one can't modify frame parameters of iconified frames.)
(if (eq system-type 'windows-nt)
(modify-frame-parameters ctl-frame adjusted-parameters))
(goto-char (point-min))
(modify-frame-parameters ctl-frame adjusted-parameters)
(when (and ediff-floating-control-frame (eq (window-system ctl-frame) 'x))
(ediff-frame-make-utility ctl-frame))
(make-frame-visible ctl-frame)
;; This works around a bug in 19.25 and earlier. There, if frame gets
;; iconified, the current buffer changes to that of the frame that
;; becomes exposed as a result of this iconification.
;; So, we make sure the current buffer doesn't change.
(select-frame ctl-frame)
(ediff-refresh-control-frame)
(cond ((and ediff-prefer-iconified-control-frame
(not ctl-frame-iconified-p) (not dont-iconify-ctl-frame))
(iconify-frame ctl-frame))
((or deiconify-ctl-frame (not ctl-frame-iconified-p))
(raise-frame ctl-frame)))
(set-window-dedicated-p (selected-window) t)
;; Now move the frame. We must do it separately due to an obscure bug in
;; XEmacs
(modify-frame-parameters
ctl-frame
(funcall ediff-control-frame-position-function ctl-buffer fwidth fheight))
;; synchronize so the cursor will move to control frame
;; per RMS suggestion
(if (display-graphic-p)
(let ((count 7))
(sit-for .1)
(while (and (not (frame-visible-p ctl-frame)) (> count 0))
(setq count (1- count))
(sit-for .3))))
(or (ediff-frame-iconified-p ctl-frame)
;; don't warp the mouse, unless ediff-grab-mouse = t
(ediff-reset-mouse ctl-frame
(or (eq this-command 'ediff-quit)
(not (eq ediff-grab-mouse t)))))
(with-current-buffer ctl-buffer
(run-hooks 'ediff-after-setup-control-frame-hook))))