changeset 99632:73ea1a22b6f4

(read-passwd): Use read-event instead of read-char-exclusive.
author Chong Yidong <cyd@stupidchicken.com>
date Sun, 16 Nov 2008 21:02:05 +0000
parents ba528e468910
children 9e18920d7076
files lisp/subr.el
diffstat 1 files changed, 16 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/subr.el	Sun Nov 16 21:01:25 2008 +0000
+++ b/lisp/subr.el	Sun Nov 16 21:02:05 2008 +0000
@@ -1811,16 +1811,27 @@
 	    (c 0)
 	    (echo-keystrokes 0)
 	    (cursor-in-echo-area t)
-	    (message-log-max nil))
+	    (message-log-max nil)
+	    (stop-keys (list 'return ?\r ?\n ?\e))
+	    (rubout-keys (list 'backspace ?\b ?\177)))
 	(add-text-properties 0 (length prompt)
 			     minibuffer-prompt-properties prompt)
 	(while (progn (message "%s%s"
 			       prompt
 			       (make-string (length pass) ?.))
-		      (setq c (read-char-exclusive nil t))
-		      (and (/= c ?\r) (/= c ?\n) (/= c ?\e)))
+		      ;; We used to use read-char-exclusive, that that
+		      ;; gives funny behavior when the user presses,
+		      ;; e.g., the arrow keys.
+		      (setq c (read-event nil t))
+		      (not (memq c stop-keys)))
 	  (clear-this-command-keys)
-	  (cond ((= c ?\C-u) ; kill line
+	  (cond ((memq c rubout-keys) ; rubout
+		 (when (> (length pass) 0)
+		   (let ((new-pass (substring pass 0 -1)))
+		     (and (arrayp pass) (clear-string pass))
+		     (setq pass new-pass))))
+		((not (numberp c)))
+		((= c ?\C-u) ; kill line
 		 (and (arrayp pass) (clear-string pass))
 		 (setq pass ""))
 		((= c ?\C-y) ; yank
@@ -1835,16 +1846,12 @@
 		     (and (arrayp pass) (clear-string pass))
 		     (setq c ?\0)
 		     (setq pass new-pass))))
-		((and (/= c ?\b) (/= c ?\177)) ; insert char
+		((characterp c) ; insert char
 		 (let* ((new-char (char-to-string c))
 			(new-pass (concat pass new-char)))
 		   (and (arrayp pass) (clear-string pass))
 		   (clear-string new-char)
 		   (setq c ?\0)
-		   (setq pass new-pass)))
-		((> (length pass) 0) ; rubout
-		 (let ((new-pass (substring pass 0 -1)))
-		   (and (arrayp pass) (clear-string pass))
 		   (setq pass new-pass)))))
 	(message nil)
 	(or pass default "")))))