Releases: dankamongmen/notcurses
v2.0.0—stankonia
Reading two pages apiece of seven books every night, eh? I was young. You bowed to yourself in the mirror, stepping forward to applause earnestly, striking face. Hurray for the Goddamned idiot! Hray! No-one saw: tell no-one. Books you were going to write with letters for titles. Have you read his F? O yes, but I prefer Q. Yes, but W is wonderful. O yes, W. Remember your epiphanies on green oval leaves, deeply deep, copies to be sent if you died to all the great libraries of the world, including Alexandria? Someone was to read them there after a few thousand years, a mahamanvantara.
—James Joyce, Ulysses
On this twentieth anniversary of the release of Outkast's sublime Stankonia, I am pleased to announce the 2.0 release of Notcurses, a blingful library for character graphics and TUIs. The 2.0 release marks the first stable Notcurses API, following almost a year of intense development. Subsequent releases will follow the rules of semantic versioning, and maintain backwards compatibility. In addition to the demo included with Notcurses, two large applications have been successfully ported from NCURSES to Notcurses:
Notcurses supports both RGB and palette-indexed color natively throughout its APIs, color blending, a z-axis and planes of arbitrary area, Unicode EGCs as primary visual entities, image and video support via FFmpeg or OIIO, and a number of widgets for quickly constructing TUIs. Additionally, it provides sane and well-specified support for multithreaded use. It is built atop terminfo, and thus supports all manner of older terminals while making full use of modern implementations. On the Linux virtual console, it reprograms the font tables for improved output.
Notcurses was built in the spirit of NCURSES, but is not a source-compatible implementation of X/Open Curses (I believe the Notcurses API to be a great improvement). With that said, porting the two applications above took less than two days each, resulting in a net cut of thousands of lines. Widgets include single-item selectors, combination boxes, menus, scrolling input text areas, file and subprocess displays, and the powerful "reel" abstraction used by both Growlight and Omphalos.
Close attention has been paid to efficiency during Notcurses development, and indeed the notcurses-demo
program provides a fine benchmarking platform for terminal emulators. Notcurses can render and write out tens of thousands of frames per second, far outpacing any known display technology. Notcurses supports both full-screen mode and "direct mode", the latter allowing output to be freely intermixed with other standard I/O.
With the guarantee of a stable, proven API, I believe Notcurses to be among the best platforms for new C/C++/Rust TUI programs. Python wrappers are not yet complete, and Go wrappers are nascent, but they'll be coming soon (help wanted!). Try out notcurses-view
(an image/video viewer, much more efficient than mpv's TCT mode despite producing higher-quality output), notcurses-demo
, or even notcurses-tetris
from the source distribution. Use ncneofetch
for low-effort posts to r/unixporn. Or just watch the demo, which is well-known for blowing minds.
is your terminal ready for this?!?
This is MCin right here! This is hip-hop!
—Wu-Tang Clan, Intro
60 issues were closed during the 2.0 milestone.
—Atlanta, 2020-10-12
v1.7.6—let the ocean swell dissolve away my past
v1.7.5—no wife no whores no mustache
v1.7.4—calm like a bomb
v1.7.4
v1.7.3—made in america
Big API changes pursuant to committing to backwards-compatibility in the 2.0 release, which is likely coming before the end of September. Please consult NEWS.md
.
v1.7.2—even better than the real thing
v1.7.1—from the slums of shaolin
v1.7.0—don't pull the bang out unless you plan to bang
1.7.0 is the last major release before 2.0.0. It represents 143 closed issues, 634 commits, and almost exactly two months' development work. It was released one day ahead of schedule (original target: 2020-09-01). GNU libunistring is now necessary for building or linking Notcurses.
Release Notes
- Manipulation of the Linux kernel font tables to vastly improve appearance on the Linux console
- This can be disabled with new option
NCOPTION_NO_FONT_CHANGES
tonotcurses_init()
- This can be disabled with new option
- Significantly developed out the
ncdirect
mode:- Added
ncdirect_flush()
- Added
ncdirect_getc()
,ncdirect_getc_blocking()
,ncdirect_inputready_fd()
andncdirect_getc_nblock()
ncdirect
now puts the terminal intocbreak
mode for immediate access to input- Added
ncdirect_hline_interp()
andncdirect_vline_interp()
- Added
ncdirect_double_box()
,ncdirect_rounded_box()
, and the ridiculously flexiblencdirect_box()
- Added
- Add new
zoo
demo ncplane_puttext()
now observes Unicode word/line breaks and preserves whitespace- EGCs are now inlined into
cell
s whenever they encode to four UTF8 bytes are fewer, for significant perf/mem winscell_simple_p()
has been removed, as it is no longer a meaningful conceptcell_egc_idx()
is no longer exported (it was never meant for users)
channels_blend()
is no longer exported (it was never meant for users)NCOPTION_RETAIN_CURSOR
has been removednotcurses_cursor_enable()
now accepts a coordinate to place the terminal cursor
ncreader
now supports horizontal scrolling viaNCREADER_OPTION_HORSCROLL
- Convenience functions
ncreader_move_{left, right, up, down}()
andncreader_write_egc()
have been added - The
egc
member ofncreader_options
is nowconst
- Added
ncplane_above()
andnotcurses_bottom()
to matchncplane_below()
andnotcurses_top()
- Rust wrappers have been significantly improved by @joseluis
- New
notcurses-direct-pydemo
uses Pythonncdirect
wrappers ncdirect
now attempts to set the locale, ala regularnotcurses
ncneofetch
works in all tested terminal geometries- Several subtle bugs regarding interaction of wide glyphs with narrow glyphs on higher planes were fixed
- Menu items can now be selected with the mouse. Add
ncmenu_mouse_selection()
- PageDown/PageUp now work on
ncselector
andncmultiselector
- Plots can now be titled
- When the alternative screen is desired, but unavailable, clear the screen in
notcurses_init()
ncselector
can now have items added/removed at runtime- Channel coloring is no longer inverted on plots
notcurses-view
now prints the active blitter in the summary bar- We now work properly on
fbterm
andvt100
- Added
ncplane_parent()
andncplane_parent_const()
- We now support musl as an alternative libc
- Planes can now be named, though these names are only used in
notcurses_debug()
- Added
ncplane_new_named()
,ncplane_bound_named()
, andncplane_aligned_named()
- Added
ncdirect_init()
now takes a thirduint64_t flags
parameter. No flags have been defined as of yet.- New convenience functions
ncplane_y()
andncplane_x()
ncreel_*()
now callncreel_redraw()
themselves. Users only need call it when desiring a refresh of tablet data.- The
tabletfxn
used byncreel
for eachnctablet
has been greatly simplified. - Many elements of
ncreel_options
have been removed; they are taken from the containingncplane
- Many bug fixes in
ncreel
- Add
cell_set_fg_palindex()
andcell_set_bg_palindex()
- Added
ncplane_set_fchannel()
andncplane_set_bchannel()
- Add
iprefix()
betweenbprefix()
andqprefix()
ncplane_mergedown()
has been generalized to accept arbitrary planes and subregions.- The old behavior and signature are available as
ncplane_mergedown_simple()
- The old behavior and signature are available as
- Our CMake module has been renamed
Notcurses
fromnotcurses
to better conform to CMake conventions - Added
notcurses_lex_blitter()
,notcurses_str_blitter()
, andnotcurses_str_scalemode()
- Added
notcurses_version_components()
- Added
notcurses_render_file()
to dump last rendered frame to aFILE*
Make a business for yourself, boy, set some goals / Make a fat diamond out of dusty coals / Record number four, but we on a roll / Hold up, slow up, stop, "Control!" / Like Janet, Planet Stankonia's on ya / Moving like Floyd, comin' straight to Florida / Lock all your windows, then block the corridors / Pullin' off my belt 'cause a whipping's in order / Like a three-piece fish before I cut your daughter / Yo quiero Taco Bell, then I hit the border / Pity pat rappers trying to get to 5 / I'm a microphone fiend tryin' to stay alive / When you come to ATL, boy, you better not hide / 'Cause the Dungeon Family gon' ride, high!
v1.6.20—you kept me closer to god
v1.6.19—bitch, you have no future
among other things, fixes numerous subtle bugs on big-endian architectures resulting from EGC inlining.