70 KiB
This document attempts to list user-visible changes and any major internal rearrangements of Notcurses.
-
3.0.5 (not yet released)
- The Hyper and Super modifiers are now supported. CapsLock and NumLock
can further be disambiguated when using the Kitty protocol. The
new functions
ncinput_super_p()
and friends have been added. ncinput
has a new field,modifiers
. The oldalt
,shift
, andctrl
booleans are now deprecated, and will be removed in 4.0.ncmenu_section
must now specify any expected modifiers for their shortucts usingmodifiers
. Setting any ofalt
,shift
, orctrl
will seencmenu_create()
fail.ncinput_equal_p()
considersNCTYPE_UNKNOWN
equal toNCTYPE_PRESS
.
- The Hyper and Super modifiers are now supported. CapsLock and NumLock
can further be disambiguated when using the Kitty protocol. The
new functions
-
3.0.4 (2022-01-08)
- We now use level 2 of
XTMODKEYS
, providing better differentiation of keyboard modifiers. We now unpack the Meta modifier. - Added
ncinput_shift_p()
,ncinput_alt_p()
,ncinput_ctrl_p()
, andncinput_meta_p()
to test for various modifiers inncinput
s. - When support is advertised, the 1016 mouse protocol will be used
to provide pixel-level detail. See the
{yx}px
fields ofncinput
.
- We now use level 2 of
-
3.0.3 (2022-01-02)
- No user-visible changes to the API, but Sixel quantization has been rewritten. It is now substantially faster, though quality has gone down for some images. I'll be working on bringing it back for 3.0.4.
-
3.0.2 (2021-12-21)
- Added
ncplane_cursor_y()
andncplane_cursor_x()
. - Added
NCOPTION_SCROLLING
, equivalent to callingncplane_set_scrolling(true)
on the standard plane. - Added
NCOPTION_CLI_MODE
, an alias for the bitwise OR ofNCOPTION_SCROLLING
,NCOPTION_NO_CLEAR_BITMAPS
,NCOPTION_NO_ALTERNATE_SCREEN
, andNCOPTION_PRESERVE_CURSOR
. - Added
ncvisual_from_sixel()
. - The control sequence corresponding to a pixel-blitted
ncvisual()
can be retrieved by usingncplane_at_yx()
on the sprixel plane.
- Added
-
3.0.1 (2021-12-14)
- Added the
NCPLANE_OPTION_VSCROLL
flag. Creating anncplane
with this flag is equivalent to immediately callingncplane_set_scrolling(true)
. - Added the
NCPLANE_OPTION_AUTOGROW
flag and thencplane_set_autogrow()
andncplane_autogrow_p()
functions. When autogrow is enabled, the plane is automatically enlarged to accommodate output at its right (no scrolling) or bottom (scrolling enabled) boundaries. - Added
notcurses_default_background()
andnotcurses_default_foreground()
. - Added
nccell_load_ucs32()
. - Added
nctree_add()
andnctree_del()
.nctree
is now dynamic.
- Added the
-
3.0.0 (2021-12-01) "In the A"
- Made the ABI/API changes that have been planned/collected during 2.x
development. This primarily involved removing deprecated functions,
and making some
static inline
(and thus no longer linkable symbols). There have been a few small renamings (i.e.ncplane_pixelgeom()
toncplane_pixel_geom()
) for purposes of regularity. The only thing removed without an obvious replacement is therenderfp
field ofnotcurses_options
, for which I make no apology. If you've been avoiding deprecated functionality, ABI3 ought require small changes, if any. notcurses_get()
andncdirect_get()
now require an absolute deadline rather than a delay bound; it ought be calculated usingCLOCK_MONOTONIC
.- The handling of geometry and distance has been normalized across all
functions. Lengths are now
unsigned
as opposed toint
. Where -1 was being used to indicate "everything", 0 is now required. This affectsncplane_as_rgba()
,ncplane_contents()
, andncvisual_from_plane()
, which all used -1. A length of zero passed to line-drawing functions is now an error. Several line-drawing functions now reliably return errors as opposed to short successes. Dimensions of 0 toncplane_mergedown()
now mean "everything". Almost all coordinates now accept -1 to indicate the current cursor position in that dimension.ncplane_highgradient()
has been deprecated in favor of the newncplane_gradient2x1()
, which takes origin coordinates.ncplane_format()
andncplane_stain()
now take origin coordinates. All now interpret theirunsigned
argument as lengths rather than closing coordinates, observing the same semantics as outlined above. ncstrwidth_valid()
, introduced in 2.4.1, has replacedncstrwidth()
entirely, and been renamed to reflect this. For the old behavior, simply add twoNULL
s to yourncstrwidth()
invocations.ncplayer
now defaults to pixel blitting.NCKEY_SIGNAL
is no longer a synonym forNCKEY_RESIZE
, but instead indicates receipt ofSIGCONT
.CELL_TRIVIAL_INITIALIZER
,CELL_CHAR_INITIALIZER
, andCELL_INITIALIZER
are all now prefixed withNC
.- A new resize callback,
ncplane_resize_placewithin()
, has been added. - The
ncinput
struct has a new field,utf8
.notcurses_get()
will fill in this array ofchar
with the NUL-terminated UTF-8 representation of the input whenever one exists.
- Made the ABI/API changes that have been planned/collected during 2.x
development. This primarily involved removing deprecated functions,
and making some
-
2.4.9 (2021-11-11)
- Added
ncnmetric()
, which usessnprintf()
internally.ncmetric()
was reimplemented as a trivial wrapper aroundncnmetric()
. qprefix()
,bprefix()
, andiprefix()
have been renamedncqprefix()
,ncbprefix()
, andnciprefix()
, respectively. All related constants have been prefixed withNC
, and the old definitions will be removed for abi3.notcurses_mice_enable()
andnotcurses_mouse_disable()
replacenotcurses_mouse_enable()
andnotcurses_mouse_disable()
, which have been deprecated, and will be removed in ABI3.notcurses_mice_enable()
takes an additionalunsigned eventmask
parameter, a bitmask union overNCMICE_*_EVENT
(NCMICE_ALL_EVENTS
is provided for convenience and future-proofing).notcurses_mice_disable()
is now astatic inline
wrapper around the former, passing 0 as the event mask. This can be used to get mouse movement buttons and focus events, which were previously unavailable.ncvisual_geom()
has been introduced, using thencvgeom
struct introduced for direct mode. This allows complete statement of geometry for anncvisual
. It replacesncvisual_blitter_geom()
, which has been deprecated, and will be removed in ABI3. It furthermore exposes some of the information previously available only fromncplane_pixelgeom()
, though that function continues to be supported.ncvgeom
'srcelly
andrcellx
fields are now (finally) filled in byncvisual_geom()
(and thusncdirectf_geom()
), and suitable for use.- On transition between
ncplane
s (on terminals implementing complex wide glyphs), Notcurses now always issues anhpa
sequence to force horizontal positioning. This fixes a number of longstanding bugs in e.g. the[uniblock]
and[whiteout]
demos at the cost of some extra control sequences. For more information, see issue 2199. The number ofhpa
s issued in this manner is tracked in a new stat,hpa_gratuitous
.
- Added
-
2.4.8 (2021-10-23)
- Added new functions
notcurses_canpixel()
andnotcurses_osversion()
. notcurses_get()
now evaluates its timeout againstCLOCK_MONOTONIC
instead ofCLOCK_REALTIME
.SIGBUS
is now included among the signals for which a handler is by default installed.
- Added new functions
-
2.4.7 (2021-10-16)
- Features 1, 2, and 8 of the Kitty keyboard protocol are now supported. This provides much more detailed and fine-grained keyboard reports, including key repeat and release events, and modifier events (i.e. pressing Shift by itself now generates an event; it is not required to press another key along with the modifier). Only Kitty supports this protocol at this time.
XTMODKEYS
is now used where supported. This is essentially a subset of the Kitty protocol discussed above.- In the absence of any
XTSMGRAPHICS
replies, advertising feature 4 in a DA1 response will be considered as claiming support for Sixel with 256 color registers. If you're a terminal author, please doXTSMGRAPHICS
. Actually, please implement the vastly superior Kitty graphics protocol. ncvisualplane_create()
now allows for a new pile to be created, by passing aNULL
ancestorncplane
invopts
. The first argument is now astruct notcurses*
rather than astruct ncplane*
.ncvisual_render()
has been deprecated in favor of the new functionncvisual_blit()
. When aNULL
vopts->n
is passed toncvisual_blit()
, a new plane is created (as it was inncvisual_render()
), but that plane is the root of a new pile, rather than a child of the standard plane. The only tricky conversion is if you previously hadvopts.n
asNULL
, and were not usingNCVISUAL_OPTION_CHILDPLANE
(or were passingNULL
asvopts
). This would result in a new plane bound to the standard plane withncvisual_render()
, but withncvisual_blit()
it will create a new pile. To keep the behavior, explicitly pass the standard plane asvopts->n
, and includeNCVISUAL_OPTION_CHILDPLANE
invopts->flags
. All other cases will continue to work as they did before.
-
2.4.5 (2021-10-06)
- The poorly-considered function
ncplane_boundlist()
, added in 2.3.17, has been removed, having never ought have been born. - Added functions
ncplane_move_family_top()
,ncplane_move_family_bottom()
,ncplane_move_family_above()
, andncplane_move_family_below()
. - Added functions
ncplane_set_name()
andncplane_name()
.
- The poorly-considered function
-
2.4.4 (2021-10-03)
- Notcurses no longer uses libreadline, as it was realized to be incompatible
with the new input system.
ncdirect_readline()
has been rewritten to work without libreadline, which means it's now always available (readline was an optional dependency).NCDIRECT_OPTION_INHIBIT_CBREAK
should not be used withncdirect_readline()
, or else it can't implement line-editing keybindings. - Helper function
ncwcsrtombs()
is now available for converting awchar_t *
to a heap-allocated UTF-8char *
. - Building without a C++ compiler is now supported using
-DUSE_CPP=off
. See the FAQs for restrictions.
- Notcurses no longer uses libreadline, as it was realized to be incompatible
with the new input system.
-
2.4.3 (2021-09-26)
ncplane_erase_region()
has been made much more general, and can now operate relative to the current cursor.- Several terminal emulators have recently changed their semantics regarding DECSDM. These changes correctly match the real VT340 behavior. Unfortunately, this means we always draw Sixels in the upper left corner of the screen. Code has been added to deal with XTerm 369, the ayosec/graphics branch of Alacritty 15.1, foot 1.8.2, and MinTTY 3.5.2.
-
2.4.2 (2021-09-19)
- The Rust wrappers have been moved to dankamongmen/libnotcurses-sys, under the continued stewardship of @joseluis.
- You can now set a resize callback on the standard plane.
- Added
notcurses_getvec()
, providing batched input. - Added
NCOPTION_DRAIN_INPUT
. Notcurses now launches a thread to process input, so that it can respond to terminal messages with minimal latency. Input read fromstdin
intended for the client is buffered until retrieved. If your client never intends to read this input, provide this flag to eliminate unnecessary processing, and ensure Notcurses can always retrieve terminal messages (if buffers are full, Notcurses cannot continue reading). Likewise addedNCDIRECT_OPTION_DRAIN_INPUT
. - Removed a bunch of deprecated
static inline
functions from the headers. - A new field,
evtype
, has been added toncinput
. It takes a value from amongNCTYPE_{UNKNOWN, PRESS, REPEAT, RELEASE}.
. Where possible, Notcurses will distinguish between a press, repeat, and release. This cannot be done in all environments, nor with all inputs. TheNCKEY_RELEASE
definition is no longer returned; instead, the appropriateNCKEY_BUTTONx
synthesized key is returned, withEVTYPE_RELEASE
set. NCKEY_EOF
now indicates the end of input.
-
2.4.1 (2021-09-12)
notcurses_check_pixel_support()
still returns 0 if there is no support for bitmap graphics, but now returns anncpixelimple_e
to differentiate the pixel backend otherwise. This result is strictly informative.- Added
ncstrwidth_valid()
, which is likencstrwidth()
except that it returns partial results in the case of an invalid character.ncstrwidth()
will become astatic line
wrapper ofncstrwidth_valid()
in ABI3.
-
2.4.0 (2021-09-06)
- Mouse events in the Linux console are now reported from GPM when built
with
-DUSE_GPM=on
.
- Mouse events in the Linux console are now reported from GPM when built
with
-
2.3.18 (2021-08-31)
- No user-visible changes.
-
2.3.17 (2021-08-22)
- Added
notcurses_enter_alternate_screen()
andnotcurses_leave_alternate_screen()
. - Added
ncplane_boundlist()
. - Plots now support
NCBLIT_PIXEL
!
- Added
-
2.3.16 (2021-08-19)
- Fix
ncdirect_set_*_rgb()
for the case where an emulator has fewer than 8 colors, i.e. vt100. This release exists to make unit tests work again on the Alpine and Fedora buildservers.
- Fix
-
2.3.15 (2021-08-17)
ncneofetch
has been changed to use "CLI mode" instead of Direct Mode, as a proof of concept. It is very likely that Direct Mode will be deprecated for ABI3. New code ought not be written using it.- Added
ncplane_scrollup()
andncplane_scrollup_child()
. - Fixed grotesque errors in
ncplane_set_*_palindex()
. - Removed support for the iTerm2 graphics protocol, which is unsuitable for the Notcurses model. macOS users who want graphics are recommended to use Kitty or WezTerm. It will be added back if it gains necessary capabilities.
-
2.3.13 (2021-08-04)
- Added the portable utility functions
notcurses_accountname()
andnotcurses_hostname()
.
- Added the portable utility functions
-
2.3.12 (2021-07-29)
notcurses_getc()
andncdirect_getc()
no longer accept asigset_t*
as their third argument. Instead, they accept avoid*
, with which they will do nothing. This is due to POSIX signals being unportable in addition to terrible, and this one wart complicating wrappers a great deal. If you were using this functionality, you were probably using it incorrectly, no offense. If you're certain you were doing it right, roll your own withpthread_sigmask()
, and accept the race condition. For ABI3, these functions will be dropped entirely; for now they have only been marked deprecated. New functionsncdirect_get()
andnotcurses_get()
elide this parameter entirely, and ought be used in new code. All callers have been updated.- Added
nccell_cols()
, which is justnccell_width()
except it doesn't require the firstconst ncplane*
argument, and it'sstatic inline
.nccell_width()
has been deprecated, and will be removed in ABI3. ncvisual_subtitle_plane()
now handles all LibAV subtitle types, including Type-1 DVB (bitmap subtitles), so long as a pixel blitter is available.ncvisual_subtitle()
has been deprecated, and will be removed in ABI3.- Add
ncvisual_from_palidx()
, which does what you would think.
-
2.3.11 (2021-07-20)
- Notcurses now requires libz to build. In exchange, it can now generate PNGs on the fly, necessary for driving iTerm2's graphics protocol.
- Experimental code has been added to draw graphics using both the iTerm2 protocol and directly to the Linux console framebuffer. This functionality is still quite raw, but can be played with.
- Added
NCPLANE_OPTION_FIXED
, to prevent a plane bound to a scrolling plane from scrolling along with it. Otherwise, bound planes will scroll along with the parent plane so long as the planes intersect. - Added
input_errors
andinput_events
stats. NCALPHA_HIGHCONTRAST
now works properly atop default backgrounds.SIGFPE
is now included among the fatal signals for which handlers are by default installed. Unsure how I overlooked it this long.
-
2.3.10 (2021-07-14)
- Notcurses now builds and works, so far as I can tell, on OS X 11.4+.
- Emit XTPUSHCOLORS and XTPOPCOLORS where supported (XTerm and Kitty).
notcurses-info
now works around Unicode unsupported by the local platform, so that other output remains available.
-
2.3.9 (2021-07-12)
- Fixed major regressions from 2.3.8: menu highlighting is working once more, as are pointer inputs (mice) and the 8x1 plotter. Sorry about that!
notcurses_detected_terminal()
andncdirect_detected_terminal()
now both return a heap-allocated string, which will contain the terminal version if Notcurses was able to detect it. This result ought be free()d.- Added
ncplane_move_rel()
. - Documented
ncplane_move_yx()
innotcurses_plane.3
, and removed the false comment that "passing -1 as a coordinate will hold that axis constant" fromUSAGE.md
andnotcurses.h
. This has never been true. - Added
ncdirect_putegc()
to perform Unicode segmentation. It returns the number of columns consumed, and makes available the number of bytes used by the EGC. ncmenu
s can now be used with any plane, not just the standard plane.- Added
ncchannels_reverse()
, which reverses the color aspects of the two channels, while keeping other elements constant. CHANNELS_RGB_INITIALIZER
andCHANNEL_RGB_INITIALIZER
have been renamedNCCHANNELS_INITIALIZER
andNCCHANNEL_INITIALIZER
. The former two are now deprecated, and will be removed for ABI3.
-
2.3.8 (2021-07-04)
- Marked all capability functions
__attribute__ ((pure))
. If you were callingnotcurses_check_pixel_support()
before in order to enable pixel blitting (unnecessary since 2.3.5), you might get compiler warnings about statements without effects. Just remove the call if so. - Fixed bugs in
ncvisual_blitset_geom()
andncvisual_render()
when usingNCVISUAL_OPTION_CHILDPLANE
in certain configurations. - Fixed some serious bugs in the OpenImageIO backend.
- Disabled Synchronized Update Mode for Kitty in response to upstream bugs.
- Marked all capability functions
-
2.3.7 (2021-06-29)
- Deprecated
NCSTYLE_REVERSE
andNCSTYLE_DIM
. The remainder are safe, and I added backNCSTYLE_BLINK
according to popular demand. - Added
NCOPTION_PRESERVE_CURSOR
. If used, the standard plane's virtual cursor will be initialized to match its position at startup, rather than starting in the upper-left corner. Together with a scrolling standard plane and inhibition of the alternate screen, this allows rendered mode to easily be used for scrolling shell environment programs. - Control characters from C0 and C1 are now rejected when loading
nccell
s or writing to a plane (except for newline, when using a scrolling plane). This was always intended, but never enforced. Horizontal tabs might be enabled anew sometime in the future. ncls
now defaults toNCBLIT_PIXEL
.- Added
ncplane_scrolling_p()
to retrieve a plane's scrolling status. - Greatly expanded
notcurses-info
.
- Deprecated
-
2.3.6 (2021-06-23)
- Fixed (harmless) warning with
-Wformat-security
. - Remove
NCSTYLE_{INVIS,BLINK,STANDOUT}
with extreme prejudice. They remain defined for now, but will be removed for ABI3. - Deprecated
notcurses_debug_caps()
, which no longer generates output. Hey, I explicitly commented that its output was "subject to change".
- Fixed (harmless) warning with
-
2.3.5 (2021-06-23)
- Happy day! The terminal interrogation routines in the initialization code
have been completely revamped. The first outcome of this is that Sixel
parameters are now opportunistically read at startup, and thus there is
no longer any need to call
notcurses_check_pixel_support()
before usingNCBLIT_PIXEL
. If it's there, it'll be used; if not, it'll degrade or fail. The new routines rely on the terminal answering the Send Device Attributes escape; if it does not, Notcurses may refuse to start, or even hang. Please report a bug if you run into this. It is still necessary to supply a correctTERM
environment variable, because this is used to index into theterminfo(5)
database, which seeds most common escapes. The extended capabilities of some modern terminals, however, will be retrieved independently ofTERM
; they'll be made available for use if supported by the connected terminal, and others will not, even if yourTERM
variable implies they ought. ncplane_as_rgba()
/ncvisual_from_plane()
now supportNCBLIT_BRAILLE
.CELL_ALPHA_*
macros are nowNCALPHA_*
. The former will remain#define
d until ABI3.- Filled out the complete set of
ncdirect_can*()
capability functions, which now match thenotcurses_can*()
API. Addedncdirect_canget_cursor()
to check if the cursor can be located. ncdirect_dim_y()
andncdirect_dim_x()
no longer accept aconst ncdirect*
, since they update the term parameters. Sorry!- Added
NCDIRECT_OPTION_VERBOSE
andNCDIRECT_OPTION_VERY_VERBOSE
. They map toNCLOGLEVEL_WARNING
andNCLOGLEVEL_TRACE
, respectively. - New functions
ncvisual_from_rgb_packed()
andncvisual_from_rgb_loose()
. - New stat
sprixelbytes
. - Added new functions
ncpile_render_to_buffer()
andncpile_render_to_file()
. Rewrotenotcurses_render_to_buffer()
andnotcurses_render_to_file()
as trivial wrappers around these functions, and deprecated the latter. They will be removed in ABI3. - Added support for application-synchronized updates, and a new stat.
- Happy day! The terminal interrogation routines in the initialization code
have been completely revamped. The first outcome of this is that Sixel
parameters are now opportunistically read at startup, and thus there is
no longer any need to call
-
2.3.4 (2021-06-12)
- Added the flag
NCVISUAL_OPTION_NOINTERPOLATE
to use non-interpolative scaling inncvisual_render()
.ncvisual_render()
without a multimedia engine will now use this method for any requested scaling (previously, scaling was not performed without a linked multimedia backend). NCVISUAL_OPTION_BLEND
used withNCBLIT_PIXEL
will now, when the Kitty graphics protocol is in use, cut the alpha of each pixel in half.ncvisual_inflate()
has been rewritten as a wrapper around the new functionncvisual_resize_noninterpolative()
, and deprecated. It will be removed for ABI3. Godspeed,ncvisual_inflate()
; we hardly knew ye.ncdirectf_render()
has been changed to accept ancvisual_options
, replacing and extending its four final arguments. Sorry about the breakage here, butncdirectf_render()
was introduced pretty recently (2.3.1). As a result,ncdirectf_render()
andncdirect_stream()
now honorNCVISUAL_OPTION_BLEND
andNCVISUAL_OPTION_NOINTERPOLATE
. All of this also applies toncdirect_geomf()
.ncplayer
now accepts-n
to force non-interpolative scaling.- A new binary is installed,
notcurses-info
. It prints information about the terminal environment in which it runs. More information is available from its man page,notcurses-info(1)
. - Added
ncdirect_light_box()
,ncdirect_heavy_box()
,ncdirect_ascii_box()
,nccells_light_box()
, andnccells_heavy_box()
. Publicizednccells_ascii_box()
. All arestatic inline
. - A bug was fixed in
ncplane_move_yx()
: root planes were being moved relatively instead of absolutely. This was never the intended behavior. - It used to be possible to pass
NULL
as the second parameter ofncplane_mergedown_simple()
, and have the standard plane be used as the destination. This is no longer supported, since the source plane could be in another pile. An error will instead be returned. - Fixed a bug in
ncdirect_box()
where default/palette-indexed colors weren't properly used on the top and bottom borders. - Added
notcurses_detected_terminal()
andncdirect_detected_terminal()
.
- Added the flag
-
2.3.2 (2021-06-03)
- Fixed a bug affecting certain scalings of
ncvisual
objects created from memory (e.g.ncvisual_from_rgba()
). - Fixed a bug where setting a style in direct mode reset color. Shocked that such a bug could exist for so long, ugh.
- Fixed memory leaks in the
ffmpeg
andnone
implementations of thencvisual
API, and also thelibnotcurses-core
implementation. ncinput_nomod_p()
has been added. This function returnstrue
if and only if itsncinput
argument has no modifiers active.- Added
notcurses_cursor_yx()
to get the current location of the cursor. - Added
ncdirect_supported_styles()
. ncplane_at_yx()
now properly integrates the plane's base cell when appropriate, and thus represents the cell as it will be used during rendering. This change cascades, affecting e.g.ncplane_contents()
.ncplane_at_yx()
now returns the EGC when called on any column of a wide glyph.ncplane_at_yx_cell()
continues to duplicate the exactnccell
, and can thus continue to be used to distinguish between primary and secondary columns of a wide glyph. Likewise,notcurses_at_yx()
now returns the EGC when called on any column of a wide glyph.- Sadly,
ncplane_contents()
no longer accepts aconst ncplane*
, since it might write temporaries to the plane's EGCpool during operation. - Added
ncdirect_styles()
, to retrieve the current styling. - In previous versions of Notcurses, a rendered-mode context
(
struct notcurses
) and a direct-mode context (struct ncdirect
) could be open at the same time. This was never intended, and is no longer possible.
- Fixed a bug affecting certain scalings of
-
2.3.1 (2021-05-18)
- Sprixels no longer interact with their associated plane's framebuffer. This
means plane contents are maintainted across blitting a sprixel and then
independently destroying that sprixel (i.e. without destroying the plane).
While the sprixel is bound to the plane, these contents are ignored (save
that they will be reported by
ncplane_at_yx()
). Since no method currently exists to destroy a sprixel without destroying its plane, I don't think this will impact anyone. - 8bpc RGB is unconditionally enabled if the terminal emulator is determined
to be Kitty, Alacritty, or foot; there is no longer any need to export
COLORTERM
on these terminals. - Fixed bad bug in
ncvisual_resize()
when growing an image. This isn't relevant to enlarging anncvisual
via scaling, but only when persistently growing one withncvisual_resize()
. - Direct mode image rendering now honors the
maxy
andmaxx
parameters, which specify the maximum number of cell rows and columns, respectively, to use for the render. They were previously ignored, contrary to documentation. It is now an error to pass a negative number for either of these values. Use 0 to specify "as much space as is necessary". - Added
ncdirectf_from_file()
,ncdirectf_geom()
, andncdirectf_render()
, with the net result that you can now (efficiently) get media geometry in direct mode. If you don't care about media geometry, you can keep usingncdirect_render_frame()
and/orncdirect_render_image()
, and Godspeed. Oh yes, andncdirectf_free()
. Rien n'est simple, mais tout est facile....
- Sprixels no longer interact with their associated plane's framebuffer. This
means plane contents are maintainted across blitting a sprixel and then
independently destroying that sprixel (i.e. without destroying the plane).
While the sprixel is bound to the plane, these contents are ignored (save
that they will be reported by
-
2.3.0 (2021-05-09) "Triumph"
- No user-visible changes.
-
2.2.11 (2021-05-08)
notcurses-core.pc
is now generated with aRequires.private
line matching the local system's source of Terminfo. This ought resolve static linking on systems with libtinfo embedded into libncurses.- Added
ncblit_rgb_loose()
andncblit_rgb_packed()
helpers for blitting 32bpp RGBx and 24bpp RGB. - Added
ncplane_erase_region()
to initialize allnccell
s within a region of a plane.
-
2.2.10 (2021-05-05)
- Added
NCVISUAL_OPTION_CHILDPLANE
to interpret then
field ofncvisual_options
as a parent plane. - Reimplemented
ncdirect_cursor_down()
using vertical tabs instead of thecud
capability, so that it now scrolls when on the last line. Thanks to Daniel Eklöf for this idea, of which I was totally ignorant! - Fixed several embarrassing
assert()
s which I'd not had exposed due to misuse of CMake. - Fixed a state machine bug that caused sprixels to sometimes not be properly redisplayed following a rebuild.
- Added
-
2.2.9 (2021-05-03)
- Added two new stats,
sprixelemissions
andsprixelelisions
. - Added
notcurses_canhalfblock()
andnotcurses_canquadrant()
. - The
palette256
type has been renamedncpalette
, and all functions prefixed withpalette256_
have been deprecated in favor of versions prefixed withncpalette_
, which the former now wrap. The old versions will be removed in ABI3. - All functions prefixed with
channel_
have been deprecated in favor of versions prefixed withncchannel_
, which the former now wrap. The old versions will be removed in ABI3. - All functions prefixed with
channels_
have been deprecated in favor of versions prefixed withncchannels_
, which the former now wrap. The old versions will be removed in ABI3. SIGINT
,SIGQUIT
, andSIGTERM
are now masked for the calling thread when writing starts, and unmasked when writing has ended. This prevents the writing thread from handling these signals in the middle of a write, which could otherwise leave the terminal locked up (if it resulted in aborting an escape sequence). The signal will be delivered when unblocked. For this to work properly, other threads ought also have these signals blocked.notcurses_getc()
and friends thus no longer drop these signals from the providedsigset_t
; they are instead added if not present.- Added
nccell_width()
to get the column length of annccell
.
- Added two new stats,
-
2.2.8 (2021-04-18)
- All remaining functions prefixed with
cell_
orcells_
have been deprecated in favor of versions prefixed withnccell_
ornccell_
, respectively, which the former now wrap. The old versions will be removed in ABI3. ncvisual_inflate()
has been added to perform non-interpolative enlarging. It is intended for use with pixel art.
- All remaining functions prefixed with
-
2.2.6 (2021-04-12)
ncplane_rgba()
has been deprecated in favor of the new functionncplane_as_rgba()
, which the former now wraps. It will be removed in ABI3. The new function can report the synthesized pixel geometry.ncvisual_geom()
has been deprecated in favor of the new functionncvisual_blitter_geom()
, which the former now wraps. It will be removed in ABI3. The new function can report the chosen blitter.ncplane_pixelgeom()
has been added, allowing callers to determine the size of the plane and cells in pixels, as well as the maximum bitmap size that can be displayed.- Added new function
ncdirect_stream()
, which does what you'd think. cell_release()
andcell_duplicate()
have been migrated tonccell_release()
andnccell_duplicate()
, respectively. The former forms have been deprecated, and will be removed in API3.- Added
NCVISUAL_OPTION_ADDALPHA
, and thetranscolor
field toncvisual_options
. If the former flag is used, the latter color will be treated as transparent.
-
2.2.5 (2021-04-04)
- Bugfix release, no user-visible changes.
-
2.2.4 (2021-03-29)
- Implemented EXPERIMENTAL
NCBLIT_PIXEL
for terminals reporting the Kitty pixel graphics protocol. - Added
notcurses_debug_caps()
to dump terminal properties, both those reported and those inferred, to aFILE*
. - Added
NCOPTION_NO_CLEAR_BITMAPS
option fornotcurses_init()
. - Added
ncplane_valign()
andncplane_halign()
.ncplane_align()
is now an alias forncplane_halign()
, and deprecated. - Added
NCVISUAL_OPTION_HORALIGNED
andNCVISUAL_OPTION_VERALIGNED
flags forncvisual_render()
. - Added
NCPLANE_OPTION_VERALIGNED
flag forncplane_create()
. - Added the
nctabbed
widget for multiplexing planes data with navigational tabs. Courtesy Łukasz Drukała, in his first contribution. - Removed notcurses_canpixel(), which was obsoleted by notcurses_check_pixel_support().
- Added
NCPLANE_OPTION_MARGINALIZED
flag forncplane_create()
. Added thencplane_resize_marginalized()
resize callback. This allows you to have automatic resizing with a margin relative to some parent plane.
- Implemented EXPERIMENTAL
-
2.2.3 (2021-03-08)
- Implemented EXPERIMENTAL
NCBLIT_PIXEL
for terminals reporting Sixel support. Addednotcurses_check_pixel_support()
and its companionncdirect_check_pixel_support()
, which must be called (and must return success) beforeNCBLIT_PIXEL
will be available.NCBLIT_PIXEL
degrades toNCBLIT_3x2
until support is verified. This functionality is not yet well integrated into general rendering; it will not play nicely with other intersecting planes. Do not rely on current behavior. - Add the
nctree
widget for line-oriented hierarchical data. See the newnotcurses_tree(3)
man page for complete information. - Ceased exporting
cell_fchannel()
,cell_bchannel()
,cell_set_fchannel()
, andcell_set_bchannel()
. These functions were never safe for users. Everything a user might want to manipulate can be manipulated with more granular functions. - Add
SIGILL
to the set of fatal signals we handle. - Added
NCKEY_SIGNAL
.NCKEY_RESIZE
is now an alias forNCKEY_SIGNAL
. SIGCONT
now synthesizes aNCKEY_SIGNAL
, just likeSIGWINCH
.
- Implemented EXPERIMENTAL
-
2.2.2 (2021-02-18):
notcurses_stats()
no longer qualifies itsnotcurses*
argument withconst
, since it now takes a lock. I'm sorry about that, though on the plus side, data races can no longer result in invalid stats.ncplane_qrcode()
no longer accepts a blitter argument, sinceNCBLIT_2x1
is the only one that actually works with qr code scanners. I'm unaware of any externalncplane_qrcode()
users, so hopefully this isn't a problem.
-
2.2.1 (2021-02-09):
- Brown-bag release: fix UTF8 discovery in direct mode. Sorry!
-
2.2.0 (2021-02-08):
- Add
notcurses_canbraille()
capability predicate.
- Add
-
2.1.8 (2021-02-03):
- The
notcurses-tetris
binary has been renamednctetris
. - The new function
channel_set_palindex()
has been added. NCDIRECT_OPTION_NO_READLINE
has been removed after a short life.ncdirect_readline()
has been added. The first time used, it initializes Readline. Readline will be destroyed by ncdirect_stop() if it was ever initialized.
- The
-
2.1.7 (2021-01-21):
- Notcurses has been split into two libraries,
notcurses-core
andnotcurses
. The latter contains the heavyweight multimedia code, so that applications which don't need this functionality can link against only the former.pkg-config
support is present for both. If using onlynotcurses_core
, use the new functionsnotcurses_core_init()
and/orncdirect_core_init()
in place ofncdirect_init()
andnotcurses_init()
, or your program is unlikely to link. - The
notcurses-view
binary has been renamedncplayer
.
- Notcurses has been split into two libraries,
-
2.1.5 (2021-01-15):
- Notcurses now depends on GNU Readline at build and runtime, entirely
for the benefit of direct mode, which now prepares GNU Readline for safe
use (unless the new
NCDIRECT_OPTIONS_NO_READLINE
is used). ncplane_putstr_yx()
,ncplane_putstr_stained()
, andncplane_putnstr_yx()
now return the number of columns output, as long documented (they were mistakenly returning the number of bytes).ncplane_abs_yx()
has been added, returning the absolute coordinates of the plane's origin (i.e. coordinates relative to its pile).
- Notcurses now depends on GNU Readline at build and runtime, entirely
for the benefit of direct mode, which now prepares GNU Readline for safe
use (unless the new
-
2.1.4 (2021-01-03):
- Direct mode now supports
NCDIRECT_OPTION_NO_QUIT_SIGHANDLERS
, and by default installs signal handlers similar to those of fullscreen mode. They will attempt to reset the terminal, and propagate the signal. - Add
channels_fg_palindex()
andchannels_bg_palindex()
.
- Direct mode now supports
-
2.1.3 (2020-12-31)
ncdirect_styles_{set, on, off}()
have been deprecated in favor ofncdirect_{set, on, off}_styles()
, to matchncplane_
equivalents.ncdirect_raster_frame()
no longer requiresblitter
norscale
.ncdirect_{fg, bg}_{default, rgb}()
have been deprecated in favor ofncdirect_set_{fg, bg}_{default, rgb}()
, to matchncplane
.
-
2.1.2 (2020-12-25)
- Add
notcurses_linesigs_enable()
andnotcurses_linesigs_disable()
. - Divide
ncdirect_render_image()
into componentncdirect_render_frame()
andncdirect_raster_frame()
(the original remains), allowing multiple threads to decode images concurrently. - Sextants are now considered supported for certain values of
TERM
. ncvisual_default_blitter()
has been deprecated in favor of the new functionncvisual_media_defblitter()
. This function's opaque logic accepts astruct notcurses *
, providing some future-proofing against blitter changes. This function is necessary to getNCBLIT_3x2
fromNCBLIT_DEFAULT
.
- Add
-
2.1.1 (2020-12-16)
- Progress bars via
ncprogbar
, using the standard widget API.
- Progress bars via
-
2.1.0 (2020-12-13)
cell
has been renamednccell
. The old name has been kept as an alias, but ought be considered deprecated. It will be removed in Notcurses 3.0.
-
2.0.12 (2020-12-12)
ncplane_resize_maximize()
has been added, suitable for use as aresizecb
. It resizes the plane to the visual area's size, and is the resizecb used by the standard plane.
-
2.0.11 (2020-12-09)
- Added
ncplane_descendant_p()
predicate.
- Added
-
2.0.10 (2020-12-06)
ncpile_top()
andncpile_bottom()
have been added, returning the top or bottommost plane, respectively, of the pile containing their argument.- Added
cell_load_egc32()
, allowing a cell to be released and then reloaded with a UTF-8 EGC of up to 4 bytes, passed as auint32_t
(as opposed to aconst char *
).
-
2.0.9 (2020-12-01)
ncmenu
s now automatically expand or shrink to match their binding plane.
-
2.0.8 (2020-11-27)
- The major, minor, and patch versions are now available as preprocessor
numeric defines, fit for comparisons at the cpp level. The
NOTCURSES_VERSION_COMPARABLE
macro has been added, to form a comparable version ID from a provided major, minor, and patch level. TheNOTCURSES_VERNUM_ORDERED
macro has been added, defined as a comparable version ID for the current version of Notcurses. - Add new function
ncplane_reparent_family()
, which reparents a plane and its bindtree (all planes bound to the plane, recursively).ncplane_reparent()
now reparents only the specified plane; any planes bound to it are reparented to its old parent. - Move to a multipile model. For full details, consult
https://groups.google.com/g/notcurses/c/knB4ojndv8A and
https://github.com/dankamongmen/notcurses/issues/1078 and
notcurses_plane(3)
. In short:- A
struct notcurses
is now made up of one or more piles. A pile is one or morencplane
s, with a bindtree and a z-axis. Different piles can be mutated or rendered concurrently. There is no new user-visible type: astruct notcurses
can be treated as a single pile. - To create a new pile from a new plane, use the new function
ncpile_create()
. The returned plane will be the top, bottom, and root of a new plane. Alternatively, usencplane_reparent()
orncplane_reparent_family()
with the source equal to the destination. - Add new function
ncpile_render()
, which renders the pile containing the specified plane to the specified buffer. Add new functionncpile_rasterize()
to rasterize the specified buffer to output.
- A
- Added
NCSTYLE_STRUCK
for strikethrough.
- The major, minor, and patch versions are now available as preprocessor
numeric defines, fit for comparisons at the cpp level. The
-
2.0.7 (2020-11-21)
- The
horiz
union ofncplane_options
has been discarded; theint x
within has been promoted. This union brought no actual type safety, and was annoying for callers to deal with otherwise. Sorry for the inconvenience. - Added
ncplane_set_resizecb()
andncplane_resizecb()
.
- The
-
2.0.3 (2020-11-09)
- Add
NCBLIT_3x2
aka the SEXBLITTER, making use of Unicode 13's sextant glyphs.notcurses_lex_blitter()
now recognizessexblitter
. - Blitting functions no longer count transparent cells towards the total returned number of cells written, but since these are not directly callable by the user, this ought not lead to any user-visible changes.
- Added (k)eller demo to
notcurses-demo
. ncreader
now supports Alt+'b' to move one word back, Alt+'f' to move one word forward, Ctrl+'A' to move to the beginning of the line, Ctrl+'E' to move to the end of the line, Ctrl+'U' to clear the line before the cursor, and Ctrl+'W' to clear the word before the cursor (whenNCREADER_OPTION_NOCMDKEYS
has not been specified).
- Add
-
2.0.2 (2020-10-25)
- Add
ncvisual_decode_loop()
, which returns to the first frame upon reaching the end of a file.
- Add
-
2.0.1 (2020-10-19)
- Add
ncmenu_item_set_status()
for disabling or enabling menu items.- Disabled menu items cannot be selected.
- Menu sections consisting only of disabled items are themselves disabled, and cannot be unrolled.
- Add
ncinput_equal_p()
for comparison ofncinput
structure data. ncmenu_offer_input()
now recognizes the shortcuts for registered sections, and will unroll the appropriate section when given input.- Added
notcurses_stddim_yx_const()
(notcurses_stddim_yx()
const
form).
- Add
-
2.0.0 (2020-10-12) "Stankonia"
- API STABILITY! The API expressed in 2.0.0 will be maintained throughout at least 2.x.x. A program compiled against 2.0.0 will continue to compile and function properly against all 2.x.x releases. Thanks for putting up with the freewheeling API breakage until now.
NOTCURSES_VERSION_{MAJOR, MINOR, PATCH, TWEAK}
are now available fromnotcurses/version.h
. These represent the version your program was compiled against. The version your program is linked to can still be acquired withnotcurses_version_components()
(or as a human-readable string vianotcurses_version()
).
-
1.7.6 (2020-10-09)
ncstats
added the new statswriteout_ns
,writeout_min_ns
, andwriteout_max_ns
. Therender_*ns
stats now only cover the rendering and rasterizing process. Thewriteout*ns
stats cover the time spent writing data out to the terminal.notcurses_render()
involves both of these processes.notcurses_render_to_buffer()
has been added, allowing user control of the process of writing frames out to the terminal.notcurses_stats_alloc()
has been added, to allocate anncstats
object.notcurses_reset_stats()
has been renamednotcurses_stats_reset()
.- Two flags have been defined for
ncdirect_init()
:NCDIRECT_OPTION_INHIBIT_SETLOCALE
andNCDIRECT_OPTION_INHIBIT_CBREAK
. The former is similar toNCOPTION_INHIBIT_SETLOCALE
. The latter keepsncdirect_init()
from touching the termios and entering cbreak mode. - The C++ wrapper
Ncplane::putwc()
has been renamedNcplane::putwch()
, so as not to clash with standard libraries implementingputwc()
as a macro.
-
1.7.5 (2020-09-29)
ncreel_destroy()
now returnsvoid
rather thanint
.nctablet_ncplane()
has been renamednctablet_plane()
.- The standard plane now has the name
std
. - Removed long-deprecated
ncplane_set_attrs()
andncplane_attrs()
. - Renamed
ncplane_styles_*()
toncplane_*_styles()
, to conform with every otherncplane_set_*()
function, but retained the old versions as (deprecated) aliases. - Renamed
cell_styles_*()
tocell_*_styles()
, to conform with every othercell_set_*()
function. Since these were inline functions, I've not bothered to retain the old versions.
-
1.7.4 (2020-09-20)
- All
_rgb_clipped()
functions have been renamed_rgb8_clipped()
, to match the changes made in 1.7.2. Sorry, I ought have done this before. ncplane_create()
has been introduced, taking astruct ncplane_options
parameter. This replacesncplane_aligned()
, and will replacencplane_new()
. The latter ought be considered deprecated, and will be removed in the future. To align a place as previously done withncplane_aligned()
, use theNCPLANE_OPTION_HORALIGNED
flag.- The
ncplane_options
struct includes a function pointer member,resizecb
. If notNULL
, this function will be called after the parent plane is resized. Seenotcurses_plane.3
for more information. ncplane_resize_realign()
has been added, suitable for use as aresizecb
. It realigns the plane against its parent.NCCHANNEL_ALPHA_MASK
has been renamedCHANNEL_ALPHA_MASK
, to match the other declarations.
- All
-
1.7.3 (2020-09-19)
- API changes pursuant to 2.0 API finalization:
mbswidth()
has been renamedncstrwidth()
.- The long-promised/dreaded Great Widget Review, normalizing behavior across
all widgets, has been effected. Sorry, there was no getting around this
one. Pretty much all widgets have slightly changed, because pretty much all
widgets previously behaved slightly differently:
ncselector_create()
andncmultiselector_create()
now take ownership of the providedncplane
. On an error in these functions, thencplane
will be destroyed. Otherwise, thencplane
is destroyed byncselector_destroy()
orncmultiselector_destroy()
.ncselector_create()
,ncmultiselector_create()
, andncreader_create()
no longer acceptint y, int x
placement parameters. Just place thencplane
.ncselector_options
,ncmultiselector_options
, andncreel_options
have lost theirbgchannels
members. Just set the base character for thencplane
.ncreader_options
has lost itsechannels
,eattrword
,egc
,physrows
, andphyscols
fields. Just set the base character and size for thencplane
.
- Functions which set a 24-bit RGB value have had the suffix
g
replaced withg_rgb
. Functions which set three 8-bit RGB components have had the suffixrgb
replaced withrgb8
. This was done because e.g.channels_set_fg()
andchannels_set_fchannel()
were indistinguishable on sight. Failure to make the necessary conversions will result in compiler errors. See https://github.com/dankamongmen/notcurses/issues/985. - Functions ending in
_stainable()
now end in_stained()
. ncplane_putwc_stained()
andncplane_putwstr_stained()
have been added in the interest of orthogonality.ncplane_new_named()
has been eliminated.ncplane_new()
now takes aconst char* name
argument.ncplane_bound()
andncplane_bound_named()
have both been eliminated.ncplane_new()
now accepts anncplane*
instead of anotcurses*
. All functionality exposed by the removed functions is thus now present inncplane_new()
.ncplane_aligned_named()
has been removed.ncplane_aligned()
now accepts aconst char* name
argument.
-
1.7.2 (2020-09-09)
- Exported
ncvisual_default_blitter()
, so that the effective value ofNCBLIT_DEFAULT
can be determined. - Added
NCREADER_OPTION_CURSOR
, instructing thencreader
to make the terminal cursor visible, and manage the cursor's placement.
- Exported
-
1.7.1 (2020-08-31)
- Renamed
CELL_SIMPLE_INITIALIZER
toCELL_CHAR_INITIALIZER
, andcell_load_simple()
tocell_load_char()
. - Renamed
ncplane_putsimple()
toncplane_putchar()
,ncplane_putsimple_stainable()
toncplane_putchar_stainable()
, andncplane_putsimple_yx()
toncplane_putchar_yx()
.
- Renamed
-
1.7.0 (2020-08-30)
- Added
notcurses_ucs32_to_utf8()
conversion helper. ncdirect_init()
now takes a thirduint64_t flags
parameter. No flags have been defined, and this parameter ought be set to 0.
- Added
-
1.6.20 (2020-08-30)
- Added convenience functions
ncplane_y()
andncplane_x()
, components of longstandingncplane_yx()
. ncreel
functions now generally callncreel_redraw()
themselves. This includesncreel_add()
,ncreel_del()
,ncreel_next()
, andncreel_prev()
.ncreel_redraw()
need only be called to update tablets.- In order to conform with CMake naming conventions, our CMake package is now accessed as "Notcurses" rather than "notcurses".
- Added convenience functions
-
1.6.19 (2020-08-27)
- Direct mode now places the terminal into "cbreak mode". This disables
echo and line-buffering of input. If this is undesirable, you can restore
the terminal state following
ncdirect_init()
, but this will break the semantics ofncdirect_getc()
and derivatives (due to line buffering). - The notcurses input layer has been reproduced for direct mode, including
ncdirect_getc()
,ncdirect_getc_nblock()
,ncdirect_getc_blocking()
, andncdirect_inputready_fd()
. Mouse support is not yet available in direct mode, but becomes possible through these additions. - Some very subtle bugs on big-endian machines have been repaired. Be aware that if your execution endianness does not match the endianness assumed at build time, you're gonna have a rough go of it.
- Direct mode now places the terminal into "cbreak mode". This disables
echo and line-buffering of input. If this is undesirable, you can restore
the terminal state following
-
1.6.18 (2020-08-25)
nc_err_e
has been taken behind the shed and shot in the face. All functions which once returnednc_err_e
now return a bimodalint
. Those functions which accepted a value-resultnc_err_e*
no longer take this argument.notcurses_cursor_enable()
now takes twoint
parameters specifying the desired location of the cursor. Bothnotcurses_cursor_enable()
andnotcurses_cursor_disable()
now returnint
rather thanvoid
.NCOPTION_RETAIN_CURSOR
has been removed.ncreader
now implementsNCREADER_OPTION_HORSCROLL
for horizontal scrolling. In addition, the following functions have been added:int ncreader_move_left(struct ncreader* n)
int ncreader_move_right(struct ncreader* n)
int ncreader_move_up(struct ncreader* n)
int ncreader_move_down(struct ncreader* n)
int ncreader_write_egc(struct ncreader* n, const char* egc)
.
- Added
ncplane_above()
andnotcurses_bottom()
. - Added
ncplane_set_fchannel()
andncplane_set_bchannel()
.
-
1.6.17 (2020-08-22)
ncdirect_flush()
now takes aconst struct ncdirect*
.- A
const char* title
field has been added toncplot_options
. If notNULL
, this title will be displayed to the right of any labels. Plot data will cover the title, if present. ncplot
no longer invertsmaxchannel
andminchannel
. Speaking of which, both of these fields are now plural,maxchannels
etc.
-
1.6.16 (2020-08-22)
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
.iprefix()
has been added, corresponding toIPREFIXSTRLEN
. This ought be used if you want binary prefixes without the 'i' suffix indicating binary prefixes, which I predict will endear you to exactly no one.- Added
channels_set_fg_palindex()
andchannels_set_bg_palindex()
. Rewrotecell_set_fg_palindex()
andcell_set_bg_palindex()
in terms of these two. This is possible because the palette index now overlaps the RGB in a channel (they were originally in the attrword). - Added
ncdirect_flush()
, mainly for the benefit of FFI that might not have a native interface tofflush(3)
. - The
ncplot_options
struct has a new field,legendstyle
. If the dependent variable is being labeled, this style will be applied to the legend. Without NCPLOT_OPTION_LABELTICKSD, this value is ignored.
-
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.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.4 (2020-07-19)
- Added
notcurses_str_blitter()
.
- Added
-
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.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.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()
.