Function: tool-bar-local-item-from-menu
tool-bar-local-item-from-menu is an autoloaded and byte-compiled
function defined in tool-bar.el.gz.
Signature
(tool-bar-local-item-from-menu COMMAND ICON IN-MAP &optional FROM-MAP &rest PROPS)
Documentation
Define local tool bar binding for COMMAND using the given ICON.
This makes a binding for COMMAND in IN-MAP, copying its binding from
the menu bar in FROM-MAP (which defaults to global-map), but
modifies the binding by adding an image specification for ICON. It
finds ICON just like tool-bar-add-item. PROPS are additional
properties to add to the binding.
FROM-MAP must contain appropriate binding for [menu-bar] which
holds a keymap.
Source Code
;; Defined in /usr/src/emacs/lisp/tool-bar.el.gz
;;;###autoload
(defun tool-bar-local-item-from-menu (command icon in-map &optional from-map &rest props)
"Define local tool bar binding for COMMAND using the given ICON.
This makes a binding for COMMAND in IN-MAP, copying its binding from
the menu bar in FROM-MAP (which defaults to `global-map'), but
modifies the binding by adding an image specification for ICON. It
finds ICON just like `tool-bar-add-item'. PROPS are additional
properties to add to the binding.
FROM-MAP must contain appropriate binding for `[menu-bar]' which
holds a keymap."
(unless from-map
(setq from-map global-map))
(let* ((menu-bar-map (lookup-key from-map [menu-bar]))
(keys (where-is-internal command menu-bar-map))
(image-exp (tool-bar--image-expression icon))
submap key)
;; We'll pick up the last valid entry in the list of keys if
;; there's more than one.
;; FIXME: Aren't they *all* "valid"?? --Stef
(dolist (k keys)
;; We're looking for a binding of the command in a submap of
;; the menu bar map, so the key sequence must be two or more
;; long.
(if (and (vectorp k)
(> (length k) 1))
(let ((m (lookup-key menu-bar-map (substring k 0 -1)))
;; Last element in the bound key sequence:
(kk (aref k (1- (length k)))))
(if (and (keymapp m)
(symbolp kk))
(setq submap m
key kk)))))
(when (and (symbolp submap) (boundp submap))
(setq submap (eval submap)))
(let ((defn (assq key (cdr submap))))
(if (eq (cadr defn) 'menu-item)
(define-key-after in-map (vector key)
(append (cdr defn) (list :image image-exp) props))
(setq defn (cdr defn))
(define-key-after in-map (vector key)
(let ((rest (cdr defn)))
;; If the rest of the definition starts
;; with a list of menu cache info, get rid of that.
(if (and (consp rest) (consp (car rest)))
(setq rest (cdr rest)))
(append `(menu-item ,(car defn) ,rest)
(list :image image-exp) props))))
(tool-bar--flush-cache)
(force-mode-line-update))))