Mercurial > emacs
changeset 9733:a721dbc48e10
(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.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Fri, 28 Oct 1994 04:31:05 +0000 |
parents | 577db538b0b6 |
children | 051c27bcbc22 |
files | lisp/emacs-lisp/easymenu.el |
diffstat | 1 files changed, 88 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- 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)