[Fork] A Text User Interface library for the Rust programming language
Go to file
2016-08-15 17:27:02 -07:00
assets Support wide characters in TextViews 2016-07-04 21:30:13 -07:00
doc Add first tutorial 2016-08-15 17:27:02 -07:00
examples Add SliderView 2016-08-13 01:03:40 -07:00
src Add SliderView 2016-08-13 01:03:40 -07:00
.gitignore Add .bk files to gitignore 2016-06-29 17:38:12 -07:00
.travis.yml Add cache: cargo to .travis.yml 2016-07-05 19:17:15 -07:00
Cargo.toml Bump version to 0.2.1 2016-08-04 20:04:04 -07:00
LICENSE Add license 2015-05-22 00:25:59 -07:00
Readme.md Add first tutorial 2016-08-15 17:27:02 -07:00
rustfmt.toml Add rustfmt.toml 2016-07-02 00:57:07 -07:00
update_doc.sh More doc fixes 2016-07-14 22:53:16 -07:00

Cursive

crates.io Build Status Clippy Linting Result MIT licensed

Cursive is a TUI (Text User Interface) library for rust. It is currently based on jeaye's ncurses-rs.

It allows you to build rich user interfaces for terminal applications.

Documentation

It is designed to be safe and easy to use:

[dependencies]
cursive = "0.2"

Or to use the latest git version:

[dependencies]
cursive = { git = "https://github.com/gyscos/Cursive" }

(You will also need ncurses installed - if it isn't already, check in your package manager.)

extern crate cursive;

use cursive::prelude::*;

fn main() {
    // Creates the cursive root - required for every application.
    let mut siv = Cursive::new();

    // Creates a dialog with a single "Quit" button
    siv.add_layer(Dialog::new(TextView::new("Hello Dialog!"))
                         .title("Cursive")
                         .button("Quit", |s| s.quit()));

    // Starts the event loop.
    siv.run();
}

Cursive dialog example

Check out the other examples to get these results, and more:

<img src="doc/examples/edit.png" alt="edit example", width="49%" /> <img src="doc/examples/lorem.png" alt="lorem example", width="49%" /> <img src="doc/examples/menubar.png" alt="menubar example", width="49%" /> <img src="doc/examples/select.png" alt="select example", width="49%" /> <img src="doc/examples/list_view.png" alt="list_view example", width="49%" /> <img src="doc/examples/theme.png" alt="theme example", width="49%" />

(Colors may depend on your terminal configuration.)

You may also have a look at the tutorial.

Goals

  • Ease of use. Simple apps should be simple. Complex apps should be manageable.
  • Linux TTY Compatibility. Colors may suffer, and UTF-8 may be too much, but most features must work properly on a Linux TTY.
  • Flexibility. This library should be able to handle simple UI scripts, complex real-time applications, or even games.
    • In particular, it tries to have enough features to recreate these kind of tools:

Non-goals

  • Extreme performance. This is a simple layout library, guys, not compiz piped into libcaca. Unless you are running it on your microwave's microcontroller, it's not going to be slow.
  • Multi-threaded UI. Callback methods are blocking - careful what you're doing in there! Feel free to use threads on your side, though.
  • Complete ncurses equivalent. You can access the underlying ncurses window when creating your own custom views, so you can do what you want with that, but the main library will probably only use a subset of the ncurses features.

Compatibility

First off, terminals are messy. A small set of features is standard, but beyond that, almost every terminal has its own implementation.

Output

  • Colors: the basic 8-colors palette should be broadly supported. User-defined colors is not supported in the raw linux TTY, but should work in most terminals, although it's still kinda experimental.
  • UTF-8: Currently Cursive really expects a UTF-8 locale. It may eventually get patched to support window borders on other locales, but it's not a priority. Also, Cursive currently expects every codepoint to be a one-column character, so some things may break with exotic characters...

Input

  • The key_codes example can be a useful tool to see how the library reacts to various key presses.
  • Keep in mind that if the terminal has shortcuts registered, they probably won't be transmitted to the app.
  • UTF-8 input should work fine in a unicode-enabled terminal emulator, but raw linux TTY may be more capricious.

Here is the support table for input keys. Tested terminals are mostly Gnome terminal and Linux TTY, xterm, and a few others now and then.

Key Shift+Key Ctrl+Key Shift+Ctrl+Key
Letters All All All (except c,z,q,s,i,h,m) None
Numbers All All None (can crash the app) None
Punctuation All All None (can crash the app) None
Enter, Esc All None None None
Left, Right arrow keys All VTE+Xterm VTE+Xterm VTE+Xterm
Up, Down arrow keys All Xterm VTE+Xterm Xterm
Ins All None (paste clipboard) Xterm None
Del All VTE+Xterm VTE+Xterm VTE+Xterm
Home, End All Xterm Xterm Xterm
PageUp, PageDown All All All None
Fn keys: F1-F4 All All except Konsole Gnome+XTerm Gnome+Xterm
Fn keys: F5-F8 All All All except TTY All except TTY
Fn keys: F9-F12 All All except TTY All except TTY All except TTY
PrtScn, ScrollLock None None None None
Window, Menu None None None None

Contribute

You want to help? Great! Here is a non-exhaustive list of things you could do:

  • Provide example use-case: a good idea of application for existing or new components.
  • Check compatibility: run the key_codes example on your favorite terminal, and report the results!
  • Test and reports issues: a bug won't get fixed if we don't know it's there.
  • Hack the code! If you feel confident with rust, pick an issue you like and hack away!