diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el index 6a68ad63a5b..0c770df7c56 100644 --- a/lisp/menu-bar.el +++ b/lisp/menu-bar.el @@ -2233,31 +2233,34 @@ updating the menu." (not (window-minibuffer-p (frame-selected-window menu-frame)))))) -(defun kill-this-buffer (&optional event) ; for the menu bar +(defun kill-this-buffer () "Kill the current buffer. When called in the minibuffer, get out of the minibuffer using `abort-recursive-edit'. -This command must be bound to a mouse event, and can be reliably -invoked only from the menu bar, otherwise it could decide to silently -do nothing or signal an error. Use `kill-current-buffer' if you -need to invoke a similar command from keyboard." - (interactive "e") +This command can be invoked only from a menu or a tool bar. If you want +to invoke a similar command with `M-x', use `kill-current-buffer'." + (interactive) ;; This colossus of a conditional is necessary to account for the wide ;; variety of this command's callers. - (if (let* ((window (or (and event (event-start event) - (posn-window (event-start event))) - last-event-frame - (selected-frame))) - (frame (if (framep window) window - (window-frame window)))) - (not (window-minibuffer-p (frame-selected-window frame)))) - (progn (kill-buffer (current-buffer)) - ;; Also close the current window if `menu-bar-close-window' is - ;; set. - (when menu-bar-close-window - (ignore-errors (delete-window)))) - (abort-recursive-edit))) + (if (let ((lce last-command-event)) + (eq (if (atom lce) ; Selected menu item. + lce + (car lce)) ; Clicked tool bar icon. + 'kill-buffer)) + (if (let* ((window (or (posn-window (event--posn-at-point)) + last-event-frame + (selected-frame))) + (frame (if (framep window) window + (window-frame window)))) + (not (window-minibuffer-p (frame-selected-window frame)))) + (progn (kill-buffer (current-buffer)) + ;; Also close the current window if + ;; `menu-bar-close-window' is set. + (when menu-bar-close-window + (ignore-errors (delete-window)))) + (abort-recursive-edit)) + (error "This command must be called from a menu or a tool bar"))) (defun kill-this-buffer-enabled-p () "Return non-nil if the `kill-this-buffer' menu item should be enabled. diff --git a/lisp/net/eudc-hotlist.el b/lisp/net/eudc-hotlist.el index 144e7dba3c5..f11a179a02c 100644 --- a/lisp/net/eudc-hotlist.el +++ b/lisp/net/eudc-hotlist.el @@ -128,7 +128,7 @@ These are the special commands of this mode:\\ (setq eudc-server-hotlist (nreverse hotlist)) (eudc-install-menu) (eudc-save-options) - (kill-this-buffer))) + (kill-current-buffer))) (defun eudc-hotlist-select-server () "Select the server at point as the current server." diff --git a/lisp/net/eudc.el b/lisp/net/eudc.el index 1852bd137da..2e02e932234 100644 --- a/lisp/net/eudc.el +++ b/lisp/net/eudc.el @@ -571,7 +571,7 @@ otherwise they are formatted according to `eudc-user-attribute-names-alist'." (widget-insert " ") (widget-create 'push-button :notify (lambda (&rest _ignore) - (kill-this-buffer)) + (kill-current-buffer)) "Quit") (eudc-mode) (widget-setup) @@ -1096,7 +1096,7 @@ queries the server for the existing fields and displays a corresponding form." (widget-insert " ") (widget-create 'push-button :notify (lambda (&rest _ignore) - (kill-this-buffer)) + (kill-current-buffer)) "Quit") (goto-char pt) (use-local-map widget-keymap) diff --git a/lisp/vc/pcvs.el b/lisp/vc/pcvs.el index 2297d0a432d..b5dd3bf1ce6 100644 --- a/lisp/vc/pcvs.el +++ b/lisp/vc/pcvs.el @@ -161,7 +161,7 @@ "?" #'cvs-help "h" #'cvs-help "q" #'cvs-bury-buffer - "z" #'kill-this-buffer + "z" #'kill-current-buffer "F" #'cvs-mode-set-flags "!" #'cvs-mode-force-command "C-c C-c" #'cvs-mode-kill-process