changeset 35735:e20f7bc75418

(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.
author Gerd Moellmann <gerd@gnu.org>
date Tue, 30 Jan 2001 15:06:47 +0000
parents 8c0eef9f8f5c
children b0dd419f0534
files lisp/frame.el
diffstat 1 files changed, 168 insertions(+), 137 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/frame.el	Tue Jan 30 15:05:45 2001 +0000
+++ b/lisp/frame.el	Tue Jan 30 15:06:47 2001 +0000
@@ -181,8 +181,7 @@
 	(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 @@
   ;; 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 @@
 
     ;; If the initial frame is still around, apply initial-frame-alist
     ;; and default-frame-alist to it.
-    (if (frame-live-p frame-initial-frame)
+    (when (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 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))
+	;; 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 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))
+	  (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)))
+		;; 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))
+		  (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))))
+		  ;; 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)
+	  ;; 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))
+	  ;; 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)))))
+	;; 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)