# HG changeset patch # User Kim F. Storm # Date 1092781469 0 # Node ID e327231e4361ad78e05813b0ae2f5cd2c14d088b # Parent 33e68be5c2510493acaf70ca81f2033b1bdcebeb (Faccept_process_output): Add arg JUST-THIS-ONE; forward to wait_reading_process_input via DO_DISPLAY arg. (wait_reading_process_input): If DO_DISPLAY < 0 for a process object, only process output from that process; also inhibit running timers if DO_DISPLAY==-2. diff -r 33e68be5c251 -r e327231e4361 src/process.c --- a/src/process.c Tue Aug 17 21:59:07 2004 +0000 +++ b/src/process.c Tue Aug 17 22:24:29 2004 +0000 @@ -3718,7 +3718,7 @@ } DEFUN ("accept-process-output", Faccept_process_output, Saccept_process_output, - 0, 3, 0, + 0, 4, 0, doc: /* Allow any pending output from subprocesses to be read by Emacs. It is read into the process' buffers or given to their filter functions. Non-nil arg PROCESS means do not return until some output has been received @@ -3726,15 +3726,20 @@ Non-nil second arg TIMEOUT and third arg TIMEOUT-MSECS are number of seconds and microseconds to wait; return after that much time whether or not there is input. +If optional fourth arg JUST-THIS-ONE is non-nil, only accept output +from PROCESS, suspending reading output from other processes. +If JUST-THIS-ONE is an integer, don't run any timers either. Return non-nil iff we received any output before the timeout expired. */) - (process, timeout, timeout_msecs) - register Lisp_Object process, timeout, timeout_msecs; + (process, timeout, timeout_msecs, just_this_one) + register Lisp_Object process, timeout, timeout_msecs, just_this_one; { int seconds; int useconds; if (! NILP (process)) CHECK_PROCESS (process); + else + just_this_one = Qnil; if (! NILP (timeout_msecs)) { @@ -3776,7 +3781,9 @@ XSETFASTINT (process, 0); return - (wait_reading_process_input (seconds, useconds, process, 0) + (wait_reading_process_input (seconds, useconds, process, + NILP (just_this_one) ? 0 : + !INTEGERP (just_this_one) ? -1 : -2) ? Qt : Qnil); } @@ -4009,8 +4016,11 @@ process. The return value is true iff we read some input from that process. - DO_DISPLAY != 0 means redisplay should be done to show subprocess - output that arrives. + If READ_KBD is a process object, DO_DISPLAY < 0 means handle only + output from that process (suspending output from other processes) + and DO_DISPLAY == -2 specifically means don't run any timers either. + Otherwise, != 0 means redisplay should be done to show subprocess + output that arrives. If READ_KBD is a pointer to a struct Lisp_Process, then the function returns true iff we received input from that process @@ -4032,6 +4042,7 @@ EMACS_TIME timeout, end_time; int wait_channel = -1; struct Lisp_Process *wait_proc = 0; + int just_wait_proc = 0; int got_some_input = 0; /* Either nil or a cons cell, the car of which is of interest and may be changed outside of this routine. */ @@ -4048,6 +4059,11 @@ wait_proc = XPROCESS (read_kbd); wait_channel = XINT (wait_proc->infd); XSETFASTINT (read_kbd, 0); + if (do_display < 0) + { + just_wait_proc = do_display; + do_display = 0; + } } /* If waiting for non-nil in a cell, record where. */ @@ -4122,7 +4138,8 @@ But not if wait_for_cell; in those cases, the wait is supposed to be short, and those callers cannot handle running arbitrary Lisp code here. */ - if (NILP (wait_for_cell)) + if (NILP (wait_for_cell) + && just_wait_proc != -2) { EMACS_TIME timer_delay; @@ -4258,7 +4275,12 @@ /* Wait till there is something to do */ - if (!NILP (wait_for_cell)) + if (just_wait_proc) + { + FD_SET (XINT (wait_proc->infd), &Available); + check_connect = check_delay = 0; + } + else if (!NILP (wait_for_cell)) { Available = non_process_wait_mask; check_connect = check_delay = 0;