summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1994-04-08 05:04:07 +0000
committerRichard M. Stallman <rms@gnu.org>1994-04-08 05:04:07 +0000
commit73a644b4f8d1130ca81737fe50c0bfff3316592e (patch)
tree609e442c88e77d7d30e9e142e5025bcba46c8923 /lisp/emacs-lisp
parent26c5bf8e549d5fed337996961f8ad9e8f2414c55 (diff)
downloademacs-73a644b4f8d1130ca81737fe50c0bfff3316592e.tar.gz
emacs-73a644b4f8d1130ca81737fe50c0bfff3316592e.tar.bz2
emacs-73a644b4f8d1130ca81737fe50c0bfff3316592e.zip
(popup-dialog-box): New function.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r--lisp/emacs-lisp/lmenu.el50
1 files changed, 50 insertions, 0 deletions
diff --git a/lisp/emacs-lisp/lmenu.el b/lisp/emacs-lisp/lmenu.el
index 395d2d36ede..afc8f1ae386 100644
--- a/lisp/emacs-lisp/lmenu.el
+++ b/lisp/emacs-lisp/lmenu.el
@@ -146,6 +146,56 @@ The syntax, more precisely:
(if (keymapp cmd)
(setq menu cmd)
(call-interactively cmd))))))
+
+(defun popup-dialog-box (data)
+ "Pop up a dialog box.
+A dialog box description is a list.
+
+ - The first element of the list is a string to display in the dialog box.
+ - The rest of the elements are descriptions of the dialog box's buttons.
+ Each one is a vector of three elements:
+ - The first element is the text of the button.
+ - The second element is the `callback'.
+ - The third element is t or nil, whether this button is selectable.
+
+If the `callback' of a button is a symbol, then it must name a command.
+It will be invoked with `call-interactively'. If it is a list, then it is
+evaluated with `eval'.
+
+One (and only one) of the buttons may be `nil'. This marker means that all
+following buttons should be flushright instead of flushleft.
+
+The syntax, more precisely:
+
+ form := <something to pass to `eval'>
+ command := <a symbol or string, to pass to `call-interactively'>
+ callback := command | form
+ active-p := <t, nil, or a form to evaluate to decide whether this
+ button should be selectable>
+ name := <string>
+ partition := 'nil'
+ button := '[' name callback active-p ']'
+ dialog := '(' name [ button ]+ [ partition [ button ]+ ] ')'"
+ (let ((name (car data))
+ (tail (cdr data))
+ converted
+ choice)
+ (while tail
+ (if (null (car tail))
+ (setq converted (cons nil converted))
+ (let ((item (aref (car tail) 0))
+ (callback (aref (car tail) 1))
+ (enable (aref (car tail) 2)))
+ (setq converted
+ (cons (if enable (cons item callback) item)
+ converted))))
+ (setq tail (cdr tail)))
+ (setq choice (x-popup-dialog t (cons name (nreverse converted))))
+ (setq meaning (assq choice converted))
+ (if meaning
+ (if (symbolp (cdr meaning))
+ (call-interactively (cdr meaning))
+ (eval (cdr meaning))))))
;; This is empty because the usual elements of the menu bar
;; are provided by menu-bar.el instead.