From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Eli Zaretskii Newsgroups: gmane.emacs.devel Subject: Re: while-no-input interrupted by *shell* Date: Tue, 25 Sep 2018 16:09:40 +0300 Message-ID: <831s9hafl7.fsf@gnu.org> References: <87sh1y535s.fsf@web.de> <8336tyc1ou.fsf@gnu.org> <87mus64wwr.fsf@web.de> NNTP-Posting-Host: blaine.gmane.org X-Trace: blaine.gmane.org 1537880879 28481 195.159.176.226 (25 Sep 2018 13:07:59 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Tue, 25 Sep 2018 13:07:59 +0000 (UTC) Cc: emacs-devel@gnu.org To: Michael Heerdegen Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Sep 25 15:07:55 2018 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1g4n4E-0007FC-3T for ged-emacs-devel@m.gmane.org; Tue, 25 Sep 2018 15:07:54 +0200 Original-Received: from localhost ([::1]:53065 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g4n6H-0000EK-3q for ged-emacs-devel@m.gmane.org; Tue, 25 Sep 2018 09:10:04 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:59646) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g4n64-0000E0-KE for emacs-devel@gnu.org; Tue, 25 Sep 2018 09:09:49 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1g4n61-0002zO-Cv for emacs-devel@gnu.org; Tue, 25 Sep 2018 09:09:48 -0400 Original-Received: from fencepost.gnu.org ([2001:4830:134:3::e]:56214) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g4n61-0002zE-8f; Tue, 25 Sep 2018 09:09:45 -0400 Original-Received: from [176.228.60.248] (port=1293 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1g4n60-0006Pm-RX; Tue, 25 Sep 2018 09:09:45 -0400 In-reply-to: <87mus64wwr.fsf@web.de> (message from Michael Heerdegen on Mon, 24 Sep 2018 19:39:48 +0200) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:230055 Archived-At: > From: Michael Heerdegen > Date: Mon, 24 Sep 2018 19:39:48 +0200 > Cc: emacs-devel@gnu.org > > Eli Zaretskii writes: > > > Is it while-no-input that returns immediately, or is it sit-for? > > If I repeat the recipe with only `sit-for', I get no interrupt, so > `w-n-i' seems involved. > > I started ls -R in *shell* and evaluated > > (progn (sit-for 100) > (message "!!!")) > > The *shell* buffer got still filled, but the !!! message only appeared > after I had hit a key. It's while-no-input that returns prematurely, indeed. When output from a subprocess arrives, we insert a buffer-switch event into the input queue, and that counts as input. Therefater, any code that calls maybe_quit will cause while-no-input to throw. The backtrace which shows that is below, for the record. Here's a patch, comments welcome. diff --git a/lisp/subr.el b/lisp/subr.el index 7582b6c..59f6949 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -3542,7 +3542,7 @@ with-local-quit ;; Don't throw `throw-on-input' on those events by default. (setq while-no-input-ignore-events '(focus-in focus-out help-echo iconify-frame - make-frame-visible selection-request)) + make-frame-visible selection-request buffer-switch)) (defmacro while-no-input (&rest body) "Execute BODY only as long as there's no pending input. diff --git a/src/keyboard.c b/src/keyboard.c index 1da5ac0..0d56ea3 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -3569,6 +3569,7 @@ kbd_buffer_store_buffered_event (union buffered_input_event *event, case ICONIFY_EVENT: ignore_event = Qiconify_frame; break; case DEICONIFY_EVENT: ignore_event = Qmake_frame_visible; break; case SELECTION_REQUEST_EVENT: ignore_event = Qselection_request; break; + case BUFFER_SWITCH_EVENT: ignore_event = Qbuffer_switch; break; default: ignore_event = Qnil; break; } @@ -11104,6 +11105,8 @@ syms_of_keyboard (void) /* Menu and tool bar item parts. */ DEFSYM (Qmenu_enable, "menu-enable"); + DEFSYM (Qbuffer_switch, "buffer-switch"); + #ifdef HAVE_NTGUI DEFSYM (Qlanguage_change, "language-change"); DEFSYM (Qend_session, "end-session"); Here's the backtrace I promised: #0 kbd_buffer_store_buffered_event (event=0x82ad78, hold_quit=0x0) at keyboard.c:3579 #1 0x01154d53 in kbd_buffer_store_event_hold (event=0x82ad78, hold_quit=0x0) at keyboard.h:472 #2 0x011643b5 in kbd_buffer_store_event (event=0x0) at keyboard.c:3439 #3 0x0116dd10 in record_asynch_buffer_change () at keyboard.c:6866 #4 0x012bcb86 in read_and_dispose_of_process_output ( p=0x1c35c68 , chars=0x82ae68 "0.win32.zip\r\n-rw-rw-rw- 1 Zaretzky None "..., nbytes=4096, coding=0xfc66b8) at process.c:6049 #5 0x012bc69d in read_process_output (proc=XIL(0xa000000001c35c68), channel=5) at process.c:5937 #6 0x012bb670 in wait_reading_process_output (time_limit=100, nsecs=0, read_kbd=-1, do_display=true, wait_for_cell=XIL(0), wait_proc=0x0, just_wait_proc=0) at process.c:5624 #7 0x01164d76 in kbd_buffer_get_event (kbp=0x82c434, used_mouse_menu=0x0, end_time=0x82c9d8) at keyboard.c:3810 #8 0x0115e58c in read_event_from_main_queue (end_time=0x82c9d8, local_getcjmp=0x82c850, used_mouse_menu=0x0) at keyboard.c:2151 #9 0x0115ea7b in read_decoded_event_from_main_queue (end_time=0x82c9d8, local_getcjmp=0x82c850, prev_event=XIL(0), used_mouse_menu=0x0) at keyboard.c:2214 #10 0x0116112a in read_char (commandflag=0, map=XIL(0), prev_event=XIL(0), used_mouse_menu=0x0, end_time=0x82c9d8) at keyboard.c:2802 #11 0x0127e631 in read_filtered_event (no_switch_frame=false, ascii_required=false, error_nonascii=false, input_method=true, seconds=make_number(100)) at lread.c:672 #12 0x0127ec54 in Fread_event (prompt=XIL(0), inherit_input_method=XIL(0xebd0), seconds=make_number(100)) at lread.c:788 #13 0x0123c0d9 in funcall_subr (subr=0x16a8ee0 , numargs=3, args=0x82cc38) at eval.c:2853 #14 0x0123ba8d in Ffuncall (nargs=4, args=0x82cc30) at eval.c:2773 #15 0x012a700b in exec_byte_code (bytestr=XIL(0x80000000013bc928), vector=XIL(0xa0000000013bc938), maxdepth=make_number(7), args_template=make_number(769), nargs=1, args=0x82d148) at bytecode.c:629 #16 0x0123cbef in funcall_lambda (fun=XIL(0xa0000000013bc8f8), nargs=1, arg_vector=0x82d140) at eval.c:2974 #17 0x0123c6bc in apply_lambda (fun=XIL(0xa0000000013bc8f8), args=XIL(0xc00000000744f0a0), count=20) at eval.c:2910 #18 0x01239be8 in eval_sub (form=XIL(0xc00000000744f090)) at eval.c:2283 #19 0x01231641 in Fprogn (body=XIL(0)) at eval.c:459 #20 0x01239140 in eval_sub (form=XIL(0xc00000000744d340)) at eval.c:2190 #21 0x01230f6d in For (args=XIL(0)) at eval.c:372 #22 0x01239140 in eval_sub (form=XIL(0xc00000000744d370)) at eval.c:2190 #23 0x01231641 in Fprogn (body=XIL(0)) at eval.c:459 #24 0x01234854 in Flet (args=XIL(0xc00000000744d390)) at eval.c:973 #25 0x01239140 in eval_sub (form=XIL(0xc00000000744d3a0)) at eval.c:2190 #26 0x01231641 in Fprogn (body=XIL(0)) at eval.c:459 #27 0x01234fa3 in internal_catch (tag=XIL(0x5c6bd88), func=0x123153f , arg=XIL(0xc00000000744d3b0)) at eval.c:1101 #28 0x01234f42 in Fcatch (args=XIL(0xc00000000744d3c0)) at eval.c:1078 #29 0x01239140 in eval_sub (form=XIL(0xc00000000744d3d0)) at eval.c:2190 #30 0x01231641 in Fprogn (body=XIL(0)) at eval.c:459 #31 0x01234854 in Flet (args=XIL(0xc00000000744cc30)) at eval.c:973 #32 0x01239140 in eval_sub (form=XIL(0xc00000000744cc40)) at eval.c:2190 #33 0x01235e05 in internal_lisp_condition_case (var=XIL(0), bodyform=XIL(0xc00000000744cc40), handlers=XIL(0xc0000000013bf1e0)) at eval.c:1307 #34 0x0123566b in Fcondition_case (args=XIL(0xc00000000744cc60)) at eval.c:1231 #35 0x01239140 in eval_sub (form=XIL(0xc00000000744cc70)) at eval.c:2190 #36 0x01238929 in Feval (form=XIL(0xc00000000744cc70), lexical=XIL(0)) at eval.c:2058 #37 0x0123c097 in funcall_subr (subr=0x16a79a0 , numargs=2, args=0x82e420) at eval.c:2850 #38 0x0123ba8d in Ffuncall (nargs=3, args=0x82e418) at eval.c:2773 #39 0x012a700b in exec_byte_code (bytestr=XIL(0x80000000014467d8), vector=XIL(0xa0000000014467e8), maxdepth=make_number(10), args_template=make_number(1025), nargs=4, args=0x82eb80) at bytecode.c:629 #40 0x0123cbef in funcall_lambda (fun=XIL(0xa000000001446798), nargs=4, arg_vector=0x82eb60) at eval.c:2974 #41 0x0123bae7 in Ffuncall (nargs=5, args=0x82eb58) at eval.c:2775 #42 0x0122cbe4 in Ffuncall_interactively (nargs=5, args=0x82eb58) at callint.c:252 #43 0x0123bf84 in funcall_subr (subr=0x16a75c0 , numargs=5, args=0x82eb58) at eval.c:2828 #44 0x0123ba8d in Ffuncall (nargs=6, args=0x82eb50) at eval.c:2773 #45 0x0123a621 in Fapply (nargs=3, args=0x82eda8) at eval.c:2393 #46 0x0122d435 in Fcall_interactively (function=XIL(0x120108), record_flag=XIL(0), keys=XIL(0xa000000001becb98)) at callint.c:389 #47 0x0123c0d9 in funcall_subr (subr=0x16a75e0 , numargs=3, args=0x82f000) at eval.c:2853 #48 0x0123ba8d in Ffuncall (nargs=4, args=0x82eff8) at eval.c:2773 #49 0x012a700b in exec_byte_code (bytestr=XIL(0x8000000001447618), vector=XIL(0xa000000001447628), maxdepth=make_number(13), args_template=make_number(1025), nargs=1, args=0x82f620) at bytecode.c:629 #50 0x0123cbef in funcall_lambda (fun=XIL(0xa0000000014475e8), nargs=1, arg_vector=0x82f618) at eval.c:2974 #51 0x0123bae7 in Ffuncall (nargs=2, args=0x82f610) at eval.c:2775 #52 0x0123af8c in call1 (fn=XIL(0x4398), arg1=XIL(0x120108)) at eval.c:2624 #53 0x0115bbf5 in command_loop_1 () at keyboard.c:1482 #54 0x01235ea4 in internal_condition_case (bfun=0x115afb0 , handlers=XIL(0x5b70), hfun=0x115a1dc ) at eval.c:1336 #55 0x0115aa1d in command_loop_2 (ignore=XIL(0)) at keyboard.c:1110 #56 0x01234fa3 in internal_catch (tag=XIL(0xf570), func=0x115a9e1 , arg=XIL(0)) at eval.c:1101 #57 0x0115a99c in command_loop () at keyboard.c:1089 #58 0x01159c08 in recursive_edit_1 () at keyboard.c:695 #59 0x01159eb2 in Frecursive_edit () at keyboard.c:766 #60 0x01157494 in main (argc=2, argv=0xa428d8) at emacs.c:1715 Lisp Backtrace: "read-event" (0x82cc38) "sit-for" (0x82d140) "progn" (0x82d4f8) "or" (0x82d6c8) "let" (0x82d998) "catch" (0x82dc08) "let" (0x82ded8) "condition-case" (0x82e1a8) "eval" (0x82e420) "eval-expression" (0x82eb60) "funcall-interactively" (0x82eb58) "call-interactively" (0x82f000) "command-execute" (0x82f618)