diff --git a/src/main.rs b/src/main.rs index e8469d3..231e967 100644 --- a/src/main.rs +++ b/src/main.rs @@ -438,7 +438,7 @@ pub enum Message { TabNext, TabPrev, TermEvent(pane_grid::Pane, segmented_button::Entity, TermEvent), - TermEventTx(mpsc::UnboundedSender<(pane_grid::Pane, segmented_button::Entity, TermEvent)>), + TermEventTx(mpsc::Sender<(pane_grid::Pane, segmented_button::Entity, TermEvent)>), ToggleFullscreen, ToggleContextPage(ContextPage), UpdateDefaultProfile((bool, ProfileId)), @@ -502,8 +502,7 @@ pub struct App { find: bool, find_search_id: widget::Id, find_search_value: String, - term_event_tx_opt: - Option>, + term_event_tx_opt: Option>, startup_options: Option, term_config: term::Config, color_scheme_errors: Vec, @@ -3623,7 +3622,11 @@ impl Application for App { stream::channel( 100, |mut output: iced::futures::channel::mpsc::Sender| async move { - let (event_tx, mut event_rx) = mpsc::unbounded_channel(); + // Bounded: when the GUI can't drain fast enough, alacritty's PTY reader + // blocks on send → kernel pipe fills → producing program is throttled by + // the OS. Capacity 1024 caps the queue depth; per-event memory depends on + // payload (Wakeup is ~100 B; Title/PtyWrite carry owned Strings). + let (event_tx, mut event_rx) = mpsc::channel(1024); output.send(Message::TermEventTx(event_tx)).await.unwrap(); while let Some((pane, entity, event)) = event_rx.recv().await { diff --git a/src/terminal.rs b/src/terminal.rs index 81b9f50..8d8b469 100644 --- a/src/terminal.rs +++ b/src/terminal.rs @@ -99,13 +99,16 @@ impl From for WindowSize { pub struct EventProxy( pane_grid::Pane, segmented_button::Entity, - mpsc::UnboundedSender<(pane_grid::Pane, segmented_button::Entity, Event)>, + mpsc::Sender<(pane_grid::Pane, segmented_button::Entity, Event)>, ); impl EventListener for EventProxy { fn send_event(&self, event: Event) { - //TODO: handle error - let _ = self.2.send((self.0, self.1, event)); + // Bounded channel; blocking_send propagates backpressure to alacritty's + // PTY reader instead of letting events accumulate. Called from alacritty's + // std::thread PTY reader (not a tokio worker), so blocking is safe and + // blocking_send won't panic. + let _ = self.2.blocking_send((self.0, self.1, event)); } } @@ -270,7 +273,7 @@ impl Terminal { pub fn new( pane: pane_grid::Pane, entity: segmented_button::Entity, - event_tx: mpsc::UnboundedSender<(pane_grid::Pane, segmented_button::Entity, Event)>, + event_tx: mpsc::Sender<(pane_grid::Pane, segmented_button::Entity, Event)>, config: Config, options: Options, app_config: &AppConfig,