From 38dd7ccede3b9fb9e45e6ca06ed2ef272f6cdd7b Mon Sep 17 00:00:00 2001 From: Joscha Date: Thu, 21 Jul 2022 20:28:06 +0200 Subject: [PATCH] Redraw occasionally when batching events --- src/ui.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ui.rs b/src/ui.rs index 7dfe4a9..66d1b02 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -6,7 +6,7 @@ mod util; mod widgets; use std::sync::{Arc, Weak}; -use std::time::Duration; +use std::time::{Duration, Instant}; use crossterm::event::{Event, KeyCode, KeyEvent, KeyModifiers, MouseEvent}; use log::debug; @@ -23,6 +23,9 @@ use self::chat::ChatState; use self::rooms::Rooms; use self::widgets::BoxedWidget; +/// Time to spend batch processing events before redrawing the screen. +const EVENT_PROCESSING_TIME: Duration = Duration::from_millis(1000 / 15); // 15 fps + #[derive(Debug)] pub enum UiEvent { Redraw, @@ -139,6 +142,7 @@ impl Ui { Some(event) => event, None => return Ok(()), }; + let end_time = Instant::now() + EVENT_PROCESSING_TIME; loop { // Render in-between events so the next event is handled in an // up-to-date state. The results of these intermediate renders @@ -159,6 +163,9 @@ impl Ui { EventHandleResult::Continue => {} EventHandleResult::Stop => return Ok(()), } + if Instant::now() >= end_time { + break; + } event = match event_rx.try_recv() { Ok(event) => event, Err(TryRecvError::Empty) => break,