under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the
menu item called \"Item\" under the \"Foo\" submenu of \"Menu\".
NEW-NAME is the string that the menu item will be printed as from now on."
- (or (stringp new-name)
- (setq new-name (wrong-type-argument 'stringp new-name)))
+ (check-type new-name string)
(let* ((menubar current-menubar)
(pair (find-menu-item menubar path))
(item (car pair))
(extent-property extent 'context-menu))
context-extents))))
(popup-menu
- (cond ((and global-popup-menu mode-popup-menu)
+ (progn
;; Merge global-popup-menu and mode-popup-menu
- (check-menu-syntax mode-popup-menu)
- (let* ((title (car mode-popup-menu))
- (items (cdr mode-popup-menu))
+ (and mode-popup-menu (check-menu-syntax mode-popup-menu))
+ (let* ((mode-title (and (stringp (car mode-popup-menu))
+ (car mode-popup-menu)))
+ (mode-items (if mode-title (cdr mode-popup-menu)
+ mode-popup-menu))
+ (global-title (and (stringp (car global-popup-menu))
+ (car global-popup-menu)))
+ (global-items (if global-title (cdr global-popup-menu)
+ global-popup-menu))
mode-filters)
;; Strip keywords from local menu for attaching them at the top
- (while (and items
- (keywordp (car items)))
+ (while (and mode-items
+ (keywordp (car mode-items)))
;; Push both keyword and its argument.
- (push (pop items) mode-filters)
- (push (pop items) mode-filters))
+ (push (pop mode-items) mode-filters)
+ (push (pop mode-items) mode-filters))
(setq mode-filters (nreverse mode-filters))
;; If mode-filters contains a keyword already present in
;; `global-popup-menu', you will probably lose.
- (append (list (car global-popup-menu))
+ (append (cond ((not popup-menu-titles) (list ""))
+ (mode-title (list mode-title))
+ (global-title (list global-title))
+ (t (list "")))
mode-filters
- (cdr global-popup-menu)
- '("---" "---")
- (if popup-menu-titles (list title))
- (if popup-menu-titles '("---" "---"))
- items
- context-menu-items)))
- (t
- (append
- (or mode-popup-menu
- global-popup-menu
- (error "No menu defined in this buffer"))
- context-menu-items))))
+ context-menu-items
+ (and context-menu-items mode-items '("---"))
+ mode-items
+ (and (or context-menu-items mode-items)
+ global-items '("---" "---"))
+ (and global-title (list global-title))
+ global-items
+ ))))
(while (popup-up-p)
(dispatch-event (next-event)))
MENU-DESC and EVENT are as in the call to `popup-menu'."
;; partially stolen from w3
+
+ ;; This function is way gross and assumes to much about menu
+ ;; processing that is X specific. Under mswindows popup menus behave
+ ;; in reasonable ways that you can't obstruct.
(let ((echo-keystrokes 0)
new-event)
(popup-menu menu-desc event)
(setq new-event (next-command-event new-event))
(cond ((misc-user-event-p new-event)
(throw 'popup-done new-event))
- ((not (popup-up-p))
- (setq unread-command-events (cons new-event
- unread-command-events))
- (throw 'popup-done nil))
((button-release-event-p new-event);; don't beep twice
nil)
- ((event-matches-key-specifier-p (quit-char))
+ ;; It shows how bogus this function is that the event
+ ;; arg could be missing and no-one noticed ...
+ ((event-matches-key-specifier-p new-event (quit-char))
(signal 'quit nil))
+ ;; mswindows has no pop-down processing (selection is
+ ;; atomic) so doing anything more makes no sense. Since
+ ;; popup-up-p is always false under mswindows, this
+ ;; function has been ordered to do essentially X-specifc
+ ;; processing after this check.
+ ((not (popup-up-p))
+ (setq unread-command-events (cons new-event
+ unread-command-events))
+ (throw 'popup-done nil))
+ ;; mswindows never gets here
(t
(beep)
(message "please make a choice from the menu.")))))))