forked from lix-project/lix
Jade Lovelace
292567e0b0
This will stop printing stuff to dumb terminals that they don't support.
I've overall audited usage of isatty and replaced the ones with intent
to mean "is a Real terminal" with checking for that. I've also caught a
case of carelessly assuming "is a tty" means "should be colour" in
nix-env.
Change-Id: I6d83725d9a2d932ac94ff2294f92c0a1100d23c9
72 lines
2.3 KiB
C++
72 lines
2.3 KiB
C++
#pragma once
|
|
///@file
|
|
|
|
#include <limits>
|
|
#include <string>
|
|
|
|
namespace nix {
|
|
|
|
enum class StandardOutputStream {
|
|
Stdout = 1,
|
|
Stderr = 2,
|
|
};
|
|
|
|
/**
|
|
* Determine whether the output is a real terminal (i.e. not dumb, not a pipe).
|
|
*
|
|
* This is probably not what you want, you may want shouldANSI() or something
|
|
* more specific. Think about how the output should work with a pager or
|
|
* entirely non-interactive scripting use.
|
|
*
|
|
* The user may be redirecting the Lix output to a pager, but have stderr
|
|
* connected to a terminal. Think about where you are outputting the text when
|
|
* deciding whether to use STDERR_FILENO or STDOUT_FILENO.
|
|
*
|
|
* \param fileno file descriptor number to check if it is a tty
|
|
*/
|
|
bool isOutputARealTerminal(StandardOutputStream fileno);
|
|
|
|
/**
|
|
* Determine whether ANSI escape sequences are appropriate for the
|
|
* present output.
|
|
*
|
|
* This follows the rules described on https://bixense.com/clicolors/
|
|
* with CLICOLOR defaulted to enabled (and thus ignored).
|
|
*
|
|
* That is to say, the following procedure is followed in order:
|
|
* - NO_COLOR or NOCOLOR set -> always disable colour
|
|
* - CLICOLOR_FORCE or FORCE_COLOR set -> enable colour
|
|
* - The output is a tty; TERM != "dumb" -> enable colour
|
|
* - Otherwise -> disable colour
|
|
*
|
|
* \param fileno which file descriptor number to consider. Use the one you are outputting to
|
|
*/
|
|
bool shouldANSI(StandardOutputStream fileno = StandardOutputStream::Stderr);
|
|
|
|
/**
|
|
* Truncate a string to 'width' printable characters. If 'filterAll'
|
|
* is true, all ANSI escape sequences are filtered out. Otherwise,
|
|
* some escape sequences (such as colour setting) are copied but not
|
|
* included in the character count. Also, tabs are expanded to
|
|
* spaces.
|
|
*/
|
|
std::string filterANSIEscapes(std::string_view s,
|
|
bool filterAll = false,
|
|
unsigned int width = std::numeric_limits<unsigned int>::max(),
|
|
bool eatTabs = true);
|
|
|
|
/**
|
|
* Recalculate the window size, updating a global variable. Used in the
|
|
* `SIGWINCH` signal handler.
|
|
*/
|
|
void updateWindowSize();
|
|
|
|
/**
|
|
* @return the number of rows and columns of the terminal.
|
|
*
|
|
* The value is cached so this is quick. The cached result is computed
|
|
* by `updateWindowSize()`.
|
|
*/
|
|
std::pair<unsigned short, unsigned short> getWindowSize();
|
|
|
|
}
|