Skip to main content

AsyncKeySender

Struct AsyncKeySender 

Source
pub struct AsyncKeySender { /* private fields */ }
Expand description

Non-blocking KeySender decorator — moves the blocking tmux round-trip off the caller’s thread. send/scroll enqueue onto an unbounded channel and return immediately (sub-microsecond); a single background thread drains the channel in FIFO order and replays each job against the wrapped sender.

Why (#386): the TUI forwards each keystroke inline on its render/event loop (app::run). A per-key tmux send-keys blocks that loop ~3ms, and a keystroke that lands while the loop is mid capture-pane / refresh waits behind it — perceptible input lag. Handing the send to a background thread frees the loop to observe the next key and redraw. The channel is FIFO and single-consumer, so the pane still receives keys in the exact order and form the inline path produced — no batching, no reordering, so the #374 forwarding contract (Esc / Ctrl+C / arrows) is untouched.

Inner-sender contract: the wrapped KeySender must signal failures by returning Err (which the worker swallows and moves on, matching the inline path’s best-effort let _ = send(...)), not by panicking. TmuxKeySender honours this — its tmux round-trip returns Err on any failure and never unwraps — so the worker thread is durable for the life of the app.

Implementations§

Source§

impl AsyncKeySender

Source

pub fn new<K: KeySender + 'static>(inner: K) -> Self

Wrap a blocking sender and spawn its drain thread. inner is moved onto the worker, which runs every job to completion in arrival order. The thread lives until this AsyncKeySender is dropped.

Trait Implementations§

Source§

impl Drop for AsyncKeySender

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more
Source§

impl KeySender for AsyncKeySender

Source§

fn send(&self, session: &str, key: &EncodedKey) -> Result<()>

Source§

fn scroll(&self, session: &str, direction: ScrollDirection) -> Result<()>

Forward one mouse-wheel tick to the named tmux session as a terminal-history scroll. Implementations target the pane’s copy-mode scroll commands, so the agent’s history surfaces the same way tmux attach + wheel does — wheel-up auto-enters copy-mode, subsequent ticks scroll the buffer. Wheel-down on a pane not in copy-mode is a no-op (tmux’s own behaviour).

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more