changeset 70901:cc60343f8fd6

(with-local-quit): When handling `quit' signal, make a chance for quit-flag to cause a quit.
author Richard M. Stallman <rms@gnu.org>
date Thu, 25 May 2006 00:18:55 +0000
parents 3af45cb133b8
children e516a97ce0e6
files lisp/subr.el
diffstat 1 files changed, 8 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/subr.el	Thu May 25 00:00:50 2006 +0000
+++ b/lisp/subr.el	Thu May 25 00:18:55 2006 +0000
@@ -1617,7 +1617,7 @@
 This function echoes `.' for each character that the user types.
 The user ends with RET, LFD, or ESC.  DEL or C-h rubs out.  C-u kills line.
 C-g quits; if `inhibit-quit' was non-nil around this function,
-then it returns nil if the user types C-g.
+then it returns nil if the user types C-g, but quit-flag remains set.
 
 Once the caller uses the password, it can erase the password
 by doing (clear-string STRING)."
@@ -2321,7 +2321,13 @@
   `(condition-case nil
        (let ((inhibit-quit nil))
 	 ,@body)
-     (quit (setq quit-flag t) nil)))
+     (quit (setq quit-flag t)
+	   ;; This call is to give a chance to handle quit-flag
+	   ;; in case inhibit-quit is nil.
+	   ;; Without this, it will not be handled until the next function
+	   ;; call, and that might allow it to exit thru a condition-case
+	   ;; that intends to handle the quit signal next time.
+	   (eval '(ignore nil)))))
 
 (defmacro while-no-input (&rest body)
   "Execute BODY only as long as there's no pending input.