1
0
Fork 0
mirror of https://github.com/alacritty/alacritty.git synced 2024-11-11 13:51:01 -05:00
alacritty/alacritty_terminal/src/tty/mod.rs

97 lines
3.1 KiB
Rust
Raw Normal View History

// Copyright 2016 Joe Wilm, The Alacritty Project Contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
2020-05-05 18:50:23 -04:00
//! TTY related functionality.
use std::{env, io};
use terminfo::Database;
use crate::config::Config;
#[cfg(not(windows))]
mod unix;
#[cfg(not(windows))]
pub use self::unix::*;
#[cfg(windows)]
pub mod windows;
#[cfg(windows)]
pub use self::windows::*;
/// This trait defines the behaviour needed to read and/or write to a stream.
/// It defines an abstraction over mio's interface in order to allow either one
2019-04-28 17:42:43 -04:00
/// read/write object or a separate read and write object.
pub trait EventedReadWrite {
type Reader: io::Read;
type Writer: io::Write;
fn register(
&mut self,
_: &mio::Poll,
_: &mut dyn Iterator<Item = mio::Token>,
_: mio::Ready,
_: mio::PollOpt,
) -> io::Result<()>;
fn reregister(&mut self, _: &mio::Poll, _: mio::Ready, _: mio::PollOpt) -> io::Result<()>;
fn deregister(&mut self, _: &mio::Poll) -> io::Result<()>;
fn reader(&mut self) -> &mut Self::Reader;
fn read_token(&self) -> mio::Token;
fn writer(&mut self) -> &mut Self::Writer;
fn write_token(&self) -> mio::Token;
}
2020-05-05 18:50:23 -04:00
/// Events concerning TTY child processes.
#[derive(Debug, PartialEq)]
pub enum ChildEvent {
2020-05-05 18:50:23 -04:00
/// Indicates the child has exited.
2019-03-30 12:48:36 -04:00
Exited,
}
2020-05-05 18:50:23 -04:00
/// A pseudoterminal (or PTY).
///
/// This is a refinement of EventedReadWrite that also provides a channel through which we can be
/// notified if the PTY child process does something we care about (other than writing to the TTY).
/// In particular, this allows for race-free child exit notification on UNIX (cf. `SIGCHLD`).
2019-03-30 12:48:36 -04:00
pub trait EventedPty: EventedReadWrite {
fn child_event_token(&self) -> mio::Token;
2020-05-05 18:50:23 -04:00
/// Tries to retrieve an event.
///
/// Returns `Some(event)` on success, or `None` if there are no events to retrieve.
fn next_child_event(&mut self) -> Option<ChildEvent>;
}
2020-05-05 18:50:23 -04:00
/// Setup environment variables.
pub fn setup_env<C>(config: &Config<C>) {
// Default to 'alacritty' terminfo if it is available, otherwise
// default to 'xterm-256color'. May be overridden by user's config
// below.
env::set_var(
"TERM",
2019-03-30 12:48:36 -04:00
if Database::from_name("alacritty").is_ok() { "alacritty" } else { "xterm-256color" },
);
2020-05-05 18:50:23 -04:00
// Advertise 24-bit color support.
env::set_var("COLORTERM", "truecolor");
2020-05-05 18:50:23 -04:00
// Prevent child processes from inheriting startup notification env.
env::remove_var("DESKTOP_STARTUP_ID");
2020-05-05 18:50:23 -04:00
// Set env vars from config.
for (key, value) in config.env.iter() {
env::set_var(key, value);
}
}