Hi people, I just found a bug when is used keypad under password input field in emacs, that's not doing anything, so these diffs provided by Stefan and slightly modified by us, to handle C-g case, fix the problem . ==> Bug: Under GNU/Linux trying to write numbers using keypad in a prompt input password field does not works. This is not happening under Windows OS. Not other OS tested. This is reproducible in any gnu/emacs version from cvs (e.g. 23.0.90.2). ==> Fix: Usage of read-key instead read-event. As read-key is getting each key but not inserted and handled until pressed return, so we should take care about C-g case as well to provide user's cancellation. ==> Diffs: *** emacs/lisp/subr.el 2009-02-14 09:06:56.000000000 +0000 --- emacs_hack/lisp/subr.el 2009-05-14 01:29:52.000000000 +0100 *************** *** 1721,1726 **** --- 1721,1767 ---- - Mostrar texto citado - ;;;; Input and display facilities. + (defconst read-key-empty-map (make-sparse-keymap)) + (defvar read-key-delay 0.1) + + (defun read-key (&optional prompt) + "Read a key from the keyboard. + Contrary to `read-event' this will not return a raw event but instead will + obey the input decoding and translations usually done by `read-key-sequence'. + So escape sequences and keyboard encoding are taken into account. + When there's an ambiguity because the key looks like the prefix of + some sort of escape sequence, the ambiguity is resolved via `read-key-delay'." + (let ((overriding-terminal-local-map read-key-empty-map) + (overriding-local-map nil) + (old-global-map (current-global-map)) + (timer (run-with-idle-timer + ;; Wait long enough that Emacs has the time to receive and + ;; process all the raw events associated with the single-key. + ;; But don't wait too long, or the user may find the delay + ;; annoying (or keep hitting more keys which may then get + ;; lost or misinterpreted). + ;; This is only relevant for keys which Emacs perceives as + ;; "prefixes", such as C-x (because of the C-x 8 map in + ;; key-translate-table and the C-x @ map in function-key-map) + ;; or ESC (because of terminal escape sequences in + ;; input-decode-map). + read-key-delay t + (lambda () + (let ((keys (this-command-keys-vector))) + (unless (zerop (length keys)) + ;; `keys' is non-empty, so the user has hit at least + ;; one key; there's no point waiting any longer, even + ;; though read-key-sequence thinks we should wait + ;; for more input to decide how to interpret the + ;; current input. + (throw 'read-key keys))))))) + (unwind-protect + (progn + (use-global-map read-key-empty-map) + (aref (catch 'read-key (read-key-sequence prompt nil t)) 0)) + (cancel-timer timer) + (use-global-map old-global-map)))) + (defvar read-quoted-char-radix 8 "*Radix for \\[quoted-insert] and other uses of `read-quoted-char'. Legitimate radix values are 8, 10 and 16.") *************** *** 1837,1846 **** (while (progn (message "%s%s" prompt (make-string (length pass) ?.)) ! ;; We used to use read-char-exclusive, but 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 ((memq c rubout-keys) ; rubout --- 1878,1884 ---- (while (progn (message "%s%s" prompt (make-string (length pass) ?.)) ! (setq c (read-key)) (not (memq c stop-keys))) (clear-this-command-keys) (cond ((memq c rubout-keys) ; rubout *************** *** 1848,1855 **** (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 --- 1886,1895 ---- (let ((new-pass (substring pass 0 -1))) (and (arrayp pass) (clear-string pass)) (setq pass new-pass)))) + ((eq c ?\C-g) + (keyboard-quit)) ((not (numberp c))) ! ((eq c ?\C-u) ; kill line (and (arrayp pass) (clear-string pass)) (setq pass "")) ((= c ?\C-y) ; yank ==> End. Thanks! Borja Tarraso