#window #terminal-window #backend #events #pixelated

winterm

A Rust library to create a pixelated window inside a terminal

4 releases (breaking)

0.6.0 Nov 3, 2022
0.5.0 Aug 10, 2022
0.4.0 Jul 24, 2022
0.3.0 Jul 7, 2022
0.1.0 Jun 25, 2022

#15 in #terminal-window

MIT license

13KB
209 lines

winterm

Crates.io docs.rs

example image

A Rust library to create a pixelated window inside a terminal.

It uses crossterm as a backend.

Demo

cargo run --example demo

Documentation

https://docs.rs/winterm/latest/winterm/


lib.rs:

winterm

A Rust library to create a pixelated window inside a terminal.

It uses [crossterm] as a backend.

Adding winterm as a dependency

cargo add winterm@0.6.0
cargo add crossterm@0.25.0

Create a window

use winterm::Window;

let mut window = Window::new(height, width)?;

Render the next frame

use crossterm::style::Color;

window.set_pixel(0, 0, Color::Red);
window.set_pixel(
    y,
    x,
    Color::Rgb {
        r: 0x3E,
        g: 0xB4,
        b: 0x89,
    },
);
window.redraw()?;

React to events

use crossterm::event::KeyCode;

window.poll_events()?;
if window.get_key(KeyCode::Esc) {
    // the Escape key has been pressed
}
if window.get_key(KeyCode::Char('w')) {
    // the W key has been pressed
}

Example

use crossterm::{event::KeyCode, style::Color, Result};
use winterm::Window;

fn main() -> Result<()> {
    let mut window = Window::new(9, 16)?;
    let mut color = Color::Black;
    loop {
        window.poll_events()?;
        if window.get_key(KeyCode::Esc) {
            break;
        }
        if window.get_key(KeyCode::Char('n')) {
            color = match color {
                Color::Black => Color::Red,
                Color::Red => Color::Rgb {
                    r: 0x3E,
                    g: 0xB4,
                    b: 0x89,
                },
                _ => Color::Black,
            }
        }
        for y in 0..window.height() {
            for x in 0..window.width() {
                window.set_pixel(y, x, color);
            }
        }
        window.redraw()?;
    }
    Ok(())
}

Debugging

Since winterm uses the terminal "alternate screen", it can be complicated to debug using the print functions.

One way to deal with this problem is to use stderr (e.g. dbg!, eprintln!, ...) and redirect it to a file :

cargo run 2> logs

You can now use cat logs after execution or tail -f logs in another terminal to get your output while the code is still running.

Dependencies

~4–14MB
~140K SLoC