lisp/cedet/semantic/db-typecache.el (semanticdb-typecache)
[bpt/emacs.git] / lisp / frame.el
index ddd4aea..35cbbfb 100644 (file)
@@ -1,7 +1,7 @@
 ;;; frame.el --- multi-frame management independent of window systems
 
 ;; Copyright (C) 1993, 1994, 1996, 1997, 2000, 2001, 2002, 2003,
-;;   2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;;   2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 ;; Keywords: internal
@@ -38,33 +38,39 @@ as its argument.")
 
 (defvar window-system-default-frame-alist nil
   "Alist of window-system dependent default frame parameters.
-You can set this in your `.emacs' file; for example,
+You can set this in your init file; for example,
 
   ;; Disable menubar and toolbar on the console, but enable them under X.
   (setq window-system-default-frame-alist
-          '((x (menu-bar-lines . 1) (tool-bar-lines . 1))
-            (nil (menu-bar-lines . 0) (tool-bar-lines . 0))))
+ ;; Disable menubar and toolbar on the console, but enable them under X.
+ (setq window-system-default-frame-alist
+       '((x (menu-bar-lines . 1) (tool-bar-lines . 1))
+         (nil (menu-bar-lines . 0) (tool-bar-lines . 0))))
 
-Parameters specified here supersede the values given in `default-frame-alist'.")
+Parameters specified here supersede the values given in
+`default-frame-alist'.")
 
 ;; The initial value given here used to ask for a minibuffer.
 ;; But that's not necessary, because the default is to have one.
 ;; By not specifying it here, we let an X resource specify it.
 (defcustom initial-frame-alist nil
-  "Alist of frame parameters for creating the initial X window frame.
-You can set this in your `.emacs' file; for example,
- (setq initial-frame-alist '((top . 1) (left . 1) (width . 80) (height . 55)))
-Parameters specified here supersede the values given in `default-frame-alist'.
-
-If the value calls for a frame without a minibuffer, and you have not created
-a minibuffer frame on your own, one is created according to
-`minibuffer-frame-alist'.
-
-You can specify geometry-related options for just the initial frame
-by setting this variable in your `.emacs' file; however, they won't
-take effect until Emacs reads `.emacs', which happens after first creating
-the frame.  If you want the frame to have the proper geometry as soon
-as it appears, you need to use this three-step process:
+  "Alist of parameters for the initial X window frame.
+You can set this in your init file; for example,
+
+ (setq initial-frame-alist
+       '((top . 1) (left . 1) (width . 80) (height . 55)))
+
+Parameters specified here supersede the values given in
+`default-frame-alist'.
+
+If the value calls for a frame without a minibuffer, and you have
+not created a minibuffer frame on your own, a minibuffer frame is
+created according to `minibuffer-frame-alist'.
+
+You can specify geometry-related options for just the initial
+frame by setting this variable in your init file; however, they
+won't take effect until Emacs reads your init file, which happens
+after creating the initial frame.  If you want the initial frame
+to have the proper geometry as soon as it appears, you need to
+use this three-step process:
 * Specify X resources to give the geometry you want.
 * Set `default-frame-alist' to override these options so that they
   don't affect subsequent frames.
@@ -76,24 +82,38 @@ as it appears, you need to use this three-step process:
   :group 'frames)
 
 (defcustom minibuffer-frame-alist '((width . 80) (height . 2))
-  "Alist of frame parameters for initially creating a minibuffer frame.
-You can set this in your `.emacs' file; for example,
+  "Alist of parameters for the initial minibuffer frame.
+This is the minibuffer frame created if `initial-frame-alist'
+calls for a frame without a minibuffer.  The parameters specified
+here supersede those given in `default-frame-alist', for the
+initial minibuffer frame.
+
+You can set this in your init file; for example,
+
  (setq minibuffer-frame-alist
-   '((top . 1) (left . 1) (width . 80) (height . 2)))
-Parameters specified here supersede the values given in
-`default-frame-alist', for a minibuffer frame."
+       '((top . 1) (left . 1) (width . 80) (height . 2)))
+
+It is not necessary to include (minibuffer . only); that is
+appended when the minibuffer frame is created."
   :type '(repeat (cons :format "%v"
                       (symbol :tag "Parameter")
                       (sexp :tag "Value")))
   :group 'frames)
 
 (defcustom pop-up-frame-alist nil
-  "Alist of frame parameters used when creating pop-up frames.
-Pop-up frames are used for completions, help, and the like.
-This variable can be set in your init file, like this:
+  "Alist of parameters for automatically generated new frames.
+You can set this in your init file; for example,
+
   (setq pop-up-frame-alist '((width . 80) (height . 20)))
-These supersede the values given in `default-frame-alist',
-for pop-up frames."
+
+If non-nil, the value you specify here is used by the default
+`pop-up-frame-function' for the creation of new frames.
+
+Since `pop-up-frame-function' is used by `display-buffer' for
+making new frames, any value specified here by default affects
+the automatic generation of new frames via `display-buffer' and
+all functions based on it.  The behavior of `make-frame' is not
+affected by this variable."
   :type '(repeat (cons :format "%v"
                       (symbol :tag "Parameter")
                       (sexp :tag "Value")))
@@ -101,19 +121,24 @@ for pop-up frames."
 
 (defcustom pop-up-frame-function
   (lambda () (make-frame pop-up-frame-alist))
-  "Function to call to handle automatic new frame creation.
-It is called with no arguments and should return a newly created frame."
-  :type '(choice (const nil) (function :tag "function"))
+  "Function used by `display-buffer' for creating a new frame.
+This function is called with no arguments and should return a new
+frame.  The default value calls `make-frame' with the argument
+`pop-up-frame-alist'."
+  :type 'function
   :group 'frames)
 
 (defcustom special-display-frame-alist
   '((height . 14) (width . 80) (unsplittable . t))
-  "Alist of frame parameters used when creating special frames.
-Special frames are used for buffers whose names are in
+  "Alist of parameters for special frames.
+Special frames are used for buffers whose names are listed in
 `special-display-buffer-names' and for buffers whose names match
 one of the regular expressions in `special-display-regexps'.
+
 This variable can be set in your init file, like this:
+
   (setq special-display-frame-alist '((width . 80) (height . 20)))
+
 These supersede the values given in `default-frame-alist'."
   :type '(repeat (cons :format "%v"
                         (symbol :tag "Parameter")
@@ -121,13 +146,21 @@ These supersede the values given in `default-frame-alist'."
   :group 'frames)
 
 (defun special-display-popup-frame (buffer &optional args)
-  "Display BUFFER in its own frame, reusing an existing window if any.
-Return the window chosen.
-Currently we do not insist on selecting the window within its frame.
-If ARGS is an alist, use it as a list of frame parameter specs.
-If ARGS is a list whose car is a symbol,
-use (car ARGS) as a function to do the work.
-Pass it BUFFER as first arg, and (cdr ARGS) gives the rest of the args."
+  "Display BUFFER and return the window chosen.
+If BUFFER is already displayed in a visible or iconified frame,
+raise that frame.  Otherwise, display BUFFER in a new frame.
+
+Optional argument ARGS is a list specifying additional
+information.
+
+If ARGS is an alist, use it as a list of frame parameters.  If
+these parameters contain \(same-window . t), display BUFFER in
+the selected window.  If they contain \(same-frame . t), display
+BUFFER in a window of the selected frame.
+
+If ARGS is a list whose car is a symbol, use (car ARGS) as a
+function to do the work.  Pass it BUFFER as first argument,
+and (cdr ARGS) as second."
   (if (and args (symbolp (car args)))
       (apply (car args) buffer (cdr args))
     (let ((window (get-buffer-window buffer 0)))
@@ -145,12 +178,10 @@ Pass it BUFFER as first arg, and (cdr ARGS) gives the rest of the args."
           (error nil)))
        ;; Stay on the same frame if requested.
        (when (or (cdr (assq 'same-frame args)) (cdr (assq 'same-window args)))
-        (let* ((pop-up-frames nil) (pop-up-windows t)
-               special-display-regexps special-display-buffer-names
-               (window (display-buffer buffer)))
-          ;; Only do it if this is a new window:
-          ;; (set-window-dedicated-p window t)
-          window))
+        (let* ((pop-up-windows t)
+               pop-up-frames
+               special-display-buffer-names special-display-regexps)
+          (display-buffer buffer)))
        ;; If no window yet, make one in a new frame.
        (let ((frame
              (with-current-buffer buffer
@@ -620,7 +651,7 @@ The optional argument PARAMETERS specifies additional frame parameters."
         ;; On Windows, ignore DISPLAY.
         (make-frame parameters))
        (t
-        (unless (string-match "\\`[^:]*:[0-9]+\\(\\.[0-9]+\\)?\\'" display)
+        (unless (string-match-p "\\`[^:]*:[0-9]+\\(\\.[0-9]+\\)?\\'" display)
           (error "Invalid display, not HOST:SERVER or HOST:SERVER.SCREEN"))
         (when (and (boundp 'x-initialized) (not x-initialized))
           (setq x-display-name display)
@@ -628,23 +659,6 @@ The optional argument PARAMETERS specifies additional frame parameters."
         (make-frame `((window-system . x)
                       (display . ,display) . ,parameters)))))
 
-(defun make-frame-on-tty (tty type &optional parameters)
-  "Make a frame on terminal device TTY.
-TTY should be the file name of the tty device to use.  TYPE
-should be the terminal type string of TTY, for example \"xterm\"
-or \"vt100\".  The optional third argument PARAMETERS specifies
-additional frame parameters."
-  ;; Use "F" rather than "f", in case the device does not exist, as
-  ;; far as the filesystem is concerned.
-  (interactive "FOpen frame on tty device: \nsTerminal type of %s: ")
-  (unless tty
-    (error "Invalid terminal device"))
-  (unless type
-    (error "Invalid terminal type"))
-  (if (eq window-system 'pc)
-      (make-frame `((window-system . pc) (tty . ,tty) (tty-type . ,type) . ,parameters))
-    (make-frame `((window-system . nil) (tty . ,tty) (tty-type . ,type) . ,parameters))))
-
 (declare-function x-close-connection "xfns.c" (terminal))
 
 (defun close-display-connection (display)
@@ -723,7 +737,7 @@ You cannot specify either `width' or `height', you must use neither or both.
  (window-system . nil) The frame should be displayed on a terminal device.
  (window-system . x)   The frame should be displayed in an X window.
 
- (terminal . ID)          The frame should use the terminal identified by ID.
+ (terminal . TERMINAL)  The frame should use the terminal object TERMINAL.
 
 Before the frame is created (via `frame-creation-function-alist'), functions on the
 hook `before-make-frame-hook' are run.  After the frame is created, functions
@@ -849,7 +863,7 @@ the user during startup."
 
 (defun select-frame-set-input-focus (frame)
   "Select FRAME, raise it, and set input focus, if possible.
-If `mouse-autoselect-window' is non-nil, also move mouse cursor
+If `mouse-autoselect-window' is non-nil, also move mouse pointer
 to FRAME's selected window.  Otherwise, if `focus-follows-mouse'
 is non-nil, move mouse cursor to FRAME."
   (select-frame frame)
@@ -1471,6 +1485,10 @@ left untouched.  FRAME nil or omitted means use the selected frame."
     (setq frame (selected-frame)))
   (let* ((mini-frame (window-frame (minibuffer-window frame)))
         (frames (delq mini-frame (delq frame (frame-list)))))
+    ;; Only consider frames on the same terminal.
+    (dolist (frame (prog1 frames (setq frames nil)))
+      (if (eq (frame-terminal) (frame-terminal frame))
+          (push frame frames)))
     ;; Delete mon-minibuffer-only frames first, because `delete-frame'
     ;; signals an error when trying to delete a mini-frame that's
     ;; still in use by another frame.