Mercurial > emacs
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 "")))))