X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/411c1c65313aa4e22730ba9762e073881f4e299a..833f9821f534730423a7757ce3d302314af29d63:/lisp/menu-bar.el diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el index 8f33641a74..6a2ff63069 100644 --- a/lisp/menu-bar.el +++ b/lisp/menu-bar.el @@ -1,6 +1,6 @@ ;;; menu-bar.el --- define a default menu bar -;; Copyright (C) 1993-1995, 2000-2014 Free Software Foundation, Inc. +;; Copyright (C) 1993-1995, 2000-2015 Free Software Foundation, Inc. ;; Author: Richard M. Stallman ;; Maintainer: emacs-devel@gnu.org @@ -373,35 +373,31 @@ (bindings--define-key menu [set-tags-name] '(menu-item "Set Tags File Name..." visit-tags-table - :help "Tell Tags commands which tag table file to use")) + :visible (menu-bar-goto-uses-etags-p) + :help "Tell navigation commands which tag table file to use")) (bindings--define-key menu [separator-tag-file] - menu-bar-separator) + '(menu-item "--" nil :visible (menu-bar-goto-uses-etags-p))) + + (bindings--define-key menu [xref-pop] + '(menu-item "Back" xref-pop-marker-stack + :visible (and (featurep 'xref) + (not (xref-marker-stack-empty-p))) + :help "Back to the position of the last search")) - (bindings--define-key menu [apropos-tags] - '(menu-item "Tags Apropos..." tags-apropos + (bindings--define-key menu [xref-apropos] + '(menu-item "Find Apropos..." xref-find-apropos :help "Find function/variables whose names match regexp")) - (bindings--define-key menu [next-tag-otherw] - '(menu-item "Next Tag in Other Window" - menu-bar-next-tag-other-window - :enable (and (boundp 'tags-location-ring) - (not (ring-empty-p tags-location-ring))) - :help "Find next function/variable matching last tag name in another window")) - - (bindings--define-key menu [next-tag] - '(menu-item "Find Next Tag" - menu-bar-next-tag - :enable (and (boundp 'tags-location-ring) - (not (ring-empty-p tags-location-ring))) - :help "Find next function/variable matching last tag name")) - (bindings--define-key menu [find-tag-otherw] - '(menu-item "Find Tag in Other Window..." find-tag-other-window + + (bindings--define-key menu [xref-find-otherw] + '(menu-item "Find Definition in Other Window..." + xref-find-definitions-other-window :help "Find function/variable definition in another window")) - (bindings--define-key menu [find-tag] - '(menu-item "Find Tag..." find-tag + (bindings--define-key menu [xref-find-def] + '(menu-item "Find Definition..." xref-find-definitions :help "Find definition of function or variable")) - (bindings--define-key menu [separator-tags] + (bindings--define-key menu [separator-xref] menu-bar-separator) (bindings--define-key menu [end-of-buf] @@ -416,6 +412,9 @@ :help "Read a line number and go to that line")) menu)) +(defun menu-bar-goto-uses-etags-p () + (or (not (boundp 'xref-find-function)) + (eq xref-find-function 'etags-xref-find))) (defvar yank-menu (cons (purecopy "Select Yank") nil)) (fset 'yank-menu (cons 'keymap yank-menu)) @@ -475,13 +474,15 @@ :enable (and (cdr yank-menu) (not buffer-read-only)) :help "Choose a string from the kill ring and paste it")) (bindings--define-key menu [paste] - '(menu-item "Paste" yank - :enable (and (or - (gui-call gui-selection-exists-p 'CLIPBOARD) - (if (featurep 'ns) ; like paste-from-menu - (cdr yank-menu) - kill-ring)) - (not buffer-read-only)) + `(menu-item "Paste" yank + :enable (funcall + ',(lambda () + (and (or + (gui-backend-selection-exists-p 'CLIPBOARD) + (if (featurep 'ns) ; like paste-from-menu + (cdr yank-menu) + kill-ring)) + (not buffer-read-only)))) :help "Paste (yank) text most recently cut/copied")) (bindings--define-key menu [copy] ;; ns-win.el said: Substitute a Copy function that works better @@ -514,16 +515,6 @@ menu)) -(defun menu-bar-next-tag-other-window () - "Find the next definition of the tag already specified." - (interactive) - (find-tag-other-window nil t)) - -(defun menu-bar-next-tag () - "Find the next definition of the tag already specified." - (interactive) - (find-tag nil t)) - (define-obsolete-function-alias 'menu-bar-kill-ring-save 'kill-ring-save "24.1") @@ -534,9 +525,12 @@ '(and mark-active (not buffer-read-only))) (put 'clipboard-kill-ring-save 'menu-enable 'mark-active) (put 'clipboard-yank 'menu-enable - '(and (or (gui-call gui-selection-exists-p 'PRIMARY) - (gui-call gui-selection-exists-p 'CLIPBOARD)) - (not buffer-read-only))) + `(funcall ',(lambda () + (and (or (gui-backend-selection-exists-p 'PRIMARY) + (gui-backend-selection-exists-p 'CLIPBOARD)) + (not buffer-read-only))))) + +(defvar gui-select-enable-clipboard) (defun clipboard-yank () "Insert the clipboard contents, or the last stretch of killed text." @@ -689,7 +683,7 @@ by \"Save Options\" in Custom buffers.") (dolist (elt '(scroll-bar-mode debug-on-quit debug-on-error ;; Somehow this works, when tool-bar and menu-bar don't. - tooltip-mode + tooltip-mode window-divider-mode save-place uniquify-buffer-name-style fringe-mode indicate-empty-lines indicate-buffer-boundaries case-fold-search font-use-system-font @@ -717,6 +711,95 @@ by \"Save Options\" in Custom buffers.") ;; The "Show/Hide" submenu of menu "Options" +(defun menu-bar-window-divider-customize () + "Show customization buffer for `window-divider' group." + (interactive) + (customize-group 'window-divider)) + +(defun menu-bar-bottom-and-right-window-divider () + "Display dividers on the bottom and right of each window." + (interactive) + (customize-set-variable 'window-divider-default-places t) + (window-divider-mode 1)) + +(defun menu-bar-right-window-divider () + "Display dividers only on the right of each window." + (interactive) + (customize-set-variable 'window-divider-default-places 'right-only) + (window-divider-mode 1)) + +(defun menu-bar-bottom-window-divider () + "Display dividers only at the bottom of each window." + (interactive) + (customize-set-variable 'window-divider-default-places 'bottom-only) + (window-divider-mode 1)) + +(defun menu-bar-no-window-divider () + "Do not display window dividers." + (interactive) + (window-divider-mode -1)) + +;; For the radio buttons below we check whether the respective dividers +;; are displayed on the selected frame. This is not fully congruent +;; with `window-divider-mode' but makes the menu entries work also when +;; dividers are displayed by manipulating frame parameters directly. +(defvar menu-bar-showhide-window-divider-menu + (let ((menu (make-sparse-keymap "Window Divider"))) + (bindings--define-key menu [customize] + '(menu-item "Customize" menu-bar-window-divider-customize + :help "Customize window dividers" + :visible (memq (window-system) '(x w32)))) + + (bindings--define-key menu [bottom-and-right] + '(menu-item "Bottom and Right" + menu-bar-bottom-and-right-window-divider + :help "Display window divider on the bottom and right of each window" + :visible (memq (window-system) '(x w32)) + :button (:radio + . (and (window-divider-width-valid-p + (cdr (assq 'bottom-divider-width + (frame-parameters)))) + (window-divider-width-valid-p + (cdr (assq 'right-divider-width + (frame-parameters)))))))) + (bindings--define-key menu [right-only] + '(menu-item "Right Only" + menu-bar-right-window-divider + :help "Display window divider on the right of each window only" + :visible (memq (window-system) '(x w32)) + :button (:radio + . (and (not (window-divider-width-valid-p + (cdr (assq 'bottom-divider-width + (frame-parameters))))) + (window-divider-width-valid-p + (cdr (assq 'right-divider-width + (frame-parameters)))))))) + (bindings--define-key menu [bottom-only] + '(menu-item "Bottom Only" + menu-bar-bottom-window-divider + :help "Display window divider on the bottom of each window only" + :visible (memq (window-system) '(x w32)) + :button (:radio + . (and (window-divider-width-valid-p + (cdr (assq 'bottom-divider-width + (frame-parameters)))) + (not (window-divider-width-valid-p + (cdr (assq 'right-divider-width + (frame-parameters))))))))) + (bindings--define-key menu [no-divider] + '(menu-item "None" + menu-bar-no-window-divider + :help "Do not display window dividers" + :visible (memq (window-system) '(x w32)) + :button (:radio + . (and (not (window-divider-width-valid-p + (cdr (assq 'bottom-divider-width + (frame-parameters))))) + (not (window-divider-width-valid-p + (cdr (assq 'right-divider-width + (frame-parameters))))))))) + menu)) + (defun menu-bar-showhide-fringe-ind-customize () "Show customization buffer for `indicate-buffer-boundaries'." (interactive) @@ -1078,6 +1161,10 @@ mail status in mode line")) (frame-visible-p (symbol-value 'speedbar-frame)))))) + (bindings--define-key menu [showhide-window-divider] + `(menu-item "Window Divider" ,menu-bar-showhide-window-divider-menu + :visible (memq (window-system) '(x w32)))) + (bindings--define-key menu [showhide-fringe] `(menu-item "Fringe" ,menu-bar-showhide-fringe-menu :visible (display-graphic-p))) @@ -1758,12 +1845,14 @@ The menu frame is the frame for which we are updating the menu." (frame-visible-p menu-frame)))) (defun menu-bar-non-minibuffer-window-p () - "Return non-nil if selected window of the menu frame is not a minibuf window. - -See the documentation of `menu-bar-menu-frame-live-and-visible-p' -for the definition of the menu frame." + "Return non-nil if the menu frame's selected window is no minibuffer window. +Return nil if the menu frame is dead or its selected window is a +minibuffer window. The menu frame is the frame for which we are +updating the menu." (let ((menu-frame (or menu-updating-frame (selected-frame)))) - (not (window-minibuffer-p (frame-selected-window menu-frame))))) + (and (frame-live-p menu-frame) + (not (window-minibuffer-p + (frame-selected-window menu-frame)))))) (defun kill-this-buffer () ; for the menu bar "Kill the current buffer. @@ -1958,20 +2047,20 @@ It must accept a buffer as its only required argument.") (let ((buffers (buffer-list)) (frames (frame-list)) buffers-menu) - ;; If requested, list only the N most recently selected buffers. - (if (and (integerp buffers-menu-max-size) - (> buffers-menu-max-size 1)) - (if (> (length buffers) buffers-menu-max-size) - (setcdr (nthcdr buffers-menu-max-size buffers) nil))) ;; Make the menu of buffers proper. (setq buffers-menu - (let (alist) + (let ((i 0) + (limit (if (and (integerp buffers-menu-max-size) + (> buffers-menu-max-size 1)) + buffers-menu-max-size most-positive-fixnum)) + alist) ;; Put into each element of buffer-list ;; the name for actual display, ;; perhaps truncated in the middle. - (dolist (buf buffers) - (let ((name (buffer-name buf))) + (while buffers + (let* ((buf (pop buffers)) + (name (buffer-name buf))) (unless (eq ?\s (aref name 0)) (push (menu-bar-update-buffers-1 (cons buf @@ -1985,7 +2074,11 @@ It must accept a buffer as its only required argument.") name (- (/ buffers-menu-buffer-name-length 2)))) name) )) - alist)))) + alist) + ;; If requested, list only the N most recently + ;; selected buffers. + (when (= 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. @@ -2258,7 +2351,7 @@ If nil, the current mouse position is used." ;; Event. ((pred eventp) (popup-menu-normalize-position (event-end position))) - (t position))) + (_ position))) (defcustom tty-menu-open-use-tmm nil "If non-nil, \\[menu-bar-open] on a TTY will invoke `tmm-menubar'. @@ -2283,7 +2376,7 @@ This function decides which method to use to access the menu depending on FRAME's terminal device. On X displays, it calls `x-menu-bar-open'; on Windows, `w32-menu-bar-open'; otherwise it calls either `popup-menu' or `tmm-menubar' depending on whether -\`tty-menu-open-use-tmm' is nil or not. +`tty-menu-open-use-tmm' is nil or not. If FRAME is nil or not given, use the selected frame." (interactive)