summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerd Moellmann <gerd@gnu.org>2001-01-30 15:06:47 +0000
committerGerd Moellmann <gerd@gnu.org>2001-01-30 15:06:47 +0000
commit08cfe0a9574777f20b569bcfa0a2cb8cbfa78b23 (patch)
treee7b0418f62894bb0254711ea07d6c79015ce2c97
parentf5f058708c218b520523c9e02ffc80be832b6a72 (diff)
downloademacs-08cfe0a9574777f20b569bcfa0a2cb8cbfa78b23.tar.gz
(frame-initialize): Create initial frame visible.
(frame-notice-user-settings): When tool-bar has been switched off, correct the frame size and sync too-bar-mode.
-rw-r--r--lisp/frame.el321
1 files changed, 176 insertions, 145 deletions
diff --git a/lisp/frame.el b/lisp/frame.el
index 93dcb36c124..b7f6492a396 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -181,8 +181,7 @@ Pass it BUFFER as first arg, and (cdr ARGS) gives the rest of the args."
(or (delq terminal-frame (minibuffer-frame-list))
(progn
(setq frame-initial-frame-alist
- (append initial-frame-alist default-frame-alist
- '((visibility . nil)) nil))
+ (append initial-frame-alist default-frame-alist nil))
(or (assq 'horizontal-scroll-bars frame-initial-frame-alist)
(setq frame-initial-frame-alist
(cons '(horizontal-scroll-bars . t)
@@ -233,8 +232,7 @@ React to settings of `default-frame-alist', `initial-frame-alist' there."
;; Make tool-bar-mode and default-frame-alist consistent. Don't do
;; it in batch mode since that would leave a tool-bar-lines
;; parameter in default-frame-alist in a dumped Emacs, which is not
- ;; what we want. For some reason, menu-bar-mode is not bound
- ;; in this case, but tool-bar-mode is.
+ ;; what we want.
(when (and (boundp 'tool-bar-mode)
(not noninteractive))
(let ((default (assq 'tool-bar-lines default-frame-alist)))
@@ -285,150 +283,183 @@ React to settings of `default-frame-alist', `initial-frame-alist' there."
;; If the initial frame is still around, apply initial-frame-alist
;; and default-frame-alist to it.
- (if (frame-live-p frame-initial-frame)
-
- ;; The initial frame we create above always has a minibuffer.
- ;; If the user wants to remove it, or make it a minibuffer-only
- ;; frame, then we'll have to delete the current frame and make a
- ;; new one; you can't remove or add a root window to/from an
- ;; existing frame.
- ;;
- ;; NOTE: default-frame-alist was nil when we created the
- ;; existing frame. We need to explicitly include
- ;; default-frame-alist in the parameters of the screen we
- ;; create here, so that its new value, gleaned from the user's
- ;; .emacs file, will be applied to the existing screen.
- (if (not (eq (cdr (or (assq 'minibuffer initial-frame-alist)
+ (when (frame-live-p frame-initial-frame)
+
+ ;; When tool-bar has been switched off, correct the frame size
+ ;; by the lines added in x-create-frame for the tool-bar and
+ ;; switch `tool-bar-mode' off.
+ (when (or (eq 0 (cdr (assq 'tool-bar-lines initial-frame-alist)))
+ (eq 0 (cdr (assq 'tool-bar-lines default-frame-alist))))
+ (let* ((char-height (frame-char-height frame-initial-frame))
+ (image-height 24)
+ (margin (cond ((and (consp tool-bar-button-margin)
+ (integerp (cdr tool-bar-button-margin))
+ (> tool-bar-button-margin 0))
+ (cdr tool-bar-button-margin))
+ ((and (integerp tool-bar-button-margin)
+ (> tool-bar-button-margin 0))
+ tool-bar-button-margin)
+ (t 0)))
+ (relief (if (and (integerp tool-bar-button-relief)
+ (> tool-bar-button-relief 0))
+ tool-bar-button-relief 3))
+ (lines (/ (+ image-height
+ (* 2 margin)
+ (* 2 relief)
+ (1- char-height))
+ char-height))
+ (height (frame-parameter frame-initial-frame 'height)))
+ (modify-frame-parameters frame-initial-frame
+ (list (cons 'height (- height lines))))
+ (tool-bar-mode -1)))
+
+
+ ;; The initial frame we create above always has a minibuffer.
+ ;; If the user wants to remove it, or make it a minibuffer-only
+ ;; frame, then we'll have to delete the current frame and make a
+ ;; new one; you can't remove or add a root window to/from an
+ ;; existing frame.
+ ;;
+ ;; NOTE: default-frame-alist was nil when we created the
+ ;; existing frame. We need to explicitly include
+ ;; default-frame-alist in the parameters of the screen we
+ ;; create here, so that its new value, gleaned from the user's
+ ;; .emacs file, will be applied to the existing screen.
+ (when (not (eq (cdr (or (assq 'minibuffer initial-frame-alist)
(assq 'minibuffer default-frame-alist)
'(minibuffer . t)))
t))
- ;; Create the new frame.
- (let (parms new)
- ;; If the frame isn't visible yet, wait till it is.
- ;; If the user has to position the window,
- ;; Emacs doesn't know its real position until
- ;; the frame is seen to be visible.
- (while (not (cdr (assq 'visibility
- (frame-parameters frame-initial-frame))))
- (sleep-for 1))
- (setq parms (frame-parameters frame-initial-frame))
- ;; Get rid of `name' unless it was specified explicitly before.
- (or (assq 'name frame-initial-frame-alist)
- (setq parms (delq (assq 'name parms) parms)))
- (setq parms (append initial-frame-alist
- default-frame-alist
- parms
- nil))
- ;; Get rid of `reverse', because that was handled
- ;; when we first made the frame.
- (setq parms (cons '(reverse) (delq (assq 'reverse parms) parms)))
- (if (assq 'height frame-initial-geometry-arguments)
- (setq parms (assq-delete-all 'height parms)))
- (if (assq 'width frame-initial-geometry-arguments)
- (setq parms (assq-delete-all 'width parms)))
- (if (assq 'left frame-initial-geometry-arguments)
- (setq parms (assq-delete-all 'left parms)))
- (if (assq 'top frame-initial-geometry-arguments)
- (setq parms (assq-delete-all 'top parms)))
- (setq new
- (make-frame
- ;; Use the geometry args that created the existing
- ;; frame, rather than the parms we get for it.
- (append frame-initial-geometry-arguments
- '((user-size . t) (user-position . t))
- parms)))
- ;; The initial frame, which we are about to delete, may be
- ;; the only frame with a minibuffer. If it is, create a
- ;; new one.
- (or (delq frame-initial-frame (minibuffer-frame-list))
- (make-initial-minibuffer-frame nil))
-
- ;; If the initial frame is serving as a surrogate
- ;; minibuffer frame for any frames, we need to wean them
- ;; onto a new frame. The default-minibuffer-frame
- ;; variable must be handled similarly.
- (let ((users-of-initial
- (filtered-frame-list
- (function (lambda (frame)
- (and (not (eq frame frame-initial-frame))
- (eq (window-frame
- (minibuffer-window frame))
- frame-initial-frame)))))))
- (if (or users-of-initial
- (eq default-minibuffer-frame frame-initial-frame))
-
- ;; Choose an appropriate frame. Prefer frames which
- ;; are only minibuffers.
- (let* ((new-surrogate
- (car
- (or (filtered-frame-list
- (function
- (lambda (frame)
- (eq (cdr (assq 'minibuffer
- (frame-parameters frame)))
- 'only))))
- (minibuffer-frame-list))))
- (new-minibuffer (minibuffer-window new-surrogate)))
-
- (if (eq default-minibuffer-frame frame-initial-frame)
- (setq default-minibuffer-frame new-surrogate))
-
- ;; Wean the frames using frame-initial-frame as
- ;; their minibuffer frame.
- (mapcar
- (function
- (lambda (frame)
- (modify-frame-parameters
- frame (list (cons 'minibuffer new-minibuffer)))))
- users-of-initial))))
-
- ;; Redirect events enqueued at this frame to the new frame.
- ;; Is this a good idea?
- (redirect-frame-focus frame-initial-frame new)
-
- ;; Finally, get rid of the old frame.
- (delete-frame frame-initial-frame t))
-
- ;; Otherwise, we don't need all that rigamarole; just apply
- ;; the new parameters.
- (let (newparms allparms tail)
- (setq allparms (append initial-frame-alist
- default-frame-alist nil))
- (if (assq 'height frame-initial-geometry-arguments)
- (setq allparms (assq-delete-all 'height allparms)))
- (if (assq 'width frame-initial-geometry-arguments)
- (setq allparms (assq-delete-all 'width allparms)))
- (if (assq 'left frame-initial-geometry-arguments)
- (setq allparms (assq-delete-all 'left allparms)))
- (if (assq 'top frame-initial-geometry-arguments)
- (setq allparms (assq-delete-all 'top allparms)))
- (setq tail allparms)
- ;; Find just the parms that have changed since we first
- ;; made this frame. Those are the ones actually set by
- ;; the init file. For those parms whose values we already knew
- ;; (such as those spec'd by command line options)
- ;; it is undesirable to specify the parm again
- ;; once the user has seen the frame and been able to alter it
- ;; manually.
- (while tail
- (let (newval oldval)
- (setq oldval (assq (car (car tail))
- frame-initial-frame-alist))
- (setq newval (cdr (assq (car (car tail)) allparms)))
- (or (and oldval (eq (cdr oldval) newval))
- (setq newparms
- (cons (cons (car (car tail)) newval) newparms))))
- (setq tail (cdr tail)))
- (setq newparms (nreverse newparms))
- (modify-frame-parameters frame-initial-frame
- newparms)
- ;; If we changed the background color,
- ;; we need to update the background-mode parameter
- ;; and maybe some faces too.
- (when (assq 'background-color newparms)
- (unless (assq 'background-mode newparms)
- (frame-set-background-mode frame-initial-frame))
- (face-set-after-frame-default frame-initial-frame)))))
+ ;; Create the new frame.
+ (let (parms new)
+ ;; If the frame isn't visible yet, wait till it is.
+ ;; If the user has to position the window,
+ ;; Emacs doesn't know its real position until
+ ;; the frame is seen to be visible.
+ (while (not (cdr (assq 'visibility
+ (frame-parameters frame-initial-frame))))
+ (sleep-for 1))
+ (setq parms (frame-parameters frame-initial-frame))
+
+ ;; Get rid of `name' unless it was specified explicitly before.
+ (or (assq 'name frame-initial-frame-alist)
+ (setq parms (delq (assq 'name parms) parms)))
+
+ (setq parms (append initial-frame-alist
+ default-frame-alist
+ parms
+ nil))
+
+ ;; Get rid of `reverse', because that was handled
+ ;; when we first made the frame.
+ (setq parms (cons '(reverse) (delq (assq 'reverse parms) parms)))
+
+ (if (assq 'height frame-initial-geometry-arguments)
+ (setq parms (assq-delete-all 'height parms)))
+ (if (assq 'width frame-initial-geometry-arguments)
+ (setq parms (assq-delete-all 'width parms)))
+ (if (assq 'left frame-initial-geometry-arguments)
+ (setq parms (assq-delete-all 'left parms)))
+ (if (assq 'top frame-initial-geometry-arguments)
+ (setq parms (assq-delete-all 'top parms)))
+ (setq new
+ (make-frame
+ ;; Use the geometry args that created the existing
+ ;; frame, rather than the parms we get for it.
+ (append frame-initial-geometry-arguments
+ '((user-size . t) (user-position . t))
+ parms)))
+ ;; The initial frame, which we are about to delete, may be
+ ;; the only frame with a minibuffer. If it is, create a
+ ;; new one.
+ (or (delq frame-initial-frame (minibuffer-frame-list))
+ (make-initial-minibuffer-frame nil))
+
+ ;; If the initial frame is serving as a surrogate
+ ;; minibuffer frame for any frames, we need to wean them
+ ;; onto a new frame. The default-minibuffer-frame
+ ;; variable must be handled similarly.
+ (let ((users-of-initial
+ (filtered-frame-list
+ (function (lambda (frame)
+ (and (not (eq frame frame-initial-frame))
+ (eq (window-frame
+ (minibuffer-window frame))
+ frame-initial-frame)))))))
+ (if (or users-of-initial
+ (eq default-minibuffer-frame frame-initial-frame))
+
+ ;; Choose an appropriate frame. Prefer frames which
+ ;; are only minibuffers.
+ (let* ((new-surrogate
+ (car
+ (or (filtered-frame-list
+ (function
+ (lambda (frame)
+ (eq (cdr (assq 'minibuffer
+ (frame-parameters frame)))
+ 'only))))
+ (minibuffer-frame-list))))
+ (new-minibuffer (minibuffer-window new-surrogate)))
+
+ (if (eq default-minibuffer-frame frame-initial-frame)
+ (setq default-minibuffer-frame new-surrogate))
+
+ ;; Wean the frames using frame-initial-frame as
+ ;; their minibuffer frame.
+ (mapcar
+ (function
+ (lambda (frame)
+ (modify-frame-parameters
+ frame (list (cons 'minibuffer new-minibuffer)))))
+ users-of-initial))))
+
+ ;; Redirect events enqueued at this frame to the new frame.
+ ;; Is this a good idea?
+ (redirect-frame-focus frame-initial-frame new)
+
+ ;; Finally, get rid of the old frame.
+ (delete-frame frame-initial-frame t))
+
+ ;; Otherwise, we don't need all that rigamarole; just apply
+ ;; the new parameters.
+ (let (newparms allparms tail)
+ (setq allparms (append initial-frame-alist
+ default-frame-alist nil))
+ (if (assq 'height frame-initial-geometry-arguments)
+ (setq allparms (assq-delete-all 'height allparms)))
+ (if (assq 'width frame-initial-geometry-arguments)
+ (setq allparms (assq-delete-all 'width allparms)))
+ (if (assq 'left frame-initial-geometry-arguments)
+ (setq allparms (assq-delete-all 'left allparms)))
+ (if (assq 'top frame-initial-geometry-arguments)
+ (setq allparms (assq-delete-all 'top allparms)))
+ (setq tail allparms)
+ ;; Find just the parms that have changed since we first
+ ;; made this frame. Those are the ones actually set by
+ ;; the init file. For those parms whose values we already knew
+ ;; (such as those spec'd by command line options)
+ ;; it is undesirable to specify the parm again
+ ;; once the user has seen the frame and been able to alter it
+ ;; manually.
+ (while tail
+ (let (newval oldval)
+ (setq oldval (assq (car (car tail))
+ frame-initial-frame-alist))
+ (setq newval (cdr (assq (car (car tail)) allparms)))
+ (or (and oldval (eq (cdr oldval) newval))
+ (setq newparms
+ (cons (cons (car (car tail)) newval) newparms))))
+ (setq tail (cdr tail)))
+ (setq newparms (nreverse newparms))
+ (modify-frame-parameters frame-initial-frame
+ newparms)
+ ;; If we changed the background color,
+ ;; we need to update the background-mode parameter
+ ;; and maybe some faces too.
+ (when (assq 'background-color newparms)
+ (unless (assq 'background-mode newparms)
+ (frame-set-background-mode frame-initial-frame))
+ (face-set-after-frame-default frame-initial-frame)))))
;; Restore the original buffer.
(set-buffer old-buffer)