MIT Latest Version docs Chat on Miaou

terminal-light

This crate answers the question "Is the terminal dark or light?".

It provides

A use case in a TUI is to determine what set of colors would be most suitable depending on the terminal's background:

let should_use_light_skin = terminal_light::luma() .map_or(false, |luma| luma > 0.6);

If you have very specialized skins, you may choose a more precise switch:

match terminal_light::luma() { Ok(luma) if luma > 0.85 => { // Use a "light mode" skin. } Ok(luma) if luma < 0.2 => { // Use a "dark mode" skin. } _ => { // Either we couldn't determine the mode or it's kind of medium. // We should use an itermediate skin, or one defining the background. } }

See the included example:

dark

light

Strategies

Here are the various strategies automatically used by terminal-light to answer the big question:

$COLORFGBG strategy

This environment variable is set by some terminals, like konsole or the rxvt family. It can also be set by users. Its value is like 15;0 where the second number is the ANSI code for the background color.

Upsides:

Downsides:

"Dynamic colors" OSC escape sequence strategy

Modern terminals implement this xterm extension: a query making it possible to know the background color as RGB.

Terminal-light sends the query on stdout, waits for the answer on stdin with a timeout of 20ms, then parses this answer.

Upsides:

Downsides:

Global strategy used by Terminal-light

  1. if we're on a unix-like platform, we try the escape sequence strategy
  2. if it failed or we're not on unix, we try the $COLORFGBG strategy
  3. without a solution, we return a TlError::Unsupported error