# HG changeset patch # User Richard M. Stallman # Date 783318665 0 # Node ID a721dbc48e10766f8cfab9f1ab90afa062e5bfb7 # Parent 577db538b0b67c191de6956fc7152a7462990e47 (easy-menu-define): Call `easy-menu-do-define' to do the real work. Document XEmacs keyword arguments. (easy-menu-do-define): New function. (easy-menu-create-keymaps): Support XEmacs keyword arguments in menu definition. diff -r 577db538b0b6 -r a721dbc48e10 lisp/emacs-lisp/easymenu.el --- a/lisp/emacs-lisp/easymenu.el Thu Oct 27 22:35:14 1994 +0000 +++ b/lisp/emacs-lisp/easymenu.el Fri Oct 28 04:31:05 1994 +0000 @@ -48,6 +48,43 @@ ENABLE is an expression; the item is enabled for selection whenever this expression's value is non-nil. +Alternatively, a menu item may have the form: + + [ NAME CALLBACK [ KEYWORD ARG ] ... ] + +Where KEYWORD is one of the symbol defined below. + + :keys KEYS + +KEYS is a string; a complex keyboard equivalent to this menu item. +This is normally not needed because keyboard equivalents are usually +computed automatically. + + :active ENABLE + +ENABLE is an expression; the item is enabled for selection +whenever this expression's value is non-nil. + + :suffix NAME + +NAME is a string; the name of an argument to CALLBACK. + + :style + +STYLE is a symbol describing the type of menu item. The following are +defined: + +toggle: A checkbox. + Currently just prepend the name with the string \"Toggle \". +radio: A radio button. +nil: An ordinary menu item. + + :selected SELECTED + +SELECTED is an expression; the checkbox or radio button is selected +whenever this expression's value is non-nil. +Currently just disable radio buttons, no effect on checkboxes. + A menu item can be a string. Then that string appears in the menu as unselectable text. A string consisting solely of hyphens is displayed as a solid horizontal line. @@ -56,14 +93,22 @@ The first element should be the submenu name. That's used as the menu item in the top-level menu. The cdr of the submenu list is a list of menu items, as above." - (` (let* ((maps (, maps)) - (menu (, menu)) - (keymap (easy-menu-create-keymaps (car menu) (cdr menu)))) - (and (keymapp maps) (setq maps (list maps))) - (while maps - (define-key (car maps) (vector 'menu-bar (intern (car menu))) - (cons (car menu) keymap)) - (setq maps (cdr maps)))))) + (` (progn + (defvar (, symbol) nil (, doc)) + (easy-menu-do-define (quote (, symbol)) (, maps) (, doc) (, menu))))) + +(defun easy-menu-do-define (symbol maps doc menu) + ;; We can't do anything that might differ between Emacs dialects in + ;; `easy-menu-define' in order to make byte compiled files + ;; compatible. Therefore everything interesting is done in this + ;; function. + (set symbol (easy-menu-create-keymaps (car menu) (cdr menu))) + (fset symbol (` (lambda (event) (, doc) (interactive "@e") + (easy-popup-menu event (, symbol))))) + (mapcar (function (lambda (map) + (define-key map (vector 'menu-bar (intern (car menu))) + (cons (car menu) (symbol-value symbol))))) + (if (keymapp maps) (list maps) maps))) (defvar easy-menu-item-count 0) @@ -89,8 +134,39 @@ (setq command (make-symbol (format "menu-function-%d" easy-menu-item-count))) (setq easy-menu-item-count (1+ easy-menu-item-count)) - (put command 'menu-enable (aref item 2)) - (setq name (aref item 0)) + (setq name (aref item 0)) + (let ((keyword (aref item 2))) + (if (and (symbolp keyword) + (= ?: (aref (symbol-name keyword) 0))) + (let ((count 2) + style selected active keys + arg) + (while (> (length item) count) + (setq keyword (aref item count)) + (setq arg (aref item (1+ count))) + (setq count (+ 2 count)) + (cond ((eq keyword ':keys) + (setq keys arg)) + ((eq keyword ':active) + (setq active arg)) + ((eq keyword ':suffix) + (setq name (concat name " " arg))) + ((eq keyword ':style) + (setq style arg)) + ((eq keyword ':selected) + (setq selected arg)))) + (if keys + (setq name (concat name " (" keys ")"))) + (if (eq style 'toggle) + ;; Simulate checkboxes. + (setq name (concat "Toggle " name))) + (if active + (put command 'menu-enable active) + (and (eq style 'radio) + selected + ;; Simulate radio buttons with menu-enable. + (put command 'menu-enable + (list 'not selected))))))) (if (keymapp callback) (setq name (concat name " ..."))) (if (symbolp callback) @@ -119,9 +195,9 @@ (setcdr map (cdr (easy-menu-create-keymaps name items))) (error "Malformed menu in `easy-menu-change'")))) -(defmacro easy-menu-remove (menu)) +(defun easy-menu-remove (menu)) -(defmacro easy-menu-add (menu &optional map)) +(defun easy-menu-add (menu &optional map)) (provide 'easymenu)