TerminalDisplayWin::TerminalDisplayWin(): TerminalDisplay(false), fStartLine(0), fIsAttached(false) { fOut = ::GetStdHandle(STD_OUTPUT_HANDLE); bool isConsole = ::GetConsoleMode(fOut, &fOldMode) != 0; SetIsTTY(isConsole); if (isConsole) { // Prevent redirection from stealing our console handle, // simply open our own. fOut = ::CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ::GetConsoleMode(fOut, &fOldMode); fMyMode = fOldMode | ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT; } HandleResizeEvent(); }
// If input is not a tty don't write in tty-mode either. TerminalDisplayUnix::TerminalDisplayUnix(): TerminalDisplay(TerminalConfigUnix::Get().IsInteractive()), fIsAttached(false), fNColors(16), fOutputID(STDOUT_FILENO) { if (::isatty(::fileno(stdin)) && !::isatty(fOutputID)) { // Display prompt, even if stdout is going somewhere else fOutputID = ::open("/dev/tty", O_WRONLY); SetIsTTY(true); } HandleResizeSignal(); // needs fOutputID gTerminalDisplayUnix() = this; signal(SIGWINCH, TerminalDisplayUnix__handleResizeSignal); #ifdef TCSANOW TerminalConfigUnix::Get().TIOS()->c_lflag &= ~(ECHO); TerminalConfigUnix::Get().TIOS()->c_lflag |= ECHOCTL|ECHOKE|ECHOE; #endif const char* TERM = getenv("TERM"); if (TERM && strstr(TERM, "256")) { fNColors = 256; } }