changeset 81796:6c2d34aea93f

(easy-menu-binding): New function. (easy-menu-do-define): Use it. (easy-menu-do-add-item): Inline into easy-menu-add-item and then remove.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 10 Jul 2007 16:35:24 +0000
parents 15008ad392dc
children cf9acee3da75
files lisp/ChangeLog lisp/emacs-lisp/easymenu.el
diffstat 2 files changed, 28 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Tue Jul 10 16:01:25 2007 +0000
+++ b/lisp/ChangeLog	Tue Jul 10 16:35:24 2007 +0000
@@ -1,5 +1,9 @@
 2007-07-10  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+	* emacs-lisp/easymenu.el (easy-menu-binding): New function.
+	(easy-menu-do-define): Use it.
+	(easy-menu-do-add-item): Inline into easy-menu-add-item and then remove.
+
 	* progmodes/compile.el (compilation-auto-jump-to-first-error)
 	(compilation-auto-jump-to-next): New vars.
 	(compilation-auto-jump): New function.
--- a/lisp/emacs-lisp/easymenu.el	Tue Jul 10 16:01:25 2007 +0000
+++ b/lisp/emacs-lisp/easymenu.el	Tue Jul 10 16:35:24 2007 +0000
@@ -152,6 +152,21 @@
      ,(if symbol `(defvar ,symbol nil ,doc))
      (easy-menu-do-define (quote ,symbol) ,maps ,doc ,menu)))
 
+(defun easy-menu-binding (menu &optional item-name)
+  "Return a binding suitable to pass to `define-key'.
+This is expected to be bound to a mouse event."
+  ;; Under Emacs this is almost trivial, whereas under XEmacs this may
+  ;; involve defining a function that calls popup-menu.
+  (let ((props (if (symbolp menu)
+                   (prog1 (get menu 'menu-prop)
+                     (setq menu (symbol-function menu))))))
+    (cons 'menu-item
+          (cons (or item-name
+                    (if (keymapp menu)
+                        (keymap-prompt menu))
+                    "")
+                (cons menu props)))))
+
 ;;;###autoload
 (defun easy-menu-do-define (symbol maps doc menu)
   ;; We can't do anything that might differ between Emacs dialects in
@@ -173,15 +188,10 @@
 				       'identity)
 				   (symbol-function ,symbol)))
 			     ,symbol)))))
-    (mapcar (lambda (map)
-	      (define-key map (vector 'menu-bar (easy-menu-intern (car menu)))
-		(cons 'menu-item
-		      (cons (car menu)
-			    (if (not (symbolp keymap))
-				(list keymap)
-			      (cons (symbol-function keymap)
-				    (get keymap 'menu-prop)))))))
-	    (if (keymapp maps) (list maps) maps))))
+    (dolist (map (if (keymapp maps) (list maps) maps))
+      (define-key map
+        (vector 'menu-bar (easy-menu-intern (car menu)))
+        (easy-menu-binding keymap (car menu))))))
 
 (defun easy-menu-filter-return (menu &optional name)
  "Convert MENU to the right thing to return from a menu filter.
@@ -249,10 +259,6 @@
 (defvar easy-menu-button-prefix
   '((radio . :radio) (toggle . :toggle)))
 
-(defun easy-menu-do-add-item (menu item &optional before)
-  (setq item (easy-menu-convert-item item))
-  (easy-menu-define-key menu (easy-menu-intern (car item)) (cdr item) before))
-
 (defvar easy-menu-converted-items-table (make-hash-table :test 'equal))
 
 (defun easy-menu-convert-item (item)
@@ -269,7 +275,7 @@
 (defun easy-menu-convert-item-1 (item)
   "Parse an item description and convert it to a menu keymap element.
 ITEM defines an item as in `easy-menu-define'."
-  (let (name command label prop remove help)
+  (let (name command label prop remove)
     (cond
      ((stringp item)			; An item or separator.
       (setq label item))
@@ -536,7 +542,8 @@
 		 (setq item (symbol-value item))))
 	;; Item is a keymap, find the prompt string and use as item name.
 	(setq item (cons (keymap-prompt item) item)))
-    (easy-menu-do-add-item map item before)))
+    (setq item (easy-menu-convert-item item))
+    (easy-menu-define-key map (easy-menu-intern (car item)) (cdr item) before)))
 
 (defun easy-menu-item-present-p (map path name)
   "In submenu of MAP with path PATH, return non-nil iff item NAME is present.
@@ -615,7 +622,8 @@
 	(catch 'found
 	  (if (and map (symbolp map) (not (keymapp map)))
 	      (setq map (symbol-value map)))
-	  (let ((maps (if map (list map) (current-active-maps))))
+	  (let ((maps (if map (if (keymapp map) (list map) map)
+			(current-active-maps))))
 	    ;; Look for PATH in each map.
 	    (unless map (push 'menu-bar path))
 	    (dolist (name path)