- Add support for (de)serializing
Reset
Color
- Add
NO_COLOR
support (https://no-color.org/) - Add option to force overwrite
NO_COLOR
(#802) - Add support for scroll left/right events on windows and unix systems (#788).
- Add
window_size
function to fetch pixel width/height of screen for more sophisticated rendering in terminals. - Add support for deserializing hex color strings to
Color
e.g #fffff.
- Make the events module an optional feature
events
(to make crossterm more lightweight) (#776)
- Set minimum rustc version to 1.58 (#798)
- Change all error types to
std::io::Result
(#765)
- Add synchronized output/update control (#756)
- Add kitty report alternate keys functionality (#754)
- Updates dev dependencies.
- Fix icorrect return in kitty keyboard enhancement check (#751)
- Fix panic when using
use-dev-tty
feature flag (#762)
- Add
SetCursorStyle
to set the cursor apearance and visibility. (#742) - Add a function to check if kitty keyboard enhancement protocol is available. (#732)
- Add filedescriptors poll in order to move away from mio in the future (can be used via
use-dev-tty
). (#735)
- Improved F1-F4 handling for kitty keyboard protocol. (#736)
- Improved parsing of event types/modifiers with certain keys for kitty protocol. (#716)
- Remove
SetCursorShape
in favour ofSetCursorStyle
. (#742) - Make Windows resize event match
terminal::size
(#714) - Rust 1.58 or later is now required.
- Add key release event for windows. (#745)
BREAKING: Copy
trait is removed from Event
, you can keep it by removing the "bracked-paste" feature flag. However this flag might be standardized in the future.
We removed the Copy
from Event
because the new Paste
event, which contains a pasted string into the terminal, which is a non-copy string.
- Add ability to paste a string in into the terminal and fetch the pasted string via events (see
Event::Paste
andEnableBracketedPaste
). - Add support for functional key codes from kitty keyboard protocol. Try out by
PushKeyboardEnhancementFlags
. This protocol allows for:- See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/#modifiers
- Press, Repeat, Release event kinds.
- SUPER, HYPER, META modifiers.
- Media keycodes
- Right/left SHIFT, Control, Alt, Super, Hyper, Meta
- IsoLevel3Shift, IsoLevel5Shift
- Capslock, scroll lock, numlock
- Printscreen, pauze, menue, keyboard begin.
- Create
SetStyle
command to allow setting various styling in one command. - Terminal Focus events (see
Event::FocusGained
andEvent::FocusLost
)
- Add DoubleUnderlined, Undercurled, Underdots the text, Underdotted, Underdashes, Underdashed attributes and allow coloring their foreground / background color.
- Fix windows unicode character parsing, this fixed various key combinations and support typing unicode characters.
- Consistency and better documentation on mouse cursor operations (BREAKING CHANGE).
- MoveTo, MoveToColumn, MoveToRow are 0-based. (left top most cell is 0,0). Moving like this is absolute
- MoveToNextLine, MoveToPreviousLine, MoveUp, MoveDown, MoveRight, MoveLeft are 1-based,. Moving like this is relative. Moving 1 left means moving 1 left. Moving 0 to the left is not possible, wikipedia states that most terminals will just default to 1.
- terminal::size returns error when previously it returned (0,0).
- Remove println from serialisation code.
- Fix mouse up for middle and right buttons.
- Fix escape codes on Git-Bash + Windows Terminal / Alacritty / WezTerm.
- Add support for cursor keys in application mode.
- Update signal-hook and mio to version 0.8.
- Fix control key parsing problem.
- Update dependencies.
- Add 0 check for all cursor functions to prevent undefined behaviour.
- Add CSIu key parsing for unix.
- Improve control character window key parsing supporting (e.g. CTRL [ and ])
- Update library to 2021 edition.
- Update yanked version crossterm-winapi and move to crossterm-winapi 0.9.0.
- Changed panic to error when calling disable-mouse capture without setting it first.
- Update bitflags dependency.
- Fix serde Color serialisation/deserialization inconsistency.
- Update crossterm-winapi 0.8.1 to fix panic for certain mouse events
- Expose
is_raw
function. - Add 'purge' option on unix system, this clears the entire screen buffer.
- Improve serialisation for color enum values.
- Update from signal-hook with 'mio-feature flag' to signal-hook-mio 0.2.1.
- Manually implements Eq, PartialEq and Hash for KeyEvent improving equality checks and hash calculation.
crossterm::ErrorKind
toio::Error
.- Added Cursor Shape Support.
- Add support for function keys F13...F20.
- Support taking any Display in
SetTitle
command. - Remove lazy_static dependency.
- Remove extra Clone bounds in the style module.
- Add
MoveToRow
command. - Remove writer parameter from execute_winapi
- Use single thread for async event reader.
- Patch timeout handling for event polling this was not working correctly.
- Add unix support for more key combinations mainly complex ones with ALT/SHIFT/CTRL.
- Derive
PartialEq
andEq
for ContentStyle - Fix windows resize event size, this used to be the buffer size but is screen size now.
- Change
Command::ansi_code
toCommand::write_ansi
, this way the ansi code will be written to given formatter.
- Fix panic when only setting bold and redirecting stdout.
- Use
tty_fd
for set/get terminal attributes
- Fix enabling ANSI support when stdout is redirected
- Update crossterm-winapi to 0.6.2
- Fix get position bug
- Fix windows 8 or lower write to user-given stdout instead of stdout.
- Make MoveCursor(Left/Right/Up/Dow) command with input 0 not move.
- Switch to futures-core to reduce dependencies.
- Command API restricts to only accept
std::io::Write
- Make
supports_ansi
public - Implement ALT + numbers windows systems.
- Fix cursor position retrieval bug linux.
- Add functionality to retrieve color based on passed ansi code.
- Switch from 'futures' to 'futures-util' crate to reduce dependency count
- Mio 0.7 update
- signal-hook update
- Make windows raw_mode act on CONIN$
- Added From<(u8, u8, u8)> Trait to Color::Rgb Enum
- Implement Color::try_from()
- Implement styler traits for
&'a str
- Improved support of keymodifier for linux, arrow keys, function keys, home keys etc.
- Add
SetTitle
command to change the terminal title. - Mio 0.7 update
- Add macros for
Colorize
andStyler
impls, add an impl forString
- Add shift modifier to uppercase char events on unix
- Fix get terminal size mac os, this did not report the correct size.
- Windows unicode support
- Reverted bug in 0.17.0: "Make terminal size function fallback to
STDOUT_FILENO
if/dev/tty
is missing.". - Support for querying whether the current instance is a TTY.
- Impl Display for MoveToColumn, MoveToNextLine, MoveToPreviousLine
- Make unix event reader always use
/dev/tty
. - Direct write command ansi_codes into formatter instead of double allocation.
- Add NONE flag to KeyModifiers
- Add support for converting chars to StylizedContent
- Make terminal size function fallback to
STDOUT_FILENO
if/dev/tty
is missing.
- Change attribute vector in
ContentStyle
to bitmask. - Add
SetAttributes
command. - Add
Attributes
type, which is a bitfield of enabled attributes. - Remove
exit()
, was useless.
- Fix CTRL + J key combination. This used to return an ENTER event.
- Add a generic implementation
Command
for&T: Command
. This allows commands to be queued by reference, as well as by value. - Remove unnecessary
Clone
trait bounds fromStyledContent
. - Add
StyledContent::style_mut
. - Handle error correctly for
execute!
andqueue!
. - Fix minor syntax bug in
execute!
andqueue!
. - Change
ContentStyle::apply
to take self by value instead of reference, to prevent an unnecessary extra clone. - Added basic trait implementations (
Debug
,Clone
,Copy
, etc) to all of the command structs ResetColor
uses&'static str
instead ofString
- Fix TIOCGWINSZ for FreeBSD
- Made windows cursor position relative to the window instead absolute to the screen buffer windows.
- Fix windows bug with
queue
macro were it consumed a type and required an type to beCopy
.
- Replace the
input
module with brand newevent
module- Terminal Resize Events
- Advanced modifier (SHIFT | ALT | CTRL) support for both mouse and key events and
- futures Stream (feature 'event-stream')
- Poll/read API
- It's highly recommended to read the Upgrade from 0.13 to 0.14 documentation
- Replace
docs/UPGRADE.md
with the Upgrade Paths documentation - Add
MoveToColumn
,MoveToPreviousLine
,MoveToNextLine
commands - Merge
screen
module intoterminal
- Remove
screen::AlternateScreen
- Remove
screen::Rawscreen
- Move and rename
Rawscreen::into_raw_mode
andRawscreen::disable_raw_mode
toterminal::enable_raw_mode
andterminal::disable_raw_mode
- Move and rename
- Move
screen::EnterAlternateScreen
andscreen::LeaveAlternateScreen
toterminal::EnterAlternateScreen
andterminal::LeaveAlternateScreen
- Replace
utils::Output
command withstyle::Print
command
- Remove
- Fix enable/disable mouse capture commands on Windows
- Allow trailing comma
queue!
&execute!
macros
- Remove thread from AsyncReader on Windows.
- Improve HANDLE management windows.
- New
input::stop_reading_thread()
function- Temporary workaround for the UNIX platform to stop the background reading thread and close the file descriptor
- This function will be removed in the next version
- Async Reader fix, join background thread and avoid looping forever on windows.
Major API-change, removed old-api
- Remove
Crossterm
type - Remove
TerminalCursor
,TerminalColor
,Terminal
- Remove
cursor()
,color()
,terminal()
- Remove re-exports at root, accessible via
module::types
(cursor::MoveTo
) input
module- Derive 'Copy' for 'KeyEvent'
- Add the
EnableMouseCapture
andEnableMouseCapture
commands
cursor
module- Introduce static function
crossterm::cursor::position
in place ofTerminalCursor::pos
- Rename
Goto
toMoveTo
- Rename
Up
toMoveLeft
- Rename
Right
toMoveRight
- Rename
Down
toMoveDown
- Rename
BlinkOn
toEnableBlinking
- Rename
BlinkOff
toDisableBlinking
- Rename
ResetPos
toResetPosition
- Rename
SavePos
toSavePosition
- Introduce static function
terminal
- Introduce static function
crossterm::terminal::size
in place ofTerminal::size
- Introduce static function
crossterm::terminal::exit
in place ofTerminal::exit
- Introduce static function
style module
- Rename
ObjectStyle
toContentStyle
. Now full names are used for methods - Rename
StyledObject
toStyledContent
and made members private - Rename
PrintStyledFont
toPrintStyledContent
- Rename
attr
method toattribute
. - Rename
Attribute::NoInverse
toNoReverse
- Update documentation
- Made
Colored
private, user should use commands instead - Rename
SetFg
->SetForegroundColor
- Rename
SetBg
->SetBackgroundColor
- Rename
SetAttr
->SetAttribute
- Rename
ContentStyle::fg_color
->ContentStyle::foreground_color
- Rename
ContentStyle::bg_color
->ContentStyle::background_color
- Rename
ContentStyle::attrs
->ContentStyle::attributes
- Rename
- Improve documentation
- Unix terminal size calculation with TPUT
- Move all the
crossterm_
crates code was moved to thecrossterm
cratecrossterm_cursor
is in thecursor
module, etc.- All these modules are public
- No public API breaking changes
- Following crates are deprecated and no longer maintained
crossterm_cursor
crossterm_input
crossterm_screen
crossterm_style
crossterm_terminal
crossterm_utils
- Fix examples link (PR #6)
- Sync documentation style (PR #7)
- Remove all references to the crossterm book (PR #8)
- Replace
RAW_MODE_ENABLED
withis_raw_mode_enabled
(PR #9) - Use
SyncReader
&InputEvent::CursorPosition
forpos_raw()
(PR #10)
- Sync documentation style (PR #4)
- Sync
SyncReader::next()
Windows and UNIX behavior (PR #5) - Remove all references to the crossterm book (PR #6)
- Mouse coordinates synchronized with the cursor (PR #7)
- Upper/left reported as
(0, 0)
- Upper/left reported as
- Fix bug that read sync didn't block (Windows) (PR #8)
- Refactor UNIX readers (PR #9)
- AsyncReader produces mouse events
- One reading thread per application, not per
AsyncReader
- Cursor position no longer consumed by another
AsyncReader
- Implement sync reader for read_char (requires raw mode)
- Fix
SIGTTIN
when executed under the LLDB - Add mio for reading from FD and more efficient polling (UNIX only)
- Sync UNIX and Windows vertical mouse position (PR #11)
- Top is always reported as
0
- Top is always reported as
to_alternate
switch back to main screen if it fails to switch into raw mode (PR #4)- Improve the documentation (PR #5)
- Public API
- Include the book content in the documentation
- Remove all references to the crossterm book (PR #6)
- New commands introduced (PR #7)
EnterAlternateScreen
LeaveAlternateScreen
- Sync Windows and UNIX raw mode behavior (PR #8)
- Refactor (PR #2)
- Added unit tests
- Improved documentation and added book page to
lib.rs
- Fixed bug with
SetBg
command, WinApi logic - Fixed bug with
StyledObject
, used stdout for resetting terminal color - Introduced
ResetColor
command
- Sync documentation style (PR #3)
- Remove all references to the crossterm book (PR #4)
- Windows 7 grey/white foreground/intensity swapped (PR #5)
- Removed
crossterm_cursor::sys
dependency (PR #2) - Internal refactoring & documentation (PR #3)
- Removed all references to the crossterm book (PR #4)
- Add deprecation note (PR #3)
- Remove all references to the crossterm book (PR #4)
- Remove unsafe static mut (PR #5)
sys::unix::RAW_MODE_ENABLED
replaced withsys::unix::is_raw_mode_enabled()
(breaking)- New
lazy_static
dependency
- Make read sync block for windows systems (PR #2)
- Maintenance release
- All sub-crates were moved to their own repositories in the
crossterm-rs
organization
As a preparation for crossterm 0.1.0 we have moved crossterm to an organisation called 'crossterm-rs'.
- Code Cleanup: warning-cleanup, crossterm_style-cleanup, crossterm_screen-cleanup, crossterm_terminal-cleanup, crossterm_utils-cleanup, 2018-cleanup, api-cleanup-1, api-cleanup-2, api-cleanup-3
- Examples: example-cleanup_1, example-cleanup_2, example-fix, commandbar-fix, snake-game-improved
- Fixed all broken tests and added tests
- Return written bytes: return-written-bytes
- Added derives:
Debug
forObjectStyle
debug-derive, Serialize/Deserialize for key events serde - Improved error handling:
- Return
crossterm::Result
from all api's: return_crossterm_resultTerminalCursor::pos()
returnsResult<(u16, u16)>
Terminal::size()
returnsResult<(u16, u16)>
TerminalCursor::move_*
returnscrossterm::Result
ExecutableCommand::queue
returnscrossterm::Result
QueueableCommand::queue
returnscrossterm::Result
get_available_color_count
returns no resultRawScreen::into_raw_mode
returnscrossterm::Result
instead ofio::Result
RawScreen::disable_raw_mode
returnscrossterm::Result
instead ofio::Result
AlternateScreen::to_alternate
returnscrossterm::Result
instead ofio::Result
TerminalInput::read_line
returnscrossterm::Result
instead ofio::Result
TerminalInput::read_char
returnscrossterm::Result
instead ofio::Result
- Maybe I forgot something, a lot of functions have changed
- Removed all unwraps/expects from library
- Return
- Add KeyEvent::Enter and KeyEvent::Tab: added-key-event-enter, added-key-event-tab
- Sync set/get terminal size behaviour: fixed-get-set-terminal-size
- Method renames:
AsyncReader::stop_reading()
tostop()
RawScreen::disable_raw_mode_on_drop
tokeep_raw_mode_on_drop
TerminalCursor::reset_position()
torestore_position()
Command::get_anis_code()
toansi_code()
available_color_count
toavailable_color_count()
Terminal::terminal_size
toTerminal::size
Console::get_handle
toConsole::handle
- All
i16
values for indexing: set size, set cursor pos, scrolling synced tou16
values - Command API takes mutable self instead of self
- Implement command API, to have better performance and more control over how and when commands are executed. PR, issue
- Fix showing, hiding cursor windows implementation
- Remove some of the parsing logic from windows keys to ansi codes to key events PR
- Made terminal size 1-based PR
- Add some derives
- Copy for KeyEvent
- CTRL + Left, Down, Up, Right key support
- SHIFT + Left, Down, Up, Right key support
- Fixed UNIX cursor position bug issue, PR
- Prefetch buffer size for more efficient windows input reads. PR
- Reset foreground and background color individually. PR
- Backtap input support. PR
- Corrected white/grey and added dark grey.
- Fixed getting cursor position with raw screen enabled. PR
- Removed one redundant stdout lock
- Removed println from
SyncReader
- Terminal size linux was not 0-based
- Windows mouse input event position was 0-based and should be 1-based
- Result, ErrorKind are made re-exported
- Fixed some special key combination detections for UNIX systems
- Made FreeBSD compile
- Fixed libc compile error
This release is all about moving to a stabilized API for 1.0.
- Major refactor and cleanup.
- Improved performance;
- No locking when writing to stdout.
- UNIX doesn't have any dynamic dispatch anymore.
- Windows has improved the way to check if ANSI modes are enabled.
- Removed lot's of complex API calls:
from_screen
,from_output
- Removed
Arc<TerminalOutput>
from all internal Api's.
- Removed termios dependency for UNIX systems.
- Upgraded deps.
- Removed about 1000 lines of code
TerminalOutput
Screen
- unsafe code
- Some duplicated code introduced by a previous refactor.
- Raw modes UNIX systems improved
- Added
NoItalic
attribute
- Bug fix for sync reader UNIX.
- Added public re-exports for input.
- Introduced KeyEvents
- Introduced MouseEvents
- Upgraded crossterm_winapi 0.2
- Introduced more
Attributes
- Introduced easier ways to style text issue 87.
- Removed
ColorType
since it was unnecessary.
- Introduced feature flags; input, cursor, style, terminal, screen.
- All modules are moved to their own crate.
- Introduced crossterm workspace
- Less dependencies.
- Improved namespaces.
- Error module is made public PR 78.
- WinApi rewrite and correctly error handled PR 67
- Windows attribute support PR 62
- Readline bug fix windows systems PR 62
- Error handling improvement.
- General refactoring, all warnings removed.
- Documentation improvement.
- Documentation refactor.
- Fixed broken API documentation PR 53.
- Added ability to pause the terminal issue
- RGB support for Windows 10 systems
- ANSI color value (255) color support
- More convenient API, no need to care about
Screen
unless working with when working with alternate or raw screen PR - Implemented Display for styled object
- Fixed bug issue 41
- Added functionality to make a styled object writable to screen issue 33
- Added unit tests.
- Bugfix with getting terminal size unix.
- Bugfix with returning written bytes pull request 31
- removed methods calls:
as_any()
andas_any_mut()
fromTerminalOutput
- Fixed resizing of ansi terminal with and height where in the wrong order.
- Input support (read_line, read_char, read_async, read_until_async)
- Styling module improved
- Everything is multithreaded (
Send
,Sync
) - Performance enhancements: removed mutexes, removed state manager, removed context type removed unnecessarily RC types.
- Bug fix resetting console color.
- Bug fix whit undoing raw modes.
- More correct error handling.
- Overall command improvement.
- Overall refactor of code.
This version has some braking changes check upgrade manual for more information about what is changed.
I think you should not switch to version 0.3.0
if you aren't going to use the AlternateScreen feature.
Because you will have some work to get to the new version of crossterm depending on your situation.
Some Features crossterm 0.3.0
- Alternate Screen for windows and unix systems.
- Raw screen for unix and windows systems Issue 5..
- Hiding an showing the cursor.
- Control over blinking of the terminal cursor (only some terminals are supporting this).
- The terminal state will be set to its original state when process ends issue7.
- exit the current process.
This create supports alternate screen for both windows and unix systems. You can use
*Nix style applications often utilize an alternate screen buffer, so that they can modify the entire contents of the buffer, without affecting the application that started them. The alternate buffer is exactly the dimensions of the window, without any scrollback region. For an example of this behavior, consider when vim is launched from bash. Vim uses the entirety of the screen to edit the file, then returning to bash leaves the original buffer unchanged.
I Highly recommend you to check the examples/program_examples/first_depth_search
for seeing this in action.
This crate now supports raw screen for both windows and unix systems. What exactly is raw state:
- No line buffering. Normally the terminals uses line buffering. This means that the input will be send to the terminal line by line. With raw mode the input will be send one byte at a time.
- Input All input has to be written manually by the programmer.
- Characters The characters are not processed by the terminal driver, but are sent straight through. Special character have no meaning, like backspace will not be interpret as backspace but instead will be directly send to the terminal. With these modes you can easier design the terminal screen.
- Hiding and showing terminal cursor
- Enable or disabling blinking of the cursor for unix systems (this is not widely supported)
- Restoring the terminal to original modes.
- Added a wrapper for managing all the functionalities of crossterm
Crossterm
. - Exit the current running process
Added examples for each version of the crossterm version. Also added a folder with some real life examples.
What is the Context
all about? This Context
has several reasons why it is introduced into crossterm version 0.3.0
.
These points are related to the features like Alternatescreen
and managing the terminal state.
-
At first
Terminal state
:Because this is a terminal manipulating library there will be made changes to terminal when running an process. If you stop the process you want the terminal back in its original state. Therefore, I need to track the changes made to the terminal.
-
At second
Handle to the console
In Rust we can use
stdout()
to get an handle to the current default console handle. For example when in unix systems you want to print something to the main screen you can use the following code:write!(std::io::stdout(), "{}", "some text").
But things change when we are in alternate screen modes. We can not simply use
stdout()
to get a handle to the alternate screen, since this call returns the current default console handle (handle to mainscreen).Because of that we need to store an handle to the current screen. This handle could be used to put into alternate screen modes and back into main screen modes. Through this stored handle Crossterm can execute its command and write on and to the current screen whether it be alternate screen or main screen.
For unix systems we store the handle gotten from
stdout()
for windows systems that are not supporting ANSI escape codes we store WinApiHANDLE
struct witch will provide access to the current screen.
So to recap this Context
struct is a wrapper for a type that manges terminal state changes.
When this Context
goes out of scope all changes made will be undone.
Also is this Context
is a wrapper for access to the current console screen.
Because Crossterm needs access to the above to types quite often I have chosen to add those two in one struct called Context
so that this type could be shared throughout library.
Check this link for more info: cleanup of rust code.
More info over writing to alternate screen buffer on windows and unix see this link
Now the user has to pass an context type to the modules of Crossterm like this:
let context = Context::new();
let cursor = cursor(&context);
let terminal = terminal(&context);
let color = color(&context);
Because this looks a little odd I will provide a type widths will manage the Context
for you. You can call the different modules like the following:
let crossterm = Crossterm::new();
let color = crossterm.color();
let cursor = crossterm.cursor();
let terminal = crossterm.terminal();
When you want to switch to alternate screen there are a couple of things to keep in mind for it to work correctly. First off some code of how to switch to Alternate screen, for more info check the alternate screen example.
Create alternate screen from Context
// create context.
let context = crossterm::Context::new();
// create instance of Alternatescreen by the given context, this will also switch to it.
let mut screen = crossterm::AlternateScreen::from(context.clone());
// write to the alternate screen.
write!(screen, "test");
Create alternate screen from Crossterm
:
// create context.
let crossterm = ::crossterm::Crossterm::new();
// create instance of Alternatescreen by the given reference to crossterm, this will also switch to it.
let mut screen = crossterm::AlternateScreen::from(&crossterm);
// write to the alternate screen.
write!(screen, "test");
like demonstrated above, to get the functionalities of cursor(), color(), terminal()
also working on alternate screen.
You need to pass it the same Context
as you have passed to the previous three called functions,
If you don't use the same Context
in cursor(), color(), terminal()
than these modules will be using the main screen and you will not see anything at the alternate screen. If you use the Crossterm type you can get the Context
from it by calling the crossterm.get_context() whereafter you can create the AlternateScreen from it.
- Bug see issue 15
- Default ANSI escape codes for windows machines, if windows does not support ANSI switch back to WinApi.
- method grammar mistake fixed Issue 3
- Some Refactorings in method names see issue 4
- Removed bin reference from crate Issue 6
- Get position unix fixed issue 8
- 256 color support.
- Text Attributes like: bold, italic, underscore and crossed word etc.
- Custom ANSI color code input to set fore- and background color for unix.
- Storing the current cursor position and resetting to that stored cursor position later.
- Resizing the terminal.