Skip to content

Commit 8e5aba2

Browse files
committed
feat: use ratatui included termion
1 parent 3b28c02 commit 8e5aba2

File tree

20 files changed

+132
-116
lines changed

20 files changed

+132
-116
lines changed

Cargo.lock

Lines changed: 3 additions & 37 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ signal-hook = "^0"
4343
skim = "^0"
4444
strfmt = "^0"
4545
symphonia = { version = "^0", features = ["all"] }
46-
termion = "^1"
4746
toml = "^0"
4847
tracing = "^0"
4948
tracing-subscriber = { version = "^0", features = [ "std", "env-filter" ] }

src/bin/client/config/keymap/keymapping.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1+
use ratatui::termion::event::Event;
12
use serde::Deserialize;
23

34
use std::collections::{hash_map::Entry, HashMap};
45
use std::convert::{AsMut, AsRef, From};
56

6-
use termion::event::Event;
77
#[cfg(feature = "mouse")]
8-
use termion::event::MouseEvent;
8+
use ratatui::termion::event::MouseEvent;
99

1010
use dizi::error::DiziResult;
1111
use dizi::request::client::ClientRequest;
@@ -118,7 +118,7 @@ fn vec_to_map(vec: &[CommandKeymap]) -> HashMap<Event, CommandKeybind> {
118118
Err(e) => match e {
119119
KeymapError::Conflict => {
120120
let events_str: Vec<String> =
121-
events.iter().map(|e| e.to_string()).collect();
121+
events.iter().map(|event| event.to_key_string()).collect();
122122
eprintln!("Error: Ambiguous Keymapping: Multiple commands mapped to key sequence {:?} {}", events_str, command_str);
123123
}
124124
},

src/bin/client/context/app_context.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use dizi::utils;
99
use crate::config;
1010
use crate::config::option::WidgetType;
1111
use crate::context::{CommandLineContext, MessageQueue, ServerState, TabContext};
12-
use crate::event::{AppEvent, Events};
12+
use crate::event::{AppEvent, AppEventListener};
1313
use crate::util::search::SearchPattern;
1414

1515
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
@@ -27,7 +27,7 @@ pub struct UiContext {
2727
pub struct AppContext {
2828
pub quit: QuitType,
2929
// event loop querying
30-
pub events: Events,
30+
pub event_listener: AppEventListener,
3131
// server unix socket
3232
pub stream: UnixStream,
3333
pub view_widget: WidgetType,
@@ -50,7 +50,7 @@ pub struct AppContext {
5050

5151
impl AppContext {
5252
pub fn new(config: config::AppConfig, _cwd: PathBuf, stream: UnixStream) -> Self {
53-
let events = Events::new();
53+
let events = AppEventListener::new();
5454

5555
let mut commandline_context = CommandLineContext::new();
5656
commandline_context.history_mut().set_max_len(20);
@@ -60,7 +60,7 @@ impl AppContext {
6060
config,
6161
stream,
6262
view_widget: WidgetType::FileBrowser,
63-
events,
63+
event_listener: events,
6464
commandline_context,
6565
search_context: None,
6666
tab_context: TabContext::new(),
@@ -80,13 +80,13 @@ impl AppContext {
8080

8181
// event related
8282
pub fn poll_event(&self) -> Result<AppEvent, mpsc::RecvError> {
83-
self.events.next()
83+
self.event_listener.next()
8484
}
8585
pub fn flush_event(&self) {
86-
self.events.flush();
86+
self.event_listener.flush();
8787
}
8888
pub fn clone_event_tx(&self) -> mpsc::Sender<AppEvent> {
89-
self.events.event_tx.clone()
89+
self.event_listener.event_tx.clone()
9090
}
9191

9292
pub fn config_ref(&self) -> &config::AppConfig {

src/bin/client/event/app_event.rs

Lines changed: 17 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
use std::io;
22
use std::path;
33
use std::sync::mpsc;
4+
use std::sync::mpsc::Sender;
45
use std::thread;
56

6-
use signal_hook::consts::signal;
7-
use signal_hook::iterator::exfiltrator::SignalOnly;
8-
use signal_hook::iterator::SignalsInfo;
9-
10-
use termion::event::Event;
11-
use termion::input::TermRead;
7+
use ratatui::termion::event::Event;
128

9+
use crate::event::input_listener::TerminalInputListener;
10+
use crate::event::SignalListener;
1311
use crate::fs::JoshutoDirList;
1412

13+
pub type AppEventSender = Sender<AppEvent>;
14+
1515
#[derive(Debug)]
1616
pub enum AppEvent {
17-
Termion(Event),
17+
TerminalEvent(Event),
1818
// preview thread events
1919
PreviewDir {
2020
path: path::PathBuf,
@@ -24,55 +24,36 @@ pub enum AppEvent {
2424
Server(String),
2525
}
2626

27-
#[derive(Debug, Default, Clone, Copy)]
28-
pub struct Config {}
29-
30-
pub struct Events {
27+
pub struct AppEventListener {
3128
pub event_tx: mpsc::Sender<AppEvent>,
3229
event_rx: mpsc::Receiver<AppEvent>,
3330
pub input_tx: mpsc::Sender<()>,
3431
}
3532

36-
impl Events {
33+
impl AppEventListener {
3734
pub fn new() -> Self {
38-
Events::with_config()
35+
AppEventListener::with_config()
3936
}
4037

4138
pub fn with_config() -> Self {
4239
let (input_tx, input_rx) = mpsc::channel();
4340
let (event_tx, event_rx) = mpsc::channel();
4441

45-
// edge case that starts off the input thread
46-
let _ = input_tx.send(());
47-
4842
// signal thread
49-
let event_tx2 = event_tx.clone();
43+
let signal_listener = SignalListener::new(event_tx.clone());
5044
let _ = thread::spawn(move || {
51-
let sigs = vec![signal::SIGWINCH];
52-
let mut signals = SignalsInfo::<SignalOnly>::new(&sigs).unwrap();
53-
for signal in &mut signals {
54-
if let Err(e) = event_tx2.send(AppEvent::Signal(signal)) {
55-
eprintln!("Signal thread send err: {:#?}", e);
56-
return;
57-
}
58-
}
45+
signal_listener.run();
5946
});
6047

48+
// edge case that starts off the input thread
49+
let _ = input_tx.send(());
6150
// input thread
62-
let event_tx2 = event_tx.clone();
51+
let input_listener = TerminalInputListener::new(event_tx.clone(), input_rx);
6352
let _ = thread::spawn(move || {
64-
let stdin = io::stdin();
65-
let mut events = stdin.events();
66-
67-
loop {
68-
let _ = input_rx.recv();
69-
if let Some(Ok(event)) = events.next() {
70-
let _ = event_tx2.send(AppEvent::Termion(event));
71-
}
72-
}
53+
input_listener.run();
7354
});
7455

75-
Events {
56+
AppEventListener {
7657
event_tx,
7758
event_rx,
7859
input_tx,
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
use std::{io, sync::mpsc::Receiver};
2+
3+
use ratatui::termion::input::TermRead;
4+
5+
use crate::event::{AppEvent, AppEventSender};
6+
7+
pub type InputEventReceiver = Receiver<()>;
8+
9+
/// Listens for terminal inputs
10+
#[derive(Debug)]
11+
pub struct TerminalInputListener {
12+
pub event_tx: AppEventSender,
13+
// Used to make sure we only poll for terminal input when we want to
14+
pub input_rx: InputEventReceiver,
15+
}
16+
17+
impl TerminalInputListener {
18+
pub fn new(event_tx: AppEventSender, input_rx: InputEventReceiver) -> Self {
19+
Self { event_tx, input_rx }
20+
}
21+
22+
pub fn run(self) {
23+
let stdin = io::stdin();
24+
let mut events = stdin.events();
25+
26+
loop {
27+
let _ = self.input_rx.recv();
28+
if let Some(Ok(event)) = events.next() {
29+
let _ = self.event_tx.send(AppEvent::TerminalEvent(event));
30+
}
31+
}
32+
}
33+
}

src/bin/client/event/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
pub mod app_event;
22
pub mod process_event;
33

4+
mod input_listener;
5+
mod signal_listener;
6+
7+
pub use input_listener::*;
8+
pub use signal_listener::*;
9+
410
pub use self::app_event::*;

src/bin/client/event/process_event.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use std::io;
22
use std::path;
33

44
use dizi::song::DiziSongEntry;
5+
use ratatui::termion::event::{Event, Key};
56
use signal_hook::consts::signal;
6-
use termion::event::{Event, Key};
77

88
use dizi::error::DiziResult;
99
use dizi::player::PlayerStatus;
@@ -33,7 +33,7 @@ pub fn get_input_while_composite<'a>(
3333

3434
if let Ok(event) = context.poll_event() {
3535
match event {
36-
AppEvent::Termion(event) => {
36+
AppEvent::TerminalEvent(event) => {
3737
match event {
3838
Event::Key(Key::Esc) => return None,
3939
event => match keymap.get(&event) {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use signal_hook::consts::signal;
2+
use signal_hook::iterator::exfiltrator::SignalOnly;
3+
use signal_hook::iterator::SignalsInfo;
4+
5+
use crate::event::{AppEvent, AppEventSender};
6+
7+
#[derive(Clone, Debug)]
8+
pub struct SignalListener {
9+
pub event_tx: AppEventSender,
10+
}
11+
12+
impl SignalListener {
13+
pub fn new(event_tx: AppEventSender) -> Self {
14+
Self { event_tx }
15+
}
16+
17+
pub fn run(self) {
18+
let sigs = vec![signal::SIGWINCH];
19+
let mut signals = SignalsInfo::<SignalOnly>::new(&sigs).unwrap();
20+
for signal in &mut signals {
21+
if let Err(e) = self.event_tx.send(AppEvent::Signal(signal)) {
22+
eprintln!("Signal thread send err: {:#?}", e);
23+
return;
24+
}
25+
}
26+
}
27+
}

src/bin/client/key_command/impl_appexecute.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use dizi::error::DiziResult;
22
use dizi::request::client::ClientRequest;
3-
use termion::event::Key;
3+
use ratatui::termion::event::Key;
44

55
use crate::config::option::WidgetType;
66
use crate::config::AppKeyMapping;

0 commit comments

Comments
 (0)