Function: menu-bar-update-buffers

menu-bar-update-buffers is a byte-compiled function defined in menu-bar.el.gz.

Signature

(menu-bar-update-buffers &optional FORCE)

Documentation

If user discards the Buffers item, play along.

Source Code

;; Defined in /usr/src/emacs/lisp/menu-bar.el.gz
(defun menu-bar-update-buffers (&optional force)
  "If user discards the Buffers item, play along."
  (and (lookup-key (current-global-map) [menu-bar buffer])
       (or force (frame-or-buffer-changed-p))
       (let ((buffers (buffer-list))
	     frames buffers-menu)
         ;; Ignore the initial frame if present.  It can happen if
         ;; Emacs was started as a daemon.  (bug#53740)
         (dolist (frame (frame-list))
           (unless (equal (terminal-name (frame-terminal frame))
                          "initial_terminal")
             (push frame frames)))
	 ;; Make the menu of buffers proper.
	 (setq buffers-menu
               (let ((i 0)
		     (limit (and (integerp buffers-menu-max-size)
				 (> buffers-menu-max-size 1)
				 buffers-menu-max-size))
                     alist)
		 ;; Put into each element of buffer-list
		 ;; the name for actual display,
		 ;; perhaps truncated in the middle.
                 (while buffers
                   (let* ((buf (pop buffers))
                          (name (buffer-name buf)))
                     (unless (eq ?\s (aref name 0))
                       (push (menu-bar-update-buffers-1
                              (cons buf
				    (if (and (integerp buffers-menu-buffer-name-length)
					     (> (length name) buffers-menu-buffer-name-length))
					(concat
					 (substring
					  name 0 (/ buffers-menu-buffer-name-length 2))
					 "..."
					 (substring
					  name (- (/ buffers-menu-buffer-name-length 2))))
				      name)
                                    ))
                             alist)
                       ;; If requested, list only the N most recently
                       ;; selected buffers.
                       (when (eql limit (setq i (1+ i)))
                         (setq buffers nil)))))
		 (list (menu-bar-buffer-vector alist))))

	 ;; Make a Frames menu if we have more than one frame.
	 (when (cdr frames)
	   (let* ((frames-vec (make-vector (length frames) nil))
                  (frames-menu
                   (cons 'keymap
                         (list "Select Frame" frames-vec)))
                  (i 0))
             (dolist (frame frames)
               (aset frames-vec i
                     (cons
                      (frame-parameter frame 'name)
                      (lambda ()
                        (interactive) (menu-bar-select-frame frame))))
               (setq i (1+ i)))
	     ;; Put it after the normal buffers
	     (setq buffers-menu
		   (nconc buffers-menu
			  `((frames-separator "--")
			    (frames menu-item "Frames" ,frames-menu))))))

	 ;; Add in some normal commands at the end of the menu.
	 (setq buffers-menu
	       (nconc buffers-menu menu-bar-buffers-menu-command-entries))

         ;; We used to "(define-key (current-global-map) [menu-bar buffer]"
         ;; but that did not do the right thing when the [menu-bar buffer]
         ;; entry above had been moved (e.g. to a parent keymap).
	 (setcdr global-buffers-menu-map (cons "Buffers" buffers-menu)))))