From 5b5257034ba44897df607f153f46de7c0852280e Mon Sep 17 00:00:00 2001 From: OliverGuy Date: Thu, 7 May 2026 17:30:32 +0200 Subject: [PATCH] refactor(history): global state belongs in core --- yazi-actor/src/input/close.rs | 2 +- yazi-core/src/input/input.rs | 9 +++++++++ yazi-widgets/src/input/actor/actor.rs | 8 +++++--- yazi-widgets/src/input/actor/history.rs | 6 +++--- yazi-widgets/src/input/history.rs | 4 +--- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/yazi-actor/src/input/close.rs b/yazi-actor/src/input/close.rs index d45f643a..f50d62ca 100644 --- a/yazi-actor/src/input/close.rs +++ b/yazi-actor/src/input/close.rs @@ -22,7 +22,7 @@ impl Actor for Close { let value = input.snap().value.clone(); if form.submit { if !input.obscure { - yazi_widgets::input::INPUT_HISTORY.lock().unwrap().push(value.clone()); + input.history.push(value.clone()); } _ = tx.send(InputEvent::Submit(value)); } else { diff --git a/yazi-core/src/input/input.rs b/yazi-core/src/input/input.rs index 130c4e5a..ce442526 100644 --- a/yazi-core/src/input/input.rs +++ b/yazi-core/src/input/input.rs @@ -1,16 +1,25 @@ use std::ops::{Deref, DerefMut}; +use anyhow::Result; use yazi_config::popup::Position; +use yazi_shared::{data::Data, event::ActionCow}; #[derive(Default)] pub struct Input { pub(super) inner: yazi_widgets::input::Input, + pub history: yazi_widgets::input::InputHistory, pub visible: bool, pub title: String, pub position: Position, } +impl Input { + pub fn execute(&mut self, action: ActionCow) -> Result { + self.inner.execute(action, &mut self.history) + } +} + impl Deref for Input { type Target = yazi_widgets::input::Input; diff --git a/yazi-widgets/src/input/actor/actor.rs b/yazi-widgets/src/input/actor/actor.rs index a0fbdd1a..2b526663 100644 --- a/yazi-widgets/src/input/actor/actor.rs +++ b/yazi-widgets/src/input/actor/actor.rs @@ -2,10 +2,10 @@ use anyhow::Result; use yazi_macro::{act, succ}; use yazi_shared::{data::Data, event::ActionCow}; -use crate::input::{Input, InputMode}; +use crate::input::{Input, InputHistory, InputMode}; impl Input { - pub fn execute(&mut self, action: ActionCow) -> Result { + pub fn execute(&mut self, action: ActionCow, history: &mut InputHistory) -> Result { macro_rules! on { ($name:ident) => { if action.name == stringify!($name) { @@ -22,7 +22,9 @@ impl Input { on!(r#move, "move"); on!(backward); on!(forward); - on!(history); + if action.name == "history" { + return self.history(action.into(), history); + } match self.mode() { InputMode::Normal => { diff --git a/yazi-widgets/src/input/actor/history.rs b/yazi-widgets/src/input/actor/history.rs index 5cf4645c..8e0b10dd 100644 --- a/yazi-widgets/src/input/actor/history.rs +++ b/yazi-widgets/src/input/actor/history.rs @@ -2,15 +2,15 @@ use anyhow::Result; use yazi_macro::{render, succ}; use yazi_shared::data::Data; -use crate::input::{INPUT_HISTORY, Input, InputOp, parser::HistoryOpt}; +use crate::input::{Input, InputHistory, InputOp, parser::HistoryOpt}; impl Input { - pub fn history(&mut self, opt: HistoryOpt) -> Result { + pub fn history(&mut self, opt: HistoryOpt, history: &mut InputHistory) -> Result { if self.snap().op != InputOp::None || self.obscure { succ!(); } - if !INPUT_HISTORY.lock().unwrap().navigate(opt.offset, &mut self.snaps, self.limit) { + if !history.navigate(opt.offset, &mut self.snaps, self.limit) { succ!(); } diff --git a/yazi-widgets/src/input/history.rs b/yazi-widgets/src/input/history.rs index 920d8560..8d5ed6a7 100644 --- a/yazi-widgets/src/input/history.rs +++ b/yazi-widgets/src/input/history.rs @@ -1,9 +1,7 @@ -use std::{mem, sync::Mutex}; +use std::mem; use super::{InputMode, InputSnaps}; -pub static INPUT_HISTORY: Mutex = Mutex::new(InputHistory::new()); - #[derive(Default)] pub struct InputHistory { entries: Vec,