(widget-choice-action): Use widget-edit-functions.
authorRichard M. Stallman <rms@gnu.org>
Fri, 27 Jun 1997 06:04:19 +0000 (06:04 +0000)
committerRichard M. Stallman <rms@gnu.org>
Fri, 27 Jun 1997 06:04:19 +0000 (06:04 +0000)
(widget-toggle-action): Likewise.

(widget-choose): Use only digits, except for C-g.
Allocate digits to disabled commands too.
Don't use a keyboard menu; instead, display a buffer
listing all the alternatives.  Put cursor in echo area.

lisp/wid-edit.el

index e90d62e..98fa79a 100644 (file)
@@ -269,31 +269,34 @@ minibuffer."
           ;; Define SPC as a prefix char to get to this menu.
           (define-key overriding-terminal-local-map " "
             (setq map (make-sparse-keymap title)))
-          (while items
-            (setq choice (car items) items (cdr items))
-            (if (consp choice)
-                (let* ((name (car choice))
-                      (function (cdr choice))
-                      (character (aref name 0)))
-                  ;; Pick a character for this choice;
-                  ;; avoid duplication.
-                  (when (lookup-key map (vector character))
-                    (setq character (downcase character))
-                    (when (lookup-key map (vector character))
-                      (setq character next-digit
-                            next-digit (1+ next-digit))))
-                  (define-key map (vector character)
-                    (cons (format "%c = %s" character name) function)))))
-          (define-key map [?\C-g] '("Quit" . keyboard-quit))
+          (save-excursion
+            (set-buffer (get-buffer-create " widget-choose"))
+            (erase-buffer)
+            (insert "Available choices:\n\n")
+            (while items
+              (setq choice (car items) items (cdr items))
+              (if (consp choice)
+                  (let* ((name (car choice))
+                        (function (cdr choice)))
+                    (insert (format "%c = %s\n" next-digit name))
+                    (define-key map (vector next-digit) function)))
+              ;; Allocate digits to disabled alternatives
+              ;; so that the digit of a given alternative never varies.
+              (setq next-digit (1+ next-digit)))
+            (insert "\nC-g = Quit"))
+          (define-key map [?\C-g] 'keyboard-quit)
           (define-key map [t] 'keyboard-quit)
           (setcdr map (nreverse (cdr map)))
           ;; Unread a SPC to lead to our new menu.
           (setq unread-command-events (cons ?\ unread-command-events))
           ;; Read a char with the menu, and return the result
           ;; that corresponds to it.
-          (setq value
-                (lookup-key overriding-terminal-local-map
-                            (read-key-sequence title) t))
+          (save-window-excursion
+            (display-buffer (get-buffer " widget-choose"))
+            (let ((cursor-in-echo-area t))
+              (setq value
+                    (lookup-key overriding-terminal-local-map
+                                (read-key-sequence title) t))))
           (when (eq value 'keyboard-quit)
             (error "Canceled"))
           value))))
@@ -1993,7 +1996,7 @@ when he invoked the menu."
                                      (widget-get current :value)))
       (widget-setup)
       (widget-apply widget :notify widget event)))
-  (run-hooks 'widget-edit-hook))
+  (run-hook-with-args 'widget-edit-functions widget))
 
 (defun widget-choice-validate (widget)
   ;; Valid if we have made a valid choice.
@@ -2049,7 +2052,7 @@ when he invoked the menu."
   ;; Toggle value.
   (widget-value-set widget (not (widget-value widget)))
   (widget-apply widget :notify widget event)
-  (run-hooks 'widget-edit-hook))
+  (run-hook-with-args 'widget-edit-functions widget))
 
 ;;; The `checkbox' Widget.