From 440b816f8e9fea21128973faaf6d1359b5fe3b22 Mon Sep 17 00:00:00 2001 From: Akib Azmain Turja Date: Thu, 26 Oct 2023 13:58:24 +0600 Subject: [PATCH] Don't queue input * eat.el (eat--pending-input-chunks) (eat--defer-input-processing, eat--process-input-queue-timer): Remove. All references updated. * eat.el (eat--send-input): Send the input immediately. * eat.el (eat--process-input-queue): Remove. * eat.el (eat--eshell-process-output-queue) (eat--process-output-queue): Loop while output queue isn't empty, set 'eat--output-queue-first-chunk-time' to 't' in the loop. * eat.el (eat--filter, eat--eshell-filter): Don't start a timer if 'eat--output-queue-first-chunk-time' is 't'. --- eat.el | 133 ++++++++++++++++++++++----------------------------------- 1 file changed, 51 insertions(+), 82 deletions(-) diff --git a/eat.el b/eat.el index 89558f8..ac4826e 100644 --- a/eat.el +++ b/eat.el @@ -6598,9 +6598,6 @@ END if it's safe to do so." isearch-search-fun-function isearch-wrap-function isearch-push-state-function - eat--pending-input-chunks - eat--process-input-queue-timer - eat--defer-input-processing eat--pending-output-chunks eat--output-queue-first-chunk-time eat--process-output-queue-timer @@ -6732,17 +6729,6 @@ The output chunks are pushed, so last output appears first.") (defvar eat--process-output-queue-timer nil "Timer to process output queue.") -(defvar eat--pending-input-chunks nil - "The list of pending input chunks. - -The input chunks are pushed, so last input appears first.") - -(defvar eat--process-input-queue-timer nil - "Timer to process input queue.") - -(defvar eat--defer-input-processing nil - "Non-nil meaning process input later.") - (defvar eat--shell-prompt-annotation-correction-timer nil "Timer to correct shell prompt annotations.") @@ -6772,30 +6758,9 @@ OS's." (defun eat--send-input (_ input) "Send INPUT to subprocess." - (push input eat--pending-input-chunks) - (unless eat--process-input-queue-timer - (setq eat--process-input-queue-timer - (run-with-idle-timer 0 nil #'eat--process-input-queue - (current-buffer))))) - -(defun eat--process-input-queue (buffer) - "Process the input queue on BUFFER." - (when (buffer-live-p buffer) - (with-current-buffer buffer - ;; We don't want to recurse this function. - (unless eat--defer-input-processing - (let ((inhibit-quit t) ; Don't disturb! - (eat--defer-input-processing t) + (when-let* ((eat-terminal) (proc (eat-term-parameter eat-terminal 'eat--process))) - (when (process-live-p proc) - (while eat--pending-input-chunks - (let ((chunks (nreverse eat--pending-input-chunks))) - (setq eat--pending-input-chunks nil) - (dolist (str chunks) - (eat--send-string proc str))))))) - (when eat--process-input-queue-timer - (cancel-timer eat--process-input-queue-timer)) - (setq eat--process-input-queue-timer nil)))) + (eat--send-string proc input))) (defun eat--process-output-queue (buffer) "Process the output queue on BUFFER." @@ -6813,10 +6778,12 @@ OS's." (when eat--process-output-queue-timer (cancel-timer eat--process-output-queue-timer)) (setq eat--output-queue-first-chunk-time nil) - (let ((queue eat--pending-output-chunks)) - (setq eat--pending-output-chunks nil) - (dolist (output (nreverse queue)) - (eat-term-process-output eat-terminal output))) + (while eat--pending-output-chunks + (let ((queue eat--pending-output-chunks) + (eat--output-queue-first-chunk-time t)) + (setq eat--pending-output-chunks nil) + (dolist (output (nreverse queue)) + (eat-term-process-output eat-terminal output)))) (eat-term-redisplay eat-terminal) ;; Truncate output of previous dead processes. (when (and eat-term-scrollback-size @@ -6853,17 +6820,19 @@ OS's." (unless eat--output-queue-first-chunk-time (setq eat--output-queue-first-chunk-time (current-time))) (push output eat--pending-output-chunks) - (let ((time-left - (- eat-maximum-latency - (float-time - (time-subtract - nil eat--output-queue-first-chunk-time))))) - (if (<= time-left 0) - (eat--process-output-queue (current-buffer)) - (setq eat--process-output-queue-timer - (run-with-timer - (min time-left eat-minimum-latency) nil - #'eat--process-output-queue (current-buffer)))))))) + (unless (eq eat--output-queue-first-chunk-time t) + (let ((time-left + (- eat-maximum-latency + (float-time + (time-subtract + nil eat--output-queue-first-chunk-time))))) + (if (<= time-left 0) + (eat--process-output-queue (current-buffer)) + (setq eat--process-output-queue-timer + (run-with-timer + (min time-left eat-minimum-latency) nil + #'eat--process-output-queue + (current-buffer))))))))) (defun eat--sentinel (process message) "Sentinel for Eat buffers. @@ -7415,20 +7384,22 @@ PROGRAM can be a shell command." (when eat--process-output-queue-timer (cancel-timer eat--process-output-queue-timer)) (setq eat--output-queue-first-chunk-time nil) - (let ((queue eat--pending-output-chunks)) - (setq eat--pending-output-chunks nil) - (if (eval-when-compile (< emacs-major-version 27)) - (eshell-output-filter - process (string-join (nreverse queue))) - (combine-change-calls - (eat-term-beginning eat-terminal) - (eat-term-end eat-terminal) - ;; TODO: Is `string-join' OK or should we use a loop? - (if (eval-when-compile (< emacs-major-version 30)) - (eshell-output-filter - process (string-join (nreverse queue))) - (eshell-interactive-process-filter - process (string-join (nreverse queue)))))))))) + (while eat--pending-output-chunks + (let ((queue eat--pending-output-chunks) + (eat--output-queue-first-chunk-time t)) + (setq eat--pending-output-chunks nil) + (if (eval-when-compile (< emacs-major-version 27)) + (eshell-output-filter + process (string-join (nreverse queue))) + (combine-change-calls + (eat-term-beginning eat-terminal) + (eat-term-end eat-terminal) + ;; TODO: Is `string-join' OK or should we use a loop? + (if (eval-when-compile (< emacs-major-version 30)) + (eshell-output-filter + process (string-join (nreverse queue))) + (eshell-interactive-process-filter + process (string-join (nreverse queue))))))))))) (defun eat--eshell-filter (process string) "Process output STRING from PROCESS." @@ -7439,19 +7410,20 @@ PROGRAM can be a shell command." (unless eat--output-queue-first-chunk-time (setq eat--output-queue-first-chunk-time (current-time))) (push string eat--pending-output-chunks) - (let ((time-left - (- eat-maximum-latency - (float-time - (time-subtract - nil eat--output-queue-first-chunk-time))))) - (if (<= time-left 0) - (eat--eshell-process-output-queue - process (current-buffer)) - (setq eat--process-output-queue-timer - (run-with-timer - (min time-left eat-minimum-latency) nil - #'eat--eshell-process-output-queue process - (current-buffer)))))))) + (unless (eq eat--output-queue-first-chunk-time t) + (let ((time-left + (- eat-maximum-latency + (float-time + (time-subtract + nil eat--output-queue-first-chunk-time))))) + (if (<= time-left 0) + (eat--eshell-process-output-queue + process (current-buffer)) + (setq eat--process-output-queue-timer + (run-with-timer + (min time-left eat-minimum-latency) nil + #'eat--eshell-process-output-queue process + (current-buffer))))))))) (declare-function eshell-sentinel "esh-proc" (proc string)) @@ -7586,9 +7558,6 @@ symbol `buffer', in which case the point of current buffer is set." eat-terminal eat--synchronize-scroll-function eat--mouse-grabbing-type - eat--pending-input-chunks - eat--process-input-queue-timer - eat--defer-input-processing eat--pending-output-chunks eat--output-queue-first-chunk-time eat--process-output-queue-timer