Fix bug in frame rate limit
This commit is contained in:
		
							parent
							
								
									922ba9c524
								
							
						
					
					
						commit
						0f4211005e
					
				
							
								
								
									
										84
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										84
									
								
								src/lib.rs
									
									
									
									
									
								
							| @ -10,10 +10,12 @@ use termion::screen::IntoAlternateScreen; | |||||||
| use termion::terminal_size; | use termion::terminal_size; | ||||||
| use termion::{clear, cursor}; | use termion::{clear, cursor}; | ||||||
| 
 | 
 | ||||||
|  | use tile::{Tile, TileBuilder}; | ||||||
|  | 
 | ||||||
| pub mod tile; | pub mod tile; | ||||||
| pub mod utils; | pub mod utils; | ||||||
| 
 | 
 | ||||||
| use tile::{Tile, TileBuilder}; | const DELAY: Duration = Duration::from_millis(20); | ||||||
| 
 | 
 | ||||||
| /// Multiple applications running in a single terminal.
 | /// Multiple applications running in a single terminal.
 | ||||||
| struct Multiview<W: Write> { | struct Multiview<W: Write> { | ||||||
| @ -29,19 +31,31 @@ struct Multiview<W: Write> { | |||||||
|     /// Whether we need to refresh the UI.
 |     /// Whether we need to refresh the UI.
 | ||||||
|     pub refresh_ui: bool, |     pub refresh_ui: bool, | ||||||
| 
 | 
 | ||||||
|  |     /// Whether we need to refresh the tiles.
 | ||||||
|  |     pub refresh_tiles: bool, | ||||||
|  | 
 | ||||||
|     /// Last time when the rendering was performed.
 |     /// Last time when the rendering was performed.
 | ||||||
|     pub last_render: Instant, |     pub last_render: Instant, | ||||||
|  | 
 | ||||||
|  |     /// The size of the terminal.
 | ||||||
|  |     pub term_size: (u16, u16), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<W: Write> Multiview<W> { | impl<W: Write> Multiview<W> { | ||||||
|     /// Creates a new multiview.
 |     /// Creates a new multiview.
 | ||||||
|     pub fn new(stdout: W, tiles: Vec<Vec<Tile>>) -> io::Result<Multiview<W>> { |     pub fn new( | ||||||
|  |         stdout: W, | ||||||
|  |         tiles: Vec<Vec<Tile>>, | ||||||
|  |         term_size: (u16, u16), | ||||||
|  |     ) -> io::Result<Multiview<W>> { | ||||||
|         let mut multiview = Multiview { |         let mut multiview = Multiview { | ||||||
|             stdout, |             stdout, | ||||||
|             tiles, |             tiles, | ||||||
|             selected: (0, 0), |             selected: (0, 0), | ||||||
|             refresh_ui: true, |             refresh_ui: true, | ||||||
|  |             refresh_tiles: false, | ||||||
|             last_render: Instant::now(), |             last_render: Instant::now(), | ||||||
|  |             term_size, | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         write!( |         write!( | ||||||
| @ -89,14 +103,19 @@ impl<W: Write> Multiview<W> { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Renders all the tiles of the multiview.
 |     /// Renders all the tiles of the multiview.
 | ||||||
|     pub fn render(&mut self) -> io::Result<()> { |     pub fn render(&mut self, force: bool) -> io::Result<()> { | ||||||
|         // let now = Instant::now();
 |         if !self.refresh_tiles { | ||||||
|  |             return Ok(()); | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         // if now.duration_since(self.last_render) < Duration::from_millis(20) {
 |         let now = Instant::now(); | ||||||
|         //     return Ok(());
 | 
 | ||||||
|         // }
 |         if now.duration_since(self.last_render) < DELAY && !force { | ||||||
|  |             return Ok(()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         self.last_render = now; | ||||||
| 
 | 
 | ||||||
|         // self.last_render = now;
 |  | ||||||
|         let mut buffer = vec![]; |         let mut buffer = vec![]; | ||||||
|         for i in 0..self.tiles.len() { |         for i in 0..self.tiles.len() { | ||||||
|             for j in 0..self.tiles[0].len() { |             for j in 0..self.tiles[0].len() { | ||||||
| @ -108,6 +127,7 @@ impl<W: Write> Multiview<W> { | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         self.refresh_ui = false; |         self.refresh_ui = false; | ||||||
|  |         self.refresh_tiles = false; | ||||||
|         write!(self.stdout, "{}", buffer.join(""))?; |         write!(self.stdout, "{}", buffer.join(""))?; | ||||||
|         self.stdout.flush()?; |         self.stdout.flush()?; | ||||||
| 
 | 
 | ||||||
| @ -193,6 +213,28 @@ impl<W: Write> Multiview<W> { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     /// Treats a message.
 | ||||||
|  |     pub fn manage_msg(&mut self, msg: Msg) -> io::Result<()> { | ||||||
|  |         self.refresh_tiles = true; | ||||||
|  | 
 | ||||||
|  |         match msg { | ||||||
|  |             Msg::Stdout(coords, line) => self.push_stdout(coords, line), | ||||||
|  |             Msg::Stderr(coords, line) => self.push_stderr(coords, line), | ||||||
|  |             Msg::Click(x, y) => self.select_tile((x, y), self.term_size), | ||||||
|  |             Msg::ScrollDown => self.scroll_down(), | ||||||
|  |             Msg::Restart => self.restart()?, | ||||||
|  |             Msg::RestartAll => self.restart_all()?, | ||||||
|  |             Msg::Kill => self.kill()?, | ||||||
|  |             Msg::KillAll => self.kill_all()?, | ||||||
|  |             Msg::ScrollUp => self.scroll_up(), | ||||||
|  |             Msg::ScrollFullDown => self.scroll_full_down(), | ||||||
|  |             Msg::ScrollFullUp => self.scroll_full_up(), | ||||||
|  |             Msg::Exit => self.exit(), | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<W: Write> Drop for Multiview<W> { | impl<W: Write> Drop for Multiview<W> { | ||||||
| @ -202,6 +244,7 @@ impl<W: Write> Drop for Multiview<W> { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// An event that can be sent in channels.
 | /// An event that can be sent in channels.
 | ||||||
|  | #[derive(PartialEq, Eq)] | ||||||
| pub enum Msg { | pub enum Msg { | ||||||
|     /// An stdout line arrived.
 |     /// An stdout line arrived.
 | ||||||
|     Stdout((u16, u16), String), |     Stdout((u16, u16), String), | ||||||
| @ -288,8 +331,8 @@ pub fn main() -> io::Result<()> { | |||||||
|     let stdout = stdout.into_alternate_screen()?; |     let stdout = stdout.into_alternate_screen()?; | ||||||
|     let stdout = MouseTerminal::from(stdout); |     let stdout = MouseTerminal::from(stdout); | ||||||
| 
 | 
 | ||||||
|     let mut multiview = Multiview::new(stdout, tiles)?; |     let mut multiview = Multiview::new(stdout, tiles, term_size)?; | ||||||
|     multiview.render()?; |     multiview.render(true)?; | ||||||
| 
 | 
 | ||||||
|     for row in &mut multiview.tiles { |     for row in &mut multiview.tiles { | ||||||
|         for tile in row { |         for tile in row { | ||||||
| @ -323,26 +366,15 @@ pub fn main() -> io::Result<()> { | |||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     loop { |     loop { | ||||||
|         match receiver.recv() { |         if let Ok(msg) = receiver.recv_timeout(DELAY) { | ||||||
|             Ok(Msg::Stdout(coords, line)) => multiview.push_stdout(coords, line), |             let is_exit = msg == Msg::Exit; | ||||||
|             Ok(Msg::Stderr(coords, line)) => multiview.push_stderr(coords, line), |             multiview.manage_msg(msg)?; | ||||||
|             Ok(Msg::Click(x, y)) => multiview.select_tile((x, y), term_size), |             if is_exit { | ||||||
|             Ok(Msg::ScrollDown) => multiview.scroll_down(), |  | ||||||
|             Ok(Msg::Restart) => multiview.restart()?, |  | ||||||
|             Ok(Msg::RestartAll) => multiview.restart_all()?, |  | ||||||
|             Ok(Msg::Kill) => multiview.kill()?, |  | ||||||
|             Ok(Msg::KillAll) => multiview.kill_all()?, |  | ||||||
|             Ok(Msg::ScrollUp) => multiview.scroll_up(), |  | ||||||
|             Ok(Msg::ScrollFullDown) => multiview.scroll_full_down(), |  | ||||||
|             Ok(Msg::ScrollFullUp) => multiview.scroll_full_up(), |  | ||||||
|             Ok(Msg::Exit) => { |  | ||||||
|                 multiview.exit(); |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             Err(_) => (), |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         multiview.render()?; |         multiview.render(false)?; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     Ok(()) |     Ok(()) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user