(frame-notice-user-settings): Use geometry parms from frame
[bpt/emacs.git] / lisp / frame.el
index a43f28e..872a2f4 100644 (file)
@@ -1,6 +1,6 @@
 ;;; frame.el --- multi-frame management independent of window systems.
 
-;;;; Copyright (C) 1993 Free Software Foundation, Inc.
+;;;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 ;; Keywords: internal
@@ -58,7 +58,7 @@ These supersede the values given in `default-frame-alist'.")
 
 (setq pop-up-frame-function
       (function (lambda ()
-                 (new-frame pop-up-frame-alist))))
+                 (make-frame pop-up-frame-alist))))
 
 (defvar special-display-frame-alist 
   '((height . 14) (width . 80) (unsplittable . t))
@@ -82,7 +82,7 @@ These supersede the values given in `default-frame-alist'.")
          (raise-frame frame)
          window)
       ;; If no window yet, make one in a new frame.
-      (let ((frame (new-frame special-display-frame-alist)))
+      (let ((frame (make-frame special-display-frame-alist)))
        (set-window-buffer (frame-selected-window frame) buffer)
        (set-window-dedicated-p (frame-selected-window frame) t)
        (frame-selected-window frame)))))
@@ -112,6 +112,8 @@ These supersede the values given in `default-frame-alist'.")
 ;; Record the parameters used in frame-initialize to make the initial frame.
 (defvar frame-initial-frame-alist)
 
+(defvar frame-initial-geometry-arguments nil)
+
 ;;; startup.el calls this function before loading the user's init
 ;;; file - if there is no frame with a minibuffer open now, create
 ;;; one to display messages while loading the init file.
@@ -130,35 +132,13 @@ These supersede the values given in `default-frame-alist'.")
                    (append initial-frame-alist default-frame-alist))
              (setq default-minibuffer-frame
                    (setq frame-initial-frame
-                         (new-frame initial-frame-alist)))
+                         (make-frame initial-frame-alist)))
              ;; Delete any specifications for window geometry parameters
              ;; so that we won't reapply them in frame-notice-user-settings.
              ;; It would be wrong to reapply them then,
              ;; because that would override explicit user resizing.
              (setq initial-frame-alist
-                   (frame-remove-geometry-params initial-frame-alist))
-             ;; Handle `reverse' as a parameter.
-             (if (cdr (or (assq 'reverse initial-frame-alist)
-                          (assq 'reverse default-frame-alist)
-                          (cons nil
-                                (member (x-get-resource "reverseVideo" "ReverseVideo")
-                                        '("on" "true")))))
-                 (let ((params (frame-parameters frame-initial-frame)))
-                   (modify-frame-parameters
-                    frame-initial-frame
-                    ;; Must set cursor-color after background color.
-                    ;; So put it first.
-                    (list (cons 'cursor-color
-                                (cdr (assq 'background-color params)))
-                          (cons 'foreground-color
-                                (cdr (assq 'background-color params)))
-                          (cons 'background-color
-                                (cdr (assq 'foreground-color params)))
-                          (cons 'mouse-color
-                                (cdr (assq 'background-color params)))
-                          (cons 'border-color
-                                (cdr (assq 'background-color params)))))))))
-
+                   (frame-remove-geometry-params initial-frame-alist))))
        ;; At this point, we know that we have a frame open, so we 
        ;; can delete the terminal frame.
        (delete-frame terminal-frame)
@@ -203,17 +183,32 @@ These supersede the values given in `default-frame-alist'.")
                              '(minibuffer . t)))
                     t))
            ;; Create the new frame.
-           (let ((new
-                  (new-frame
-                   (append initial-frame-alist
-                           default-frame-alist
-                           (frame-parameters frame-initial-frame)))))
-
+           (let* ((parms (append initial-frame-alist
+                                 default-frame-alist
+                                 (frame-parameters frame-initial-frame)
+                                 nil))
+                  new)
+             ;; 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 (delq (assq 'height parms) parms)))
+             (if (assq 'width frame-initial-geometry-arguments)
+                 (setq parms (delq (assq 'width parms) parms)))
+             (if (assq 'left frame-initial-geometry-arguments)
+                 (setq parms (delq (assq 'left parms) parms)))
+             (if (assq 'top frame-initial-geometry-arguments)
+                 (setq parms (delq (assq 'top parms) 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 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))
-                 (new-frame (append minibuffer-frame-alist
+                 (make-frame (append minibuffer-frame-alist
                                     '((minibuffer . only)))))
 
              ;; If the initial frame is serving as a surrogate
@@ -302,7 +297,7 @@ These supersede the values given in `default-frame-alist'.")
 ;;; considered (see next-frame).
 (defun get-other-frame ()
   (let ((s (if (equal (next-frame (selected-frame)) (selected-frame))
-              (new-frame)
+              (make-frame)
             (next-frame (selected-frame)))))
     s))
 
@@ -372,15 +367,19 @@ additional frame parameters that Emacs recognizes for X window frames."
 (defun frame-remove-geometry-params (param-list)
   "Return the parameter list PARAM-LIST, but with geometry specs removed.
 This deletes all bindings in PARAM-LIST for `top', `left', `width',
-and `height' parameters.
+`height', `user-size' and `user-position' parameters.
 Emacs uses this to avoid overriding explicit moves and resizings from
 the user during startup."
   (setq param-list (cons nil param-list))
   (let ((tail param-list))
     (while (consp (cdr tail))
       (if (and (consp (car (cdr tail)))
-              (memq (car (car (cdr tail))) '(height width top left)))
-         (setcdr tail (cdr (cdr tail)))
+              (memq (car (car (cdr tail)))
+                    '(height width top left user-position user-size)))
+         (progn
+           (setq frame-initial-geometry-arguments
+                 (cons (car (cdr tail)) frame-initial-geometry-arguments))
+           (setcdr tail (cdr (cdr tail))))
        (setq tail (cdr tail)))))
   (cdr param-list))
 
@@ -600,7 +599,7 @@ should use `set-frame-width' instead."
 (defalias 'ctl-x-5-prefix ctl-x-5-map)
 (define-key ctl-x-map "5" 'ctl-x-5-prefix)
 
-(define-key ctl-x-5-map "2" 'new-frame)
+(define-key ctl-x-5-map "2" 'make-frame)
 (define-key ctl-x-5-map "0" 'delete-frame)
 (define-key ctl-x-5-map "o" 'other-frame)