diff --git a/server-cli/src/tui_runner.rs b/server-cli/src/tui_runner.rs index e215496bb8..2ad1cfa457 100644 --- a/server-cli/src/tui_runner.rs +++ b/server-cli/src/tui_runner.rs @@ -56,104 +56,16 @@ impl Tui { } pub fn run(basic: bool) -> Self { - let (mut msg_s, msg_r) = mpsc::channel(); + let (msg_s, msg_r) = mpsc::channel(); let running = Arc::new(AtomicBool::new(true)); let running2 = Arc::clone(&running); + let builder = std::thread::Builder::new().name("tui_runner".to_owned()); let background = if basic { - std::thread::spawn(move || { - while running2.load(Ordering::Relaxed) { - let mut line = String::new(); - - match io::stdin().read_line(&mut line) { - Err(e) => { - error!( - ?e, - "couldn't read from stdin, cli commands are disabled now!" - ); - break; - }, - Ok(0) => { - //Docker seem to send EOF all the time - warn!("EOF received, cli commands are disabled now!"); - break; - }, - Ok(_) => { - debug!(?line, "basic mode: command entered"); - crate::cmd::parse_command(&line, &mut msg_s); - }, - } - } - }); - + builder.spawn(|| Self::work_b(running2, msg_s)).unwrap(); None } else { - Some(std::thread::spawn(move || { - // Start the tui - let mut stdout = io::stdout(); - execute!(stdout, EnterAlternateScreen, EnableMouseCapture).unwrap(); - - enable_raw_mode().unwrap(); - - let backend = CrosstermBackend::new(stdout); - let mut terminal = Terminal::new(backend).unwrap(); - - let mut input = String::new(); - - if let Err(e) = terminal.clear() { - error!(?e, "couldn't clean terminal"); - }; - - while running2.load(Ordering::Relaxed) { - if let Err(e) = terminal.draw(|f| { - let (log_rect, input_rect) = if f.size().height > 6 { - let mut log_rect = f.size(); - log_rect.height -= 3; - - let mut input_rect = f.size(); - input_rect.y = input_rect.height - 3; - input_rect.height = 3; - - (log_rect, input_rect) - } else { - (f.size(), Rect::default()) - }; - - let block = Block::default().borders(Borders::ALL); - - let wrap = Wrap { - scroll_callback: Some(Box::new(|text_area, lines| { - LOG.resize(text_area.height as usize); - let len = lines.len() as u16; - (len.saturating_sub(text_area.height), 0) - })), - ..Default::default() - }; - - let logger = Paragraph::new(LOG.inner.lock().unwrap().clone()) - .block(block) - .wrap(wrap); - f.render_widget(logger, log_rect); - - let text: Text = input.as_str().into(); - - let block = Block::default().borders(Borders::ALL); - let size = block.inner(input_rect); - - let x = (size.x + text.width() as u16).min(size.width); - - let input_field = Paragraph::new(text).block(block); - f.render_widget(input_field, input_rect); - - f.set_cursor(x, size.y); - }) { - warn!(?e, "couldn't draw frame"); - }; - if crossterm::event::poll(Duration::from_millis(100)).unwrap() { - Self::handle_events(&mut input, &mut msg_s); - }; - } - })) + Some(builder.spawn(|| Self::work_e(running2, msg_s)).unwrap()) }; Self { @@ -164,6 +76,100 @@ impl Tui { } } + /// In a seperate Thread + fn work_b(running: Arc, mut msg_s: mpsc::Sender) { + while running.load(Ordering::Relaxed) { + let mut line = String::new(); + + match io::stdin().read_line(&mut line) { + Err(e) => { + error!( + ?e, + "couldn't read from stdin, cli commands are disabled now!" + ); + break; + }, + Ok(0) => { + //Docker seem to send EOF all the time + warn!("EOF received, cli commands are disabled now!"); + break; + }, + Ok(_) => { + debug!(?line, "basic mode: command entered"); + crate::cmd::parse_command(&line, &mut msg_s); + }, + } + } + } + + /// In a seperate Thread + fn work_e(running: Arc, mut msg_s: mpsc::Sender) { + // Start the tui + let mut stdout = io::stdout(); + execute!(stdout, EnterAlternateScreen, EnableMouseCapture).unwrap(); + + enable_raw_mode().unwrap(); + + let backend = CrosstermBackend::new(stdout); + let mut terminal = Terminal::new(backend).unwrap(); + + let mut input = String::new(); + + if let Err(e) = terminal.clear() { + error!(?e, "couldn't clean terminal"); + }; + + while running.load(Ordering::Relaxed) { + if let Err(e) = terminal.draw(|f| { + let (log_rect, input_rect) = if f.size().height > 6 { + let mut log_rect = f.size(); + log_rect.height -= 3; + + let mut input_rect = f.size(); + input_rect.y = input_rect.height - 3; + input_rect.height = 3; + + (log_rect, input_rect) + } else { + (f.size(), Rect::default()) + }; + + let block = Block::default().borders(Borders::ALL); + + let wrap = Wrap { + scroll_callback: Some(Box::new(|text_area, lines| { + LOG.resize(text_area.height as usize); + let len = lines.len() as u16; + (len.saturating_sub(text_area.height), 0) + })), + ..Default::default() + }; + + let logger = Paragraph::new(LOG.inner.lock().unwrap().clone()) + .block(block) + .wrap(wrap); + f.render_widget(logger, log_rect); + + let text: Text = input.as_str().into(); + + let block = Block::default().borders(Borders::ALL); + let size = block.inner(input_rect); + + let x = (size.x + text.width() as u16).min(size.width); + + let input_field = Paragraph::new(text).block(block); + f.render_widget(input_field, input_rect); + + f.set_cursor(x, size.y); + }) { + warn!(?e, "couldn't draw frame"); + }; + if crossterm::event::poll(Duration::from_millis(100)).unwrap() { + Self::handle_events(&mut input, &mut msg_s); + }; + } + } + pub fn shutdown(basic: bool) { if !basic { let mut stdout = io::stdout(); diff --git a/voxygen/anim/src/dyn_lib.rs b/voxygen/anim/src/dyn_lib.rs index 4c39922032..8c7feaf030 100644 --- a/voxygen/anim/src/dyn_lib.rs +++ b/voxygen/anim/src/dyn_lib.rs @@ -146,7 +146,7 @@ pub fn init() { // Start reloader that watcher signals // "Debounces" events since I can't find the option to do this in the latest // `notify` - thread::spawn(move || { + std::thread::Builder::new("voxygen_anim_watcher".to_owned()).spawn(move || { let mut modified_paths = std::collections::HashSet::new(); while let Ok(path) = reload_recv.recv() { modified_paths.insert(path);