use alacritty_terminal::event::{Event, EventListener};
use std::sync::mpsc::Sender;
#[derive(Debug, Clone)]
pub enum TerminalEvent {
Wakeup,
Bell,
Title(String),
ClipboardStore(String),
ClipboardLoad,
Exit,
}
pub struct GpuiEventProxy {
tx: Sender<TerminalEvent>,
}
impl GpuiEventProxy {
pub fn new(tx: Sender<TerminalEvent>) -> Self {
Self { tx }
}
fn send(&self, event: TerminalEvent) {
let _ = self.tx.send(event);
}
}
impl EventListener for GpuiEventProxy {
fn send_event(&self, event: Event) {
match event {
Event::Wakeup => {
self.send(TerminalEvent::Wakeup);
}
Event::Bell => {
self.send(TerminalEvent::Bell);
}
Event::Title(title) => {
self.send(TerminalEvent::Title(title));
}
Event::ClipboardStore(_clipboard_type, data) => {
self.send(TerminalEvent::ClipboardStore(data));
}
Event::ClipboardLoad(_clipboard_type, _format) => {
self.send(TerminalEvent::ClipboardLoad);
}
Event::Exit => {
self.send(TerminalEvent::Exit);
}
Event::MouseCursorDirty => {}
Event::PtyWrite(ref _data) => {}
Event::ColorRequest(ref _index, ref _format) => {}
Event::TextAreaSizeRequest(ref _format) => {}
Event::CursorBlinkingChange => {}
Event::ResetTitle => {
self.send(TerminalEvent::Title(String::new()));
}
Event::ChildExit(_exit_code) => {
self.send(TerminalEvent::Exit);
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::sync::mpsc::channel;
#[test]
fn test_event_proxy_creation() {
let (tx, _rx) = channel();
let _proxy = GpuiEventProxy::new(tx);
}
#[test]
fn test_wakeup_event() {
let (tx, rx) = channel();
let proxy = GpuiEventProxy::new(tx);
proxy.send_event(Event::Wakeup);
let event = rx.recv().unwrap();
assert!(matches!(event, TerminalEvent::Wakeup));
}
#[test]
fn test_bell_event() {
let (tx, rx) = channel();
let proxy = GpuiEventProxy::new(tx);
proxy.send_event(Event::Bell);
let event = rx.recv().unwrap();
assert!(matches!(event, TerminalEvent::Bell));
}
#[test]
fn test_title_event() {
let (tx, rx) = channel();
let proxy = GpuiEventProxy::new(tx);
proxy.send_event(Event::Title("Test Title".to_string()));
let event = rx.recv().unwrap();
match event {
TerminalEvent::Title(title) => assert_eq!(title, "Test Title"),
_ => panic!("Expected Title event"),
}
}
#[test]
fn test_clipboard_store_event() {
use alacritty_terminal::term::ClipboardType;
let (tx, rx) = channel();
let proxy = GpuiEventProxy::new(tx);
proxy.send_event(Event::ClipboardStore(
ClipboardType::Clipboard,
"clipboard data".to_string(),
));
let event = rx.recv().unwrap();
match event {
TerminalEvent::ClipboardStore(data) => assert_eq!(data, "clipboard data"),
_ => panic!("Expected ClipboardStore event"),
}
}
#[test]
fn test_clipboard_load_event() {
use alacritty_terminal::term::ClipboardType;
use std::sync::Arc;
let (tx, rx) = channel();
let proxy = GpuiEventProxy::new(tx);
let callback = Arc::new(|s: &str| s.to_string());
proxy.send_event(Event::ClipboardLoad(ClipboardType::Clipboard, callback));
let event = rx.recv().unwrap();
assert!(matches!(event, TerminalEvent::ClipboardLoad));
}
#[test]
fn test_exit_event() {
let (tx, rx) = channel();
let proxy = GpuiEventProxy::new(tx);
proxy.send_event(Event::Exit);
let event = rx.recv().unwrap();
assert!(matches!(event, TerminalEvent::Exit));
}
#[test]
fn test_reset_title_event() {
let (tx, rx) = channel();
let proxy = GpuiEventProxy::new(tx);
proxy.send_event(Event::ResetTitle);
let event = rx.recv().unwrap();
match event {
TerminalEvent::Title(title) => assert!(title.is_empty()),
_ => panic!("Expected Title event"),
}
}
#[test]
fn test_ignored_events() {
let (tx, rx) = channel();
let proxy = GpuiEventProxy::new(tx);
proxy.send_event(Event::MouseCursorDirty);
proxy.send_event(Event::CursorBlinkingChange);
assert!(rx.try_recv().is_err());
}
#[test]
fn test_disconnected_channel() {
let (tx, rx) = channel();
let proxy = GpuiEventProxy::new(tx);
drop(rx);
proxy.send_event(Event::Wakeup);
}
}