]> code.delx.au - gnu-emacs/commitdiff
Make tmm-menubar work in correct order again
authorEli Zaretskii <eliz@gnu.org>
Tue, 19 Apr 2016 15:06:52 +0000 (18:06 +0300)
committerEli Zaretskii <eliz@gnu.org>
Tue, 19 Apr 2016 15:06:52 +0000 (18:06 +0300)
* lisp/tmm.el (tmm-prompt): Don't reverse 'tmm-km-list' right at the
beginning; instead, pass a reversed copy to 'tmm--completion-table'.
(Bug#23309)
(tmm-menubar): Fix an off-by-one error in determining the menu
item when the function is called with a non-nil 'x-position'
argument.

lisp/tmm.el

index 714de9230e7848bbcf092b26ebccf9b90a963896..d1a08ab26235ab70723ee7f58ea9fb628e4da4ea 100644 (file)
@@ -72,13 +72,15 @@ to invoke `tmm-menubar' instead, customize the variable
      (tmm-get-keybind [menu-bar]))
     (setq menu-bar `(keymap ,@(nreverse menu-bar) ,@(nreverse menu-end)))
     (if x-position
-       (let ((column 0))
+       (let ((column 0)
+              prev-key)
           (catch 'done
             (map-keymap
              (lambda (key binding)
                (when (> column x-position)
-                 (setq menu-bar-item key)
+                 (setq menu-bar-item prev-key)
                  (throw 'done nil))
+               (setq prev-key key)
                (pcase binding
                  ((or `(,(and (pred stringp) name) . ,_) ;Simple menu item.
                       `(menu-item ,name ,_cmd            ;Extended menu item.
@@ -187,7 +189,6 @@ Its value should be an event that has a binding in MENU."
          ((vectorp elt)
           (dotimes (i (length elt))
             (tmm-get-keymap (cons i (aref elt i)) not-menu))))))
-    (setq tmm-km-list (nreverse tmm-km-list))
     ;; Choose an element of tmm-km-list; put it in choice.
     (if (and not-menu (= 1 (length tmm-km-list)))
        ;; If this is the top-level of an x-popup-menu menu,
@@ -239,10 +240,17 @@ Its value should be an event that has a binding in MENU."
                    (if default-item
                        (car (nth index-of-default tmm-km-list))
                      (minibuffer-with-setup-hook #'tmm-add-prompt
+                       ;; tmm-km-list is reversed, because history
+                       ;; needs it in LIFO order.  But completion
+                       ;; needs it in non-reverse order, so that the
+                       ;; menu items are displayed as completion
+                       ;; candidates in the order they are shown on
+                       ;; the menu bar.  So pass completing-read the
+                       ;; reversed copy of the list.
                        (completing-read
                         (concat gl-str
                                 " (up/down to change, PgUp to menu): ")
-                        (tmm--completion-table tmm-km-list) nil t nil
+                        (tmm--completion-table (reverse tmm-km-list)) nil t nil
                         (cons 'tmm--history
                               (- (* 2 history-len) index-of-default))))))))
       (setq choice (cdr (assoc out tmm-km-list)))