use crate::{Debug, VersionFull};
use crate::{Linux, LinuxError, LinuxResult};
use crate::{RunCap, RunService, RunServiceProbe};
use crate::{
TermCaps, TermInputParser, TermLinuxInputBuf, TermLinuxRestore, TermMode, TermSession, TermSize,
};
const TERM_INPUT_BUF_CAP: usize = 64;
#[doc = crate::_tags!(term linux)]
#[doc = crate::_doc_meta!{
location("sys/os/term/backend"),
#[cfg(target_pointer_width = "32")]
test_size_of(TermLinux = 136|1088),
#[cfg(target_pointer_width = "64")]
test_size_of(TermLinux = 144|1152),
}]
#[derive(Clone, Debug)]
pub struct TermLinux {
pub(super) parser: TermInputParser,
pub(super) input_buf: TermLinuxInputBuf<TERM_INPUT_BUF_CAP>,
pub(super) term_caps: TermCaps,
pub(super) run_cap: RunCap,
pub(super) size: Option<TermSize>,
}
impl TermLinux {
pub fn open() -> LinuxResult<Self> {
let size = Linux::terminal_size().ok();
let mut term = Self {
parser: TermInputParser::new(),
input_buf: TermLinuxInputBuf::new(),
term_caps: TermCaps::ANSI_BASE,
run_cap: RunCap::default(),
size,
};
term.run_cap = Self::derive_run_capabilities(term.term_caps, term.size);
Ok(term)
}
pub fn session(
&mut self,
mode: TermMode,
) -> LinuxResult<TermSession<impl Drop + Debug + use<>>> {
Ok(TermSession::new(TermLinuxRestore::enter(mode)?))
}
pub fn session_raw(&mut self) -> LinuxResult<TermSession<impl Drop + Debug + use<>>> {
Ok(TermSession::new(TermLinuxRestore::raw()?))
}
pub fn print(&mut self, bytes: &[u8]) -> LinuxResult<()> {
Linux::print_bytes(bytes)
}
pub const fn size(&self) -> Option<TermSize> {
self.size
}
pub fn refresh_size(&mut self) -> LinuxResult<Option<TermSize>> {
self.size = Linux::terminal_size().ok();
Ok(self.size)
}
}
impl RunService for TermLinux {
fn run_capabilities(&self) -> RunCap {
self.run_cap
}
fn run_version(&self) -> VersionFull<'_> {
VersionFull::new(0, 0, 1)
}
}
impl RunServiceProbe for TermLinux {
type Error = LinuxError;
fn run_capabilities_refresh(&mut self) -> Result<RunCap, Self::Error> {
self.probe_run_capabilities()
}
}