20 KiB
This document attempts to list user-visible changes and any major internal rearrangements of Notcurses.
-
1.6.16 (not yet released)
cell_simple_p()
has been removed. It is no longer a useful concept for user code, and its presence is indicative of a likely error.channels_blend()
has been removed. It wasn't really useful to users, and was difficult to explain.ncplane_mergedown()
has been renamedncplane_mergedown_simple()
. A more general form, capable of projecting arbitrary subregions of the source plane down to the destination plane. The source argument toncplane_mergedown_simple()
is nowconst
.
-
1.6.15 (2020-08-16)
- Styles now work properly with
ncdirect
, which apparently has never been the case until now :/. - EGCs occupying four bytes or fewer when encoded as UTF8 are now
inlined directly into the
cell
structure. This should mean nothing for you save less memory consumption per plane, and faster operation. In the course of doing so, theattrword
field of thecell
structure was renamedstylemask
, and reduced from 32 to 16 bits. notcurses_palette_size()
now returnsunsigned
.
- Styles now work properly with
-
1.6.12 (2020-08-12)
ncreel
stabletcb
callback function semantics are radically simplified. No more worrying about borders that might or might not have been drawn; simply fill up the plane that you're handed. This eliminates four of the seven arguments to these callbacks. I hope the inconvenience of adapting them is worth the elimination of complexity therein; I obviously think it is =].ncselector_redraw()
andncmultiselector_redraw()
no longer callnotcurses_render()
. You will need to callnotcurses_render()
for the display to reflect any changes.ncselector_create
now binds the plane it creates to the plane it was provided, and no longer checks to ensure the widget can be fit within the borders of this binding plane.- Added
ncplane_new_named()
,ncplane_bound_named()
, andncplane_aligned_named()
. These would be the defaults, but I didn't want to break existing code. They might become the defaults by 2.0. Names are used only for debugging (notcurses_debug()
) at this time. - Added
ncplane_parent()
andncplane_parent_const()
for accessing the plane to which a plane is bound. - The
notcurses
Rust crate (rust/notcurses
) has been moved todankamongmen/notcurses-rs
on GitHub, and removed from the tree. Jose Luis will be leading development on this high-level wrapper.
-
1.6.11 (2020-08-03)
cell_egc_idx()
is no longer exported; it was never intended to be.
-
1.6.10 (2020-08-01)
- The
egc
member ofncreader_options
is nowconst
.
- The
-
1.6.9 (2020-07-26)
- No user-visible changes.
-
1.6.8 (2020-07-26)
- No user-visible changes.
-
1.6.7 (2020-07-26)
- GNU libunistring is now required to build/load Notcurses.
- Added
ncmenu_mouse_selection()
. Escape now closes an unrolled menu when processed byncmenu_offer_input()
.
-
1.6.6 (2020-07-19)
notcurses-pydemo
is now only installed alongside the Python module, using setuptools. CMake no longer installs it.- Added
notcurses_lex_blitter()
andnotcurses_str_scalemode()
.
-
1.6.5 (2020-07-19)
- No user-visible changes.
-
1.6.4 (2020-07-19)
- Added
notcurses_str_blitter()
.
- Added
-
1.6.3 (2020-07-16)
- No user-visible changes.
-
1.6.2 (2020-07-15)
- The option
NCOPTION_NO_FONT_CHANGES
has been added. This will cause Notcurses to not muck with the current font. Because... - Notcurses now detects a Linux text console, and reprograms its Unicode to glyph tables and font data tables to include certain Box-Drawing and Block-Drawing glyphs. This vastly improves multimedia rendering and line/box art in the Linux console.
- The option
-
1.6.1 (2020-07-12)
- Added
notcurses_version_components()
to get the numeric components of the loaded Notcurses version. - Added
notcurses_render_file()
to dump last rendered frame to aFILE*
. - The
ncreel
widget has been overhauled to bring it in line with the others (ncreel
began life in another project, predating Notcurses). Thetoff
,boff
,roff
, andloff
fields ofncreel_options
have been purged, as havemin_
andmax_supported_rows
and_cols
. There is no longer any need to provide a pipe/eventfd.ncreel_touch()
,ncreel_del_focused()
, andncreel_move()
have been removed. - Added
ncdirect_hline_interp()
,ncdirect_vline_interp()
,ncdirect_rounded_box()
,ncdirect_double_box()
, and the ridiculously flexiblencdirect_box()
. - Added
ncplane_putstr_stainable()
.
- Added
-
1.6.0 (2020-07-04)
- Behavior has changed regarding use of the provided
FILE*
(which, whenNULL
, is assumed to bestdout
). Both Notcurses andncdirect
now try to open a handle to the controlling TTY, unless the providedFILE
is a TTY, in which case it is used directly. Certain interactions now only go to a TTY, in particularncdirect_cursor_yx()
and variousioctl()
s used internally. Furthermore, when no true TTY is found (true for e.g. daemonized processes and those in a Docker launched without-t
), Notcurses (in both full mode and direct mode) will return a virtual screen size of 80x24. This greatly improves behavior when redirecting to a file or lacking a TTY; one upshot is that we now have much-expanded unit test coverage in the Docker+Drone autobuilders. ncdirect_render_image()
has been added, allowing images (but not videos or animated images) to be rendered directly into the standard I/O streams. It begins drawing from the current cursor position, running through the right-hand side of the screen, and scrolling as much content as is necessary.ncneofetch
has been rewritten to usencdirect
, and thus no longer clobbers your entire terminal, and scrolls like standard I/O.
- Behavior has changed regarding use of the provided
-
1.5.3 (2020-06-28)
- The default blitter when
NCSCALE_STRETCH
is used is nowNCBLIT_2x2
, replacingNCBLIT_2x1
. It is not the default forNCSCALE_NONE
andNCSCALE_SCALE
because it does not preserve aspect ratio. - The values of
CELL_ALPHA_OPAQUE
and friends have been redefined to match their values within a channel representation. If you've been using the named constants, this should have no effect on you; they sort the same, subtract the same, and a zero initialization remains just as opaque as it ever was. If you weren't using their named constants, now's an excellent time to revise that policy.CELL_ALPHA_SHIFT
has been eliminated; if you happened to be using this, the redefinition of the otherCELL_*
constants (probably) means you no longer need to.
- The default blitter when
-
1.5.2 (2020-06-19)
- The
ncneofetch
program has been added, of no great consequence. - A
NULL
value can now be passed assbytes
toncplane_puttext()
. ncvisual_geom()
now takes scaling into account.notcurses_cantruecolor()
has been added, allowing clients to determine whether the full RGB space is available to us. If not, we only have palette-indexed pseudocolor.
- The
-
1.5.1 (2020-06-15)
- The semantics of rendering have changed slightly. In 1.5.0 and prior versions, a cell without a glyph was replaced in toto by that plane's base cell at rendering time. The replacement is now tripartite: if there is no glyph, the base cell's glyph is used; if there is a default foreground, the base cell's foreground is used; if there is a default background, the base cell's background is used. This will hopefully be more intuitive, and allows a plane to effect overlays of varying colors without needing to override glyphs (#395).
ncvisual_geom()
'sncblitter_e
argument has been replaced with aconst struct ncvisual_options*
, so thatNCVISUAL_OPTIONS_NODEGRADE
can be taken into account (the latter contains ablitter_e
field).- Added
ncuplot_sample()
andncdplot_sample()
, allowing retrieval of sample data fromncuplot
s andncdplot
s, respectively. - Added convenience function
ncplane_home()
, which sets the cursor to the plane's origin (and returnsvoid
, since it cannot fail). ncplane_qrcode()
now accepts anncblitter_e
, and two value-resultint*
symax
andxmax
. The actual size of the drawn code is returned in these parameters.
-
1.5.0 (2020-06-08)
- The various
bool
s ofstruct notcurses_options
have been folded into thatstruct
'sflags
field. Eachbool
has its ownNCOPTION_
. - Added a Pixel API for working directly with the contents of
ncvisual
s, includingncvisual_at_yx()
andncvisual_set_yx()
. - Added
ncplane_puttext()
for writing multiline, line-broken text. - Added
ncplane_putnstr()
,ncplane_putnstr_yx()
, andncplane_putnstr_aligned()
for byte-limited output of UTF-8.
- The various
-
1.4.5 (2020-06-04)
ncblit_rgba()
andncblit_bgrx()
have replaced most of their arguments with aconst struct ncvisual_options*
.NCBLIT_DEFAULT
will useNCBLITTER_2x1
(with fallback) in this context. The->n
field must be non-NULL
--new planes will not be created.- Added
ncplane_notcurses_const()
.
-
1.4.4.1 (2020-06-01)
- Got the
ncvisual
API ready for API freeze:ncvisual_render()
andncvisual_stream()
now take astruct ncvisual_options
.ncstyle_e
and a few other parameters have been moved within. Both functions now take astruct notcurses*
. Thestruct ncvisual_options
includes ancblitter_e
field, allowing visuals to be mapped to various plotting paradigms including Sixel, Braille and quadrants. Not all backends have been implemented, and not all implementations are in their final form.CELL_ALPHA_BLEND
can now be used for translucent visuals. - Added
ncvisual_geom()
, providing access to anncvisual
size and its pixel-to-cell blitting ratios. - Deprecated functions
ncvisual_open_plane()
andncplane_visual_open()
have been removed. Their functionality is present inncvisual_from_file()
. The functionncvisual_plane()
no longer has any meaning, and has been removed. - The
fadecb
typedef now accepts as its third argument aconst struct timespec
. This is the absolute deadline through which the frame ought be displayed. New functions have been added to the Fade API: like the changes toncvisual_stream()
, this gives more flexibility, and allows more precise timing. All old functions remain available.
- Got the
-
1.4.3 (2020-05-22)
- Plot: make 8x1 the default, instead of 1x1.
- Add
PREFIXFMT
,BPREFIXFMT
, andIPREFIXFMT
macros forncmetric()
. In order to properly useprintf(3)
's field width capability, these macros must be used. This is necessary to support 'µ' (micro). - C++'s NotCurses constructor now passes a
nullptr
directly through tonotcurses_init()
, rather than replacing it withstdout
. - Added
USE_STATIC
CMake option, defaulting toON
. If turnedOFF
, static libraries will not be built.
-
1.4.2.4 (2020-05-20)
- Removed
ncplane_move_above_unsafe()
andncplane_move_below_unsafe()
; all z-axis moves are now safe. Z-axis moves are all now O(1), rather than the previous O(N).
- Removed
-
1.4.2.3 (2020-05-17)
- Added
notcurses_canutf8()
, to verify use of UTF-8 encoding. - Fixed bug in
ncvisual_from_plane()
when invoked on the standard plane. ncvisual_from_plane()
now accepts the same four geometric parameters as other plane selectors. To reproduce the old behavior, forncv
, call it asncvisual_from_plane(ncv, 0, 0, -1, -1)
.ncvisual_from_plane()
,ncplane_move_below_unsafe()
,ncplane_dup()
, andncplane_move_above_unsafe()
now acceptconst
arguments where they did not before.notcurses_canopen()
has been split intonotcurses_canopen_images()
andnotcurses_canopen_videos()
.ncmetric()
now uses multibyte suffixes (particularly for the case of 'µ', i.e. micro). This has changed the values ofPREFIXSTRLEN
and friends. So long as you were usingPREFIXSTRLEN
, this should require only a recompile. If you were usingPREFIXSTRLEN
in a formatted output context to count columns, you must change toPREFIXCOLUMNS
etc.- The
streamcb
type definition now accepts aconst struct timespec*
as its third argument. This is the absolute time vizCLOCK_MONOTONIC
through which the frame ought be displayed. The callback must now effect delay. - Mouse coordinates are now properly translated for any margins.
qprefix()
andbprefix()
now take auintmax_t
in place of anunsigned
, to matchncprefix
.
- Added
-
1.4.1 (2020-05-11)
- No user-visible changes (fixed two unit tests).
-
1.4.0 (2020-05-10)
ncplane_content()
was added. It allows all non-null glyphs of a plane to be returned as a nul-terminated, heap-allocated string.ncreader
was added. This widget allows freeform input to be edited in a block, and collected into a string.selector_options
has been renamed toncselector_options
, andmultiselector_options
has been renamed toncmultiselector_options
. This matches the other widget option struct's nomenclature.ncplane_set_channels()
andncplane_set_attr()
have been added to allowncplane
attributes to be set directly and in toto.NULL
can now be passed as theFILE*
argument tonotcurses_init()
andncdirect_init()
. In this case, a newFILE*
will be created using/dev/tty
. If theFILE*
cannot be created, an error will be returned.- A
flags
field has been added tonotcurses_options
. This will allow new boolean options to be added in the future without resizing the structure. DefineNCOPTION_INHIBIT_SETLOCALE
bit. If it's not set, and the "C" or "POSIX" locale is in use,notcurses_init()
will invokesetlocale(LC_ALL, "")
. - All widgets now take an
ncplane*
as their first argument (some tooknotcurses*
before). All widgets'options
structs now have anunsigned flags
bitfield. This future-proofs the widget API, to a degree.
-
1.3.4 (2020-05-07)
notcurses_lex_margins()
has been added to lex margins expressed in either of two canonical formats. Hopefully this will lead to more programs supporting margins.ncvisual_open_plane()
has been renamedncvisual_from_file()
. The former has been retained as a deprecated alias. It will be removed by 1.6/2.0.ncvisual_from_rgba()
andncvisual_from_bgra()
have been added to support creation ofncvisual
s from memory, requiring no file.ncvisual_rotate()
has been added, supporting rotations of arbitrary radians onncvisual
objects.ncvisual_from_plane()
has been added to support "promotion" of anncplane
to anncvisual
. The source plane may contain only spaces, half blocks, and full blocks. This builds atop the new functionncplane_rgba()
, which makes an RGBA flat array from anncplane
.- The
ncplane
argument toncplane_at_yx()
is nowconst
.
-
1.3.3 (2020-04-26)
- The
ncdplot
type has been added for plots based ondouble
s rather thanuint64_t
s. Thencplot
type and allncplot_*
functions were renamedncuplot
for symmetry. - FFMpeg types are no longer leaked through the Notcurses API.
AVERROR
is no longer applicable, andncvisual_decode()
no longer returns astruct AVframe*
. Instead, thenc_err_e
enumeration has been introduced. Functions which once accepted a value-resultAVERROR
now accept a value- resultnc_err_e
. The relevant constants can be found innotcurses/ncerrs.h
. - OpenImageIO 2.1+ is now supported as an experimental multimedia backend. FFmpeg remains recommended. Video support with OIIO is spotty thus far.
- CMake no longer uses the
USE_FFMPEG
option. Instead, theUSE_MULTIMEDIA
option can be defined asffmpeg
,oiio
, ornone
. Incmake-gui
, this item will now appear as an option selector.oiio
selects OpenImageIO.
- The
-
1.3.2 (2020-04-19)
ncdirect_cursor_push()
,notcurses_cursor_pop()
, andncdirect_cursor_yx()
have been added. These are not supported on all terminals.ncdirect_cursor_yx()
ought be considered experimental; it must read a response from the terminal, and this can interact poorly with other uses of standard input.- 1.3.1 unintentionally inverted the C++
Notcurses::render()
wrapper's return code. The previous semantics have been restored.
-
1.3.1 (2020-04-18)
ncplane_at_yx()
andncplane_at_cursor()
have been changed to return a heap-allocated EGC, and write the attributes and channels to value-resultuint32_t*
anduint64_t*
parameters, instead of to acell*
. This matchesnotcurses_at_yx()
, and means they're no longer invalidated if the plane in question is destroyed. The previous functionality is available as new functionsncplane_at_yx_cell()
andncplane_at_cursor_cell()
.ncplane_set_base()
inverted itsuint32_t attrword
anduint64_t channels
parameters, thus matching every other function with these two parameters. It movedconst char* egc
before either, to force a type error, as the change would otherwise be likely to go overlooked.- Scrolling is now completely implemented. When a plane has scrolling enabled
through use of
ncplane_set_scrolling(true)
, output past the end of the last line will now result in the top line of the plane being lost, all other lines moved up one, and the bottom line cleared.
-
1.3.0 (2020-04-12)
- No user-visible changes
-
1.2.9 (2020-04-11)
- No user-visible changes
-
1.2.8 (2020-04-10)
notcurses-tetris
now happily continues if it can't load its background.
-
1.2.7 (2020-04-10)
- Plots now always keep the most recent data to their far right (i.e., the gap that is initially filled is on the left, rather than the right).
-
1.2.6 (2020-04-08)
ncplane_putsimple_yx()
andncplane_putstr_yx()
have been exported as static inline functions.ncplane_set_scrolling()
has been added, allowing control over whether a plane scrolls. All planes, including the standard plane, do not scroll by default. If scrolling is enabled, text output via the*put*
family of functions continues onto the next line when encountering the end of a row. This does not apply to e.g. boxes or lines.ncplane_putstr_yx()
now always returns the inverse of the number of columns advanced on an error (it used to return the positive short count so long as the error was due to plane geometry, not bad input).ncplot_add_sample()
andncplot_set_sample()
have been changed to accept auint64_t
rather thanint64_t
, since negative samples do not currently make sense. Plots were made more accurate in general.notcurses_term_dim_yx()
now accepts aconst struct notcurses*
.notcurses_resize()
is no longer exported. It was never necessary to call this in response to a resize, despite confusing documentation that could have been read to suggest otherwise. If you're in a long block on input, and get anNCKEY_RESIZE
, just callnotcurses_refresh()
(which now callsnotcurses_resize()
internally, asnotcurses_render()
always has).- First Fedora packaging.
-
1.2.5 (2020-04-05)
- Add ncplot, with support for sliding-windowed horizontal histograms.
- gradient, polyfill,
ncplane_format()
andncplane_stain()
all now return the number of cells written on success. Failure still sees -1 returned. ncvisual_render()
now returns the number of cells emitted on success, as opposed to 0. Failure still sees -1 returned.ncvisual_render()
now interprets length parameters of -1 to mean "to the end along this axis", and no longer interprets 0 to mean this. 0 now means "a length of 0", resulting in a zero-area rendering.notcurses_at_yx()
no longer accepts acell*
as its last parameter. Instead, it accepts auint32_t*
and auint64_t*
, and writes the attribute and channels to these parameters. This was done because thegcluster
field of thecell*
was always set to 0, which was surprising and a source of blunders. The EGC is returned via thechar*
return value. https://github.com/dankamongmen/notcurses/issues/410
-
1.2.4 (2020-03-24)
- Add ncmultiselector
- Add
ncdirect_cursor_enable()
andncdirect_cursor_disable()
.