aboutsummaryrefslogtreecommitdiffstats
path: root/src/command/client/search
diff options
context:
space:
mode:
authorEllie Huxtable <ellie@elliehuxtable.com>2023-02-10 18:14:48 +0000
committerGitHub <noreply@github.com>2023-02-10 18:14:48 +0000
commit2672f78dda0bc98c9fac8d63bd1e00bafbb76ef4 (patch)
tree1300abbd14272a5f2f8df2e4622684c968d65f17 /src/command/client/search
parentcrossterm support (#331) (diff)
downloadatuin-2672f78dda0bc98c9fac8d63bd1e00bafbb76ef4.zip
make update_needed check lazy (#706)
Diffstat (limited to 'src/command/client/search')
-rw-r--r--src/command/client/search/interactive.rs29
1 files changed, 20 insertions, 9 deletions
diff --git a/src/command/client/search/interactive.rs b/src/command/client/search/interactive.rs
index c8ceab58..903c3362 100644
--- a/src/command/client/search/interactive.rs
+++ b/src/command/client/search/interactive.rs
@@ -16,6 +16,7 @@ use crossterm::{
execute, terminal,
};
use eyre::Result;
+use futures_util::FutureExt;
use semver::Version;
use unicode_width::UnicodeWidthStr;
@@ -393,7 +394,8 @@ pub async fn history(
// Put the cursor at the end of the query by default
input.end();
- let update_needed = settings.needs_update().await;
+ let update_needed = settings.needs_update().fuse();
+ tokio::pin!(update_needed);
let mut app = State {
history_count: db.history_count().await?,
@@ -405,7 +407,7 @@ pub async fn history(
} else {
settings.filter_mode
},
- update_needed,
+ update_needed: None,
};
let mut results = app.query_results(settings.search_mode, db).await?;
@@ -427,15 +429,24 @@ pub async fn history(
let initial_input = app.input.as_str().to_owned();
let initial_filter_mode = app.filter_mode;
- if event::poll(Duration::from_millis(250))? {
- loop {
- if let Some(i) = app.handle_input(settings, &event::read()?, results.len()) {
- break 'render i;
- }
- if !event::poll(Duration::ZERO)? {
- break;
+ let event_ready = tokio::task::spawn_blocking(|| event::poll(Duration::from_millis(250)));
+
+ tokio::select! {
+ event_ready = event_ready => {
+ if event_ready?? {
+ loop {
+ if let Some(i) = app.handle_input(settings, &event::read()?, results.len()) {
+ break 'render i;
+ }
+ if !event::poll(Duration::ZERO)? {
+ break;
+ }
+ }
}
}
+ update_needed = &mut update_needed => {
+ app.update_needed = update_needed;
+ }
}
if initial_input != app.input.as_str() || initial_filter_mode != app.filter_mode {