diff --git a/crates/egui-term/src/alacritty/mod.rs b/crates/egui-term/src/alacritty/mod.rs index 87449de..d643f7f 100644 --- a/crates/egui-term/src/alacritty/mod.rs +++ b/crates/egui-term/src/alacritty/mod.rs @@ -230,8 +230,10 @@ impl Terminal { let event_proxy = EventProxy(event_sender); let term = Term::new(config, &term_size, event_proxy.clone()); let term = Arc::new(FairMutex::new(term)); + let pty_event_loop = EventLoop::new(term.clone(), event_proxy, pty, false, false)?; let notifier = Notifier(pty_event_loop.channel()); + let pty_notifier = Notifier(pty_event_loop.channel()); let url_regex = r#"(ipfs:|ipns:|magnet:|mailto:|gemini://|gopher://|https://|http://|news:|file://|git://|ssh:|ftp://)[^\u{0000}-\u{001F}\u{007F}-\u{009F}<>"\s{-}\^⟨⟩`]+"#; let url_regex = @@ -246,8 +248,10 @@ impl Terminal { panic!("pty_event_subscription_{id}: sending PtyEvent is failed, error: {err}") }); app_context.request_repaint(); - if let Event::Exit = event { - break; + match event { + Event::Exit => break, + Event::PtyWrite(s) => pty_notifier.notify(s.into_bytes()), + _ => {} } })?; @@ -353,6 +357,7 @@ impl<'a> TerminalContext<'a> { pub fn write_data>>(&mut self, data: I) { self.write(data); self.terminal.scroll_display(Scroll::Bottom); + self.terminal.selection = None; } fn process_link(&mut self, link_action: LinkAction, point: Point) { diff --git a/crates/egui-term/src/view.rs b/crates/egui-term/src/view.rs index 88e6da9..8882a81 100644 --- a/crates/egui-term/src/view.rs +++ b/crates/egui-term/src/view.rs @@ -256,10 +256,15 @@ impl<'a> TerminalView<'a> { modifiers, pos, } => { - let new_pos = if is_in_terminal(pos, layout.rect) { - pos - } else { + let out_of = !is_in_terminal(pos, layout.rect); + if out_of && pressed { + continue; + } + + let new_pos = if out_of { pos.clamp(layout.rect.min, layout.rect.max) + } else { + pos }; if let Some(action) =