diff --git a/crates/terminal/src/model.rs b/crates/terminal/src/model.rs index f1b2dd36cff0d698131cbf70b5ed82f8e19e4f1e..481ebce3a4912cbf21351e3ab08847a43daaf837 100644 --- a/crates/terminal/src/model.rs +++ b/crates/terminal/src/model.rs @@ -12,12 +12,9 @@ use alacritty_terminal::{ Term, }; use anyhow::{bail, Result}; -use futures::{ - channel::mpsc::{unbounded, UnboundedReceiver, UnboundedSender}, - StreamExt, -}; +use futures::channel::mpsc::{unbounded, UnboundedReceiver, UnboundedSender}; use settings::{Settings, Shell}; -use std::{collections::HashMap, fmt::Display, path::PathBuf, sync::Arc}; +use std::{collections::HashMap, fmt::Display, path::PathBuf, sync::Arc, time::Duration}; use thiserror::Error; use gpui::{keymap::Keystroke, ClipboardItem, CursorStyle, Entity, ModelContext}; @@ -234,18 +231,34 @@ impl TerminalBuilder { pub fn subscribe(mut self, cx: &mut ModelContext) -> Terminal { cx.spawn_weak(|this, mut cx| async move { - //Listen for terminal events - while let Some(event) = self.events_rx.next().await { + 'outer: loop { + let delay = cx.background().timer(Duration::from_secs_f32(1.0 / 30.)); + + let mut events = vec![]; + + loop { + match self.events_rx.try_next() { + //Have a buffered event + Ok(Some(e)) => events.push(e), + //Ran out of buffered events + Ok(None) => break, + //Channel closed, exit + Err(_) => break 'outer, + } + } + match this.upgrade(&cx) { Some(this) => { this.update(&mut cx, |this, cx| { - this.process_terminal_event(event, cx); - - cx.notify(); + for event in events { + this.process_terminal_event(event, cx); + } }); } - None => break, + None => break 'outer, } + + delay.await; } }) .detach();