--- /usr/src/xemacs-21.5.32/lisp/menubar.el 2012-11-04 06:03:52.000000000 -0500 +++ ../xemacs_macros/menubar-new.el 2012-12-22 20:41:16.000000000 -0500 @@ -227,7 +227,7 @@ (signal 'error (list (gettext "not a submenu") menu-path))) (menu - (find-menu-item (cdr menu) (list item-name))) + (find-menu-item menu (list item-name))) (t (find-menu-item menubar (list item-name))) ))) @@ -237,24 +237,28 @@ (let ((rest menu-path) (so-far menubar)) (while rest + ;; find-menu-item skips menu name and keyword pairs now. ;;; (setq menu (car (find-menu-item (cdr so-far) (list (car rest))))) - (setq menu - (if (eq so-far menubar) - (car (find-menu-item so-far (list (car rest)))) - (car (find-menu-item (cdr so-far) (list (car rest)))))) + (setq menu (car (find-menu-item so-far (list (car rest))))) (unless menu (let ((rest2 so-far)) - (while (and (cdr rest2) (car (cdr rest2))) + (unless (stringp (car rest2)) + (push "Top-level Menubar" rest2)) + (while (keywordp (cadr rest2)) + (setq rest (cddr rest2))) + (while (cadr rest2) (setq rest2 (cdr rest2))) (setcdr rest2 (nconc (list (setq menu (list (car rest)))) (cdr rest2))))) (setq so-far menu) (setq rest (cdr rest))))) - (if (and item-found (car item-found)) + (if (car item-found) ;; hack the item in place. (if menu - ;; Isn't it very bad form to use nsubstitute for side effects? + ;; It's bad form to use nsubstitute for side effect. + ;; In this case however, we get away with it: all submenus start + ;; with a name, so the head will never be replaced. (nsubstitute new-item (car item-found) menu) (setq current-menubar (nsubstitute new-item (car item-found) @@ -266,8 +270,12 @@ (setq before (car (find-menu-item menu (list before))))) (let ((rest menu) (added-before nil)) + (unless (stringp (car rest)) + (push "Top-level Menubar" rest)) + (while (keywordp (cadr rest)) + (setq rest (cddr rest))) (while rest - (if (eq before (car (cdr rest))) + (if (eq before (cadr rest)) (progn (setcdr rest (cons new-item (cdr rest))) (setq rest nil added-before t))