mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 19:56:42 +01:00
okay now it does not deadlock
This commit is contained in:
parent
685ccfaf49
commit
80086b9a8b
5 changed files with 36 additions and 36 deletions
|
|
@ -15,3 +15,4 @@ midly = "0.5"
|
|||
once_cell = "1.19.0"
|
||||
ratatui = { version = "0.26.3", features = [ "unstable-widget-ref", "underline-color" ] }
|
||||
toml = "0.8.12"
|
||||
#no_deadlocks = "1.3.2"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
use crate::{*, jack::*};
|
||||
use jack::*;
|
||||
use crate::*;
|
||||
|
||||
/// A UI component that may be associated with a JACK client by the `Jack` factory.
|
||||
pub trait Device<E: Engine>: Component<E> + Process {
|
||||
|
|
|
|||
|
|
@ -17,8 +17,6 @@ pub struct Tui {
|
|||
backend: CrosstermBackend<Stdout>,
|
||||
event: RwLock<Option<TuiEvent>>,
|
||||
area: Rect,
|
||||
sleep: Duration,
|
||||
poll: Duration,
|
||||
}
|
||||
impl Engine for Tui {
|
||||
type HandleInput = Self;
|
||||
|
|
@ -42,26 +40,10 @@ impl Engine for Tui {
|
|||
stdout().execute(LeaveAlternateScreen)?;
|
||||
disable_raw_mode().map_err(Into::into)
|
||||
}
|
||||
fn handle (&self, state: &mut impl Handle<Self>) -> Usually<()> {
|
||||
if ::crossterm::event::poll(self.poll).is_ok() {
|
||||
let event = ::crossterm::event::read().unwrap();
|
||||
if let Event::Key(KeyEvent {
|
||||
code: KeyCode::Char('c'), modifiers: KeyModifiers::CONTROL, ..
|
||||
}) = event {
|
||||
self.exited.store(true, Ordering::Relaxed);
|
||||
} else {
|
||||
*self.event.write().unwrap() = Some(TuiEvent::Input(event));
|
||||
let result = state.handle(self);
|
||||
if let Err(e) = result {
|
||||
panic!("{e}")
|
||||
}
|
||||
}
|
||||
}
|
||||
fn handle (&self, _: &mut impl Handle<Self>) -> Usually<()> {
|
||||
Ok(())
|
||||
}
|
||||
fn render (&mut self, state: &impl Render<Self>) -> Usually<()> {
|
||||
state.render(self).expect("render failed");
|
||||
self.flip();
|
||||
fn render (&mut self, _: &impl Render<Self>) -> Usually<()> {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
@ -72,42 +54,58 @@ impl Tui {
|
|||
) -> Usually<Arc<RwLock<R>>> {
|
||||
let backend = CrosstermBackend::new(stdout());
|
||||
let area = backend.size()?;
|
||||
let engine = Arc::new(RwLock::new(Self {
|
||||
sleep: Duration::from_millis(20),
|
||||
poll: Duration::from_millis(100),
|
||||
let mut engine = Self {
|
||||
exited: Arc::new(AtomicBool::new(false)),
|
||||
event: RwLock::new(None),
|
||||
buffer: 0,
|
||||
buffers: [Buffer::empty(area), Buffer::empty(area)],
|
||||
backend,
|
||||
area,
|
||||
}));
|
||||
};
|
||||
engine.setup()?;
|
||||
let engine = Arc::new(RwLock::new(engine));
|
||||
let _input_thread = {
|
||||
let engine = engine.clone();
|
||||
let state = state.clone();
|
||||
let poll = Duration::from_millis(100);
|
||||
spawn(move || loop {
|
||||
let engine = engine.read().unwrap();
|
||||
if engine.exited() {
|
||||
if ::crossterm::event::poll(poll).is_ok() {
|
||||
let event = TuiEvent::Input(::crossterm::event::read().unwrap());
|
||||
match event {
|
||||
key!(Ctrl-KeyCode::Char('c')) => {
|
||||
engine.write().unwrap().exited.store(true, Ordering::Relaxed);
|
||||
},
|
||||
_ => {
|
||||
*engine.write().unwrap().event.write().unwrap() = Some(event);
|
||||
if let Err(e) = state.write().unwrap().handle(&*engine.read().unwrap()) {
|
||||
panic!("{e}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if engine.read().unwrap().exited() {
|
||||
break
|
||||
}
|
||||
engine.handle(&mut *state.write().unwrap()).expect("handle failed");
|
||||
//engine.read().unwrap().handle(&mut *state.write().unwrap()).expect("handle failed");
|
||||
})
|
||||
};
|
||||
let main_thread = {
|
||||
let engine = engine.clone();
|
||||
let state = state.clone();
|
||||
let sleep = Duration::from_millis(20);
|
||||
spawn(move || loop {
|
||||
let mut engine = engine.write().unwrap();
|
||||
if engine.exited() {
|
||||
break
|
||||
}
|
||||
if let Ok(state) = state.try_read() {
|
||||
if let (Ok(mut engine), Ok(state)) = (engine.write(), state.try_read()) {
|
||||
if engine.exited() {
|
||||
break
|
||||
}
|
||||
engine.render(&*state).expect("render failed");
|
||||
engine.flip();
|
||||
}
|
||||
std::thread::sleep(engine.sleep);
|
||||
std::thread::sleep(sleep);
|
||||
})
|
||||
};
|
||||
main_thread.join().expect("main thread failed");
|
||||
engine.write().unwrap().teardown()?;
|
||||
Ok(state)
|
||||
}
|
||||
pub fn event (&self) -> TuiEvent {
|
||||
|
|
|
|||
|
|
@ -32,4 +32,4 @@ path = "src/sampler_main.rs"
|
|||
|
||||
[[bin]]
|
||||
name = "tek_plugin"
|
||||
path = "src/sampler_main.rs"
|
||||
path = "src/plugin_main.rs"
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ impl TransportToolbar {
|
|||
transport.write().unwrap().jack = Some(
|
||||
jack.activate(
|
||||
&transport.clone(),
|
||||
|state, client, scope| {
|
||||
|state: &Arc<RwLock<TransportToolbar>>, client, scope| {
|
||||
state.write().unwrap().process(client, scope)
|
||||
}
|
||||
)?
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue