summaryrefslogtreecommitdiff
path: root/alacritty_terminal/src/tty/mod.rs
diff options
context:
space:
mode:
authorTheodore Dubois <tblodt@icloud.com>2019-04-28 06:24:58 -0700
committerChristian Duerr <chrisduerr@users.noreply.github.com>2019-04-28 13:24:58 +0000
commitdbd8538762ef8968a493e1bf996e8693479ca783 (patch)
tree32ac2a6a5e01238a272d4ba534551d2e42903c7a /alacritty_terminal/src/tty/mod.rs
parent9c6d12ea2c863ba76015bdedc00db13b7307725a (diff)
downloadalacritty-dbd8538762ef8968a493e1bf996e8693479ca783.tar.gz
alacritty-dbd8538762ef8968a493e1bf996e8693479ca783.zip
Split alacritty into a separate crates
The crate containing the entry point is called alacritty, and the crate containing everything else is called alacritty_terminal.
Diffstat (limited to 'alacritty_terminal/src/tty/mod.rs')
-rw-r--r--alacritty_terminal/src/tty/mod.rs96
1 files changed, 96 insertions, 0 deletions
diff --git a/alacritty_terminal/src/tty/mod.rs b/alacritty_terminal/src/tty/mod.rs
new file mode 100644
index 00000000..ec175ee6
--- /dev/null
+++ b/alacritty_terminal/src/tty/mod.rs
@@ -0,0 +1,96 @@
+// 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.
+//
+//! tty related functionality
+use mio;
+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)]
+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
+/// read/write object or a seperate 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;
+}
+
+/// Events concerning TTY child processes
+#[derive(PartialEq)]
+pub enum ChildEvent {
+ /// Indicates the child has exited
+ Exited,
+}
+
+/// 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`).
+pub trait EventedPty: EventedReadWrite {
+ #[cfg(unix)]
+ fn child_event_token(&self) -> mio::Token;
+
+ /// Tries to retrieve an event
+ ///
+ /// Returns `Some(event)` on success, or `None` if there are no events to retrieve.
+ #[cfg(unix)]
+ fn next_child_event(&mut self) -> Option<ChildEvent>;
+}
+
+// Setup environment variables
+pub fn setup_env(config: &Config) {
+ // 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",
+ if Database::from_name("alacritty").is_ok() { "alacritty" } else { "xterm-256color" },
+ );
+
+ // Advertise 24-bit color support
+ env::set_var("COLORTERM", "truecolor");
+
+ // Set env vars from config
+ for (key, value) in config.env().iter() {
+ env::set_var(key, value);
+ }
+}