pub struct Engine { /* private fields */ }Expand description
The terminal engine: pairs the vte parser with our state model.
Parser and Term are kept as separate fields because Parser::advance
borrows both the parser and the performer mutably at once — a single struct
owning both could not satisfy the borrow checker.
Implementations§
Source§impl Engine
impl Engine
Sourcepub fn new(cols: usize, rows: usize) -> Self
pub fn new(cols: usize, rows: usize) -> Self
A blank engine with a cols × rows screen and a default scrollback cap.
Sourcepub fn with_scrollback(
cols: usize,
rows: usize,
scrollback_limit: usize,
) -> Self
pub fn with_scrollback( cols: usize, rows: usize, scrollback_limit: usize, ) -> Self
Like Engine::new but with an explicit scrollback line limit.
Sourcepub fn feed(&mut self, bytes: &[u8])
pub fn feed(&mut self, bytes: &[u8])
Push a slice of VT bytes. The caller owns the PTY/SSH/socket I/O — the engine only consumes the bytes it is handed.
Sourcepub fn resize(&mut self, cols: usize, rows: usize)
pub fn resize(&mut self, cols: usize, rows: usize)
Resize the screen to cols x rows. Rows that scroll off the top enter
scrollback; the whole screen is damaged. (Soft-wrap reflow lands in #7.)
Sourcepub fn bracketed_paste(&self) -> bool
pub fn bracketed_paste(&self) -> bool
Whether bracketed-paste mode (DEC ?2004) is enabled. A consumer’s input encoder reads this to decide whether to wrap pasted text in markers.
Sourcepub fn encode_key(&self, ev: KeyEvent) -> Option<Vec<u8>>
pub fn encode_key(&self, ev: KeyEvent) -> Option<Vec<u8>>
Encode a key event to the bytes an application expects, honouring the
engine’s cursor-key mode (DECCKM). The inverse of Engine::feed — the
consumer hands a decoded key event and writes the bytes to its PTY.
Returns None for a key with no defined encoding.
Sourcepub fn encode_mouse(&self, ev: MouseEvent) -> Option<Vec<u8>>
pub fn encode_mouse(&self, ev: MouseEvent) -> Option<Vec<u8>>
Encode a mouse event using the engine’s active tracking mode + encoding.
Returns None when mouse reporting is off, or when the event is filtered
out by the mode (e.g. a bare move while only ?1000 is set).
Sourcepub fn encode_paste(&self, text: &str) -> Vec<u8> ⓘ
pub fn encode_paste(&self, text: &str) -> Vec<u8> ⓘ
Encode pasted text — wrapped in bracketed-paste markers when ?2004 is on, raw otherwise.
Sourcepub fn encode_focus(&self, focused: bool) -> Option<Vec<u8>>
pub fn encode_focus(&self, focused: bool) -> Option<Vec<u8>>
Encode a focus change (CSI I on focus-in, CSI O on focus-out), or
None when focus reporting (?1004) is off.
Sourcepub fn drain_events(&mut self) -> Vec<TermEvent>
pub fn drain_events(&mut self) -> Vec<TermEvent>
Take the consumer events accumulated since the last drain (title / bell /
cwd — see TermEvent), emptying the queue. The pull counterpart to a
callback: poll this alongside Engine::frame.
Sourcepub fn drain_replies(&mut self) -> Vec<u8> ⓘ
pub fn drain_replies(&mut self) -> Vec<u8> ⓘ
Take the reply bytes the engine produced for app queries (DA / DSR /
DECRQM) since the last drain — the consumer writes them straight back to
the PTY. The inbound-query counterpart to Engine::drain_events.
Sourcepub fn link_at(&self, row: usize, col: usize) -> Option<NonZeroU32>
pub fn link_at(&self, row: usize, col: usize) -> Option<NonZeroU32>
The OSC 8 hyperlink index at screen (row, col) — the live grid, same
coordinates as Engine::grid’s cell(row, col) — or None. Combining
and links no longer ride on the Cell (#45/#46); read the
index here, then resolve it with Engine::hyperlink.
Sourcepub fn viewport_link_at(&self, row: usize, col: usize) -> Option<NonZeroU32>
pub fn viewport_link_at(&self, row: usize, col: usize) -> Option<NonZeroU32>
The OSC 8 hyperlink index at viewport (row, col) — the visible
window including scrollback at the current scroll, same coordinates as
Engine::viewport_line — or None.
Sourcepub fn hyperlink(&self, link: NonZeroU32) -> Option<&str>
pub fn hyperlink(&self, link: NonZeroU32) -> Option<&str>
Resolve a hyperlink index (from Engine::link_at /
Engine::viewport_link_at, or a decoded Span’s links) to its URI,
to make a cell clickable.
Sourcepub fn scrollback_len(&self) -> usize
pub fn scrollback_len(&self) -> usize
Number of lines currently held in scrollback history.
Sourcepub fn synchronized_output(&self) -> bool
pub fn synchronized_output(&self) -> bool
Whether the app has an open synchronized-output block (DEC ?2026):
it has asked that the next frame of output be painted atomically. The
engine only reports this — the consumer owns the paint-hold and the
spec-mandated timeout (a buggy app that never closes the block must not
freeze the screen forever, and the engine has no clock). Poll this after
feed; while it is true, defer applying frames, and apply once it
clears (or your own timeout fires). (#73)
Sourcepub fn color_scheme_updates(&self) -> bool
pub fn color_scheme_updates(&self) -> bool
Whether the app enabled color-scheme-update notifications (DEC ?2031).
The engine is theme-agnostic — it never knows the scheme. The consumer
answers a TermEvent::ColorSchemeQuery (from ?996) and, when its
scheme changes and this is true, sends an unsolicited notification, in
both cases by calling Engine::report_color_scheme (#85).
Sourcepub fn report_color_scheme(&mut self, dark: bool)
pub fn report_color_scheme(&mut self, dark: bool)
Report the current light/dark color scheme to the app as CSI ? 997 ; 1 n
(dark) / ; 2 n (light), drained via Engine::drain_replies. Call this
to answer a TermEvent::ColorSchemeQuery, or — guarded by
Engine::color_scheme_updates — when the scheme changes. The engine only
formats the bit you pass; it stores no scheme (#85).
Sourcepub fn win32_input_mode(&self) -> bool
pub fn win32_input_mode(&self) -> bool
Whether the app enabled win32-input-mode (DEC ?9001): it asked for
keys as raw Windows key-records. The engine only tracks the flag — encoding
the records (CSI Vk;Sc;Uc;Kd;Cs;Rc _) is a non-goal (raw passthrough, no
semantic conversion), so Engine::encode_key is unchanged. A ConPTY
consumer reads this to decide whether to emit the records itself (#86).
Sourcepub fn damage(&self) -> TermDamage
pub fn damage(&self) -> TermDamage
What changed since the last Engine::reset_damage — line ranges each
with a changed column span (see ADR-0003).
Sourcepub fn frame(&self) -> Frame
pub fn frame(&self) -> Frame
Build a serializable Frame of the current diff — the damaged spans
(or every row, when Full), the recorded scroll op, and a frame-local
grapheme side-table. Pass it to encode for the wire (see #6). Reading
a frame does not clear damage; call Engine::reset_damage on ack.
Sourcepub fn reset_damage(&mut self)
pub fn reset_damage(&mut self)
Clear accumulated damage after a frame is applied (the consumer’s ack).
Sourcepub fn mark_fully_damaged(&mut self)
pub fn mark_fully_damaged(&mut self)
Force the next Engine::frame to be a Full frame (every row), even if
little changed. The use case is reattach / late subscribe: a renderer
that connects after output has already been parsed needs the whole current
viewport once, then incremental diffs. Marks the screen fully damaged; the
next frame() reports FrameKind::Full.
Sourcepub fn scroll_delta(&self) -> Option<ScrollOp>
pub fn scroll_delta(&self) -> Option<ScrollOp>
The first-class scroll recorded since the last Engine::reset_damage,
if any — lets the renderer shift rows instead of redrawing them.
Sourcepub fn viewport_line(&self, i: usize) -> &[Cell]
pub fn viewport_line(&self, i: usize) -> &[Cell]
The cells of visible row i (0..rows) at the current scroll position.
Sourcepub fn scroll_up(&mut self, n: usize)
pub fn scroll_up(&mut self, n: usize)
Scroll the viewport up by n lines into scrollback history.
Sourcepub fn scroll_down(&mut self, n: usize)
pub fn scroll_down(&mut self, n: usize)
Scroll the viewport down by n lines toward the live screen.
Sourcepub fn scroll_to_bottom(&mut self)
pub fn scroll_to_bottom(&mut self)
Jump the viewport back to the live screen (follow the bottom).
Sourcepub fn selection_begin(
&mut self,
row: usize,
col: usize,
side: Side,
ty: SelectionType,
)
pub fn selection_begin( &mut self, row: usize, col: usize, side: Side, ty: SelectionType, )
Begin a selection of ty at viewport cell (row, col), on side of the
cell. Coordinates are viewport-relative (what a mouse event carries).
Sourcepub fn selection_extend(&mut self, row: usize, col: usize, side: Side)
pub fn selection_extend(&mut self, row: usize, col: usize, side: Side)
Extend the live selection to viewport cell (row, col), on side.
Sourcepub fn selection_clear(&mut self)
pub fn selection_clear(&mut self)
Clear the selection.
Sourcepub fn selection_range(&self) -> Vec<SelectionSpan>
pub fn selection_range(&self) -> Vec<SelectionSpan>
The selection projected onto the viewport: one inclusive-column span per visible row, for the renderer to highlight. Empty when nothing is selected or the selection is fully scrolled off-screen.
Sourcepub fn selection_text(&self) -> Option<String>
pub fn selection_text(&self) -> Option<String>
The selected text for copy (respects scrollback), or None if no
selection.
Sourcepub fn search(&self, query: &str) -> Vec<Match>
pub fn search(&self, query: &str) -> Vec<Match>
Literal search over the grid + scrollback, returning every match in
absolute buffer coordinates (top-to-bottom). Smart-case: a query with no
uppercase matches case-insensitively. The consumer drives next/prev by
walking the returned Vec and calling Engine::scroll_to_match.
Sourcepub fn scroll_to_match(&mut self, m: &Match)
pub fn scroll_to_match(&mut self, m: &Match)
Scroll the viewport so m is visible (next/prev navigation: the consumer
picks the match, the engine scrolls to it).
Sourcepub fn match_spans(&self, m: &Match) -> Vec<SelectionSpan>
pub fn match_spans(&self, m: &Match) -> Vec<SelectionSpan>
The match projected onto the viewport as inclusive-column spans per visible row, for the renderer to highlight.