Files
ghostty-rs/crates/ghostty-termio/src/backend.rs
T
ddidderr 8bcb85a29a style: apply nightly rustfmt import grouping across the workspace
rustfmt.toml sets group_imports, imports_granularity and imports_layout,
which are nightly-only; agents formatted with stable rustfmt, which
ignored them. This is a formatting-only pass with `cargo +nightly fmt`.

Test Plan:
- cargo clippy --workspace --all-targets -- -D warnings
- cargo test --workspace
2026-10-12 05:03:37 +02:00

123 lines
3.0 KiB
Rust

//! Backend implementations (`termio/backend.zig`). A backend is responsible
//! for owning the pty behavior and providing read/write capabilities.
use std::sync::Arc;
use ghostty_renderer::size::{GridSize, ScreenSize};
use ghostty_terminal::terminal::Terminal;
use crate::{
exec::{self, Exec},
sinks::SurfaceMailbox,
state::SharedState,
termio::Output,
};
/// The kinds of backends.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Kind {
Exec,
}
/// Configuration for the various backend types.
pub enum Config {
/// Exec uses posix exec to run a command with a pty.
Exec(exec::Config),
}
/// Backend implementations.
pub enum Backend {
Exec(Exec),
}
impl Backend {
pub fn new(config: Config) -> Result<Backend, exec::Error> {
match config {
Config::Exec(cfg) => Ok(Backend::Exec(Exec::new(cfg)?)),
}
}
pub fn kind(&self) -> Kind {
match self {
Backend::Exec(_) => Kind::Exec,
}
}
pub fn init_terminal(&mut self, t: &mut Terminal) {
match self {
Backend::Exec(e) => e.init_terminal(t),
}
}
pub fn thread_enter(
&mut self,
output: Arc<Output>,
surface_mailbox: Arc<dyn SurfaceMailbox>,
renderer_state: SharedState,
) -> Result<ThreadData, exec::Error> {
match self {
Backend::Exec(e) => Ok(ThreadData::Exec(e.thread_enter(
output,
surface_mailbox,
renderer_state,
)?)),
}
}
pub fn thread_exit(&mut self, td: &mut ThreadData) {
match (self, td) {
(Backend::Exec(e), ThreadData::Exec(td)) => e.thread_exit(td),
}
}
pub fn focus_gained(&mut self, td: &mut ThreadData, focused: bool) {
match (self, td) {
(Backend::Exec(e), ThreadData::Exec(td)) => e.focus_gained(td, focused),
}
}
pub fn resize(
&mut self,
grid_size: GridSize,
screen_size: ScreenSize,
) -> Result<(), exec::Error> {
match self {
Backend::Exec(e) => e.resize(grid_size, screen_size),
}
}
pub fn queue_write(&mut self, td: &mut ThreadData, data: &[u8], linefeed: bool) {
match (self, td) {
(Backend::Exec(e), ThreadData::Exec(td)) => e.queue_write(td, data, linefeed),
}
}
}
/// Termio thread data. See `termio::ThreadData` for docs.
pub enum ThreadData {
Exec(exec::ThreadData),
}
impl ThreadData {
pub fn kind(&self) -> Kind {
match self {
ThreadData::Exec(_) => Kind::Exec,
}
}
pub fn as_exec(&self) -> &exec::ThreadData {
match self {
ThreadData::Exec(e) => e,
}
}
pub fn as_exec_mut(&mut self) -> &mut exec::ThreadData {
match self {
ThreadData::Exec(e) => e,
}
}
/// `ThreadData.changeConfig`: nothing to do for the exec backend.
pub fn change_config(&mut self, _config: &crate::termio::DerivedConfig) {}
}