diff --git a/src/libextra/term.rs b/src/libextra/term.rs index aace15ee7a671..05e9b65d19cbd 100644 --- a/src/libextra/term.rs +++ b/src/libextra/term.rs @@ -15,11 +15,11 @@ use std::io::{Decorator, Writer}; -#[cfg(not(target_os = "win32"))] use std::os; -#[cfg(not(target_os = "win32"))] use terminfo::*; -#[cfg(not(target_os = "win32"))] use terminfo::searcher::open; -#[cfg(not(target_os = "win32"))] use terminfo::parser::compiled::parse; -#[cfg(not(target_os = "win32"))] use terminfo::parm::{expand, Number, Variables}; +use std::os; +use terminfo::*; +use terminfo::searcher::open; +use terminfo::parser::compiled::{parse, msys_terminfo}; +use terminfo::parm::{expand, Number, Variables}; // FIXME (#2807): Windows support. @@ -74,7 +74,6 @@ pub mod attr { } } -#[cfg(not(target_os = "win32"))] fn cap_for_attr(attr: attr::Attr) -> &'static str { match attr { attr::Bold => "bold", @@ -93,29 +92,24 @@ fn cap_for_attr(attr: attr::Attr) -> &'static str { } } -#[cfg(not(target_os = "win32"))] pub struct Terminal { priv num_colors: u16, priv out: T, priv ti: ~TermInfo } -#[cfg(target_os = "win32")] -pub struct Terminal { - priv num_colors: u16, - priv out: T, -} - -#[cfg(not(target_os = "win32"))] impl Terminal { pub fn new(out: T) -> Result, ~str> { - let term = os::getenv("TERM"); - if term.is_none() { - return Err(~"TERM environment variable undefined"); - } + let term = match os::getenv("TERM") { + Some(t) => t, + None => return Err(~"TERM environment variable undefined") + }; - let entry = open(term.unwrap()); + let entry = open(term); if entry.is_err() { + if "cygwin" == term { // msys terminal + return Ok(Terminal {out: out, ti: msys_terminfo(), num_colors: 8}); + } return Err(entry.unwrap_err()); } @@ -241,32 +235,6 @@ impl Terminal { } } -#[cfg(target_os = "win32")] -impl Terminal { - pub fn new(out: T) -> Result, ~str> { - return Ok(Terminal {out: out, num_colors: 0}); - } - - pub fn fg(&mut self, _color: color::Color) -> bool { - false - } - - pub fn bg(&mut self, _color: color::Color) -> bool { - false - } - - pub fn attr(&mut self, _attr: attr::Attr) -> bool { - false - } - - pub fn supports_attr(&self, _attr: attr::Attr) -> bool { - false - } - - pub fn reset(&self) { - } -} - impl Decorator for Terminal { fn inner(self) -> T { self.out diff --git a/src/libextra/terminfo/parser/compiled.rs b/src/libextra/terminfo/parser/compiled.rs index bc997c5147dbd..d42340cb817e8 100644 --- a/src/libextra/terminfo/parser/compiled.rs +++ b/src/libextra/terminfo/parser/compiled.rs @@ -316,6 +316,21 @@ pub fn parse(file: &mut io::Reader, Ok(~TermInfo {names: term_names, bools: bools_map, numbers: numbers_map, strings: string_map }) } +/// Create a dummy TermInfo struct for msys terminals +pub fn msys_terminfo() -> ~TermInfo { + let mut strings = HashMap::new(); + strings.insert(~"sgr0", bytes!("\x1b[0m").to_owned()); + strings.insert(~"bold", bytes!("\x1b[1m;").to_owned()); + strings.insert(~"setaf", bytes!("\x1b[3%p1%dm").to_owned()); + strings.insert(~"setab", bytes!("\x1b[4%p1%dm").to_owned()); + ~TermInfo { + names: ~[~"cygwin"], // msys is a fork of an older cygwin version + bools: HashMap::new(), + numbers: HashMap::new(), + strings: strings + } +} + #[cfg(test)] mod test { use super::*;