Notcurses: blingful TUIs and character graphics

Overview

Notcurses: blingful TUIs and character graphics

What it is: a library facilitating complex TUIs on modern terminal emulators, supporting vivid colors, multimedia, threads, and Unicode to the maximum degree possible. Things can be done with Notcurses that simply can't be done with NCURSES. It is furthermore fast as shit. What it is not: a source-compatible X/Open Curses implementation, nor a replacement for NCURSES on existing systems.

setting the standard (hype video) birthed screaming into this world by nick black ([email protected])

for more information, see dankwiki and the man pages. in addition, there is Doxygen output. there is a mailing list which can be reached via [email protected]. i wrote a coherent guidebook, which is available for free download (or paperback purchase).

i've not yet added many documented examples, but src/poc/ and src/pocpp/ contain many small C and C++ programs respectively. notcurses-demo covers most of the functionality of Notcurses.

If you're running Notcurses applications in a Docker, please consult "Environment notes" below.

Packaging status

Linux FreeBSD Windows macOS Matrix Sponsor

Build Ubuntu macOS Windows

pypi_version crates.io

Introduction

Notcurses abandons the X/Open Curses API bundled as part of the Single UNIX Specification. For some necessary background, consult Thomas E. Dickey's superb and authoritative NCURSES FAQ. As such, Notcurses is not a drop-in Curses replacement.

Wherever possible, Notcurses makes use of the Terminfo library shipped with NCURSES, benefiting greatly from its portability and thoroughness.

Notcurses opens up advanced functionality for the interactive user on workstations, phones, laptops, and tablets, possibly at the expense of e.g. some industrial and retail terminals. Fundamentally, Curses assumes the minimum and allows you (with effort) to step up, whereas Notcurses assumes the maximum and steps down (by itself) when necessary. The latter approach probably breaks on some older hardware, but the former approach results in new software looking like old hardware.

Why use this non-standard library?

  • Thread safety, and efficient use in parallel programs, has been a design consideration from the beginning.

  • A more orderly surface than that codified by X/Open: Exported identifiers are prefixed to avoid common namespace collisions. Where reasonable, static inline header-only code is used. This facilitates compiler optimizations, and reduces loader time. Notcurses can be built without its multimedia functionality, requiring a significantly lesser set of dependencies.

  • All APIs natively support the Universal Character Set (Unicode). The nccell API is based around Unicode's Extended Grapheme Cluster concept.

  • Visual features including images, fonts, video, high-contrast text, sprites, and transparent regions. All APIs natively support 24-bit color, quantized down as necessary for the terminal.

  • It's Apache2-licensed in its entirety, as opposed to the drama in several acts that is the NCURSES license (the latter is summarized as "a restatement of MIT-X11").

Much of the above can be had with NCURSES, but they're not what NCURSES was designed for. On the other hand, if you're targeting industrial or critical applications, or wish to benefit from time-tested reliability and portability, you should by all means use that fine library.

Requirements

Minimum versions generally indicate the oldest version I've tested with; it may well be possible to use still older versions. Let me know of any successes!

  • (build) CMake 3.14.0+ and a C11 compiler
  • (OPTIONAL) (OpenImageIO, testing, C++ bindings): A C++17 compiler
  • (build+runtime) From NCURSES: terminfo 6.1+
  • (build+runtime) GNU libunistring 0.9.10+
  • (OPTIONAL) (build+runtime) GNU Readline 8.0+
  • (OPTIONAL) (build+runtime) From QR-Code-generator: libqrcodegen 1.5.0+
  • (OPTIONAL) (build+runtime) From FFmpeg: libswscale 5.0+, libavformat 57.0+, libavutil 56.0+
  • (OPTIONAL) (build+runtime) OpenImageIO 2.15.0+, requires C++
  • (OPTIONAL) (testing) Doctest 2.3.5+
  • (OPTIONAL) (documentation) pandoc 1.19.2+
  • (OPTIONAL) (python bindings): Python 3.7+, CFFI 1.13.2+, pypandoc 1.5+
  • (OPTIONAL) (rust bindings): rust 1.47.0+, bindgen 0.55.1+, pkg-config 0.3.18+, cty 0.2.1+
  • (runtime) Linux 5.3+, FreeBSD 11+, DragonFly BSD 5.9+, Windows Vista+, or macOS 11.4+

Here's more information on building and installation.

Included tools

Eight binaries are installed as part of Notcurses:

  • ncls: an ls that displays multimedia in the terminal
  • ncneofetch: a neofetch ripoff
  • ncplayer: renders visual media (images/videos)
  • nctetris: a tetris clone
  • notcurses-demo: some demonstration code
  • notcurses-info: detect and print terminal capabilities/diagnostics
  • notcurses-input: decode and print keypresses
  • notcurses-tester: unit testing

To run notcurses-demo from a checkout, provide the data directory via the -p argument. Demos requiring data files will otherwise abort. The base delay used in notcurses-demo can be changed with -d, accepting a floating-point multiplier. Values less than 1 will speed up the demo, while values greater than 1 will slow it down.

notcurses-tester likewise requires that data, populated with the necessary data files, be specified with -p. It can be run by itself, or via make test.

Documentation

With -DUSE_PANDOC=on (the default), a full set of man pages and XHTML will be built from doc/man. The following Markdown documentation is included directly:

If you (understandably) want to avoid the large Pandoc stack, but still enjoy manual page goodness, I publish a tarball with generated man/XHTML along with each release. Download it, and install the contents as you deem fit.

Environment notes

  • If your TERM variable is wrong, or that terminfo definition is out-of-date, you're going to have a very bad time. Use only TERM values appropriate for your terminal. If this variable is undefined, or Notcurses can't load the specified Terminfo entry, it will refuse to start, and you will not be going to space today.

  • Notcurses queries the terminal on startup, enabling some advanced features based on the determined terminal (and even version). Basic capabilities, however, are taken from Terminfo. So if you have, say, Kitty, but TERM=vt100, you're going to be able to draw RGBA bitmap graphics, but be able to use the alternate screen (despite the latter being supported by every Kitty version). So TERM and an up-to-date Terminfo database remain important.

  • Ensure your LANG environment variable is set to a UTF8-encoded locale, and that this locale has been generated. This usually means "[language]_[Countrycode].UTF-8", i.e. en_US.UTF-8. The first part (en_US) ought exist as a directory or symlink in /usr/share/locales. This usually requires editing /etc/locale.gen and running locale-gen. On Debian systems, this can be accomplished with dpkg-reconfigure locales, and enabling the desired locale. The default locale is stored somewhere like /etc/default/locale.

  • If your terminal has an option about default interpretation of "ambiguous-width characters" (this is actually a technical term from Unicode), ensure it is set to Wide, not narrow (if that doesn't work, ensure it is set to Narrow, heh).

  • If your terminal supports 3x8bit RGB color via setaf and setbf (most modern terminals), but exports neither the RGB nor Tc terminfo capability, you can export the COLORTERM environment variable as truecolor or 24bit. Note that some terminals accept a 24-bit specification, but map it down to fewer colors. RGB is unconditionally enabled whenever most modern terminals are identified.

Fonts

Glyph width, and indeed whether a glyph can be displayed at all, is dependent in part on the font configuration. Ideally, your font configuration has a glyph for every Unicode EGC, and each glyph's width matches up with the C library's wcswidth() result for the EGC. If this is not the case, you'll likely get blanks or � (U+FFFD, REPLACEMENT CHARACTER) for missing characters, and subsequent characters on the line may be misplaced.

It is worth knowing that several terminals draw the block characters directly, rather than loading them from a font. This is generally desirable. Quadrants and sextants are not the place to demonstrate your design virtuosity. To inspect your environment's rendering of drawing characters, run notcurses-info. The desired output ought look something like this:

notcurses-info can be used to check Unicode drawing

FAQs

If things break or seem otherwise lackluster, please consult the Environment Notes section! You need to have a correct TERM and LANG definition, and probably want COLORTERM.

The demo fails in the middle of intro. Check that your TERM value is correct for your terminal. intro does a palette fade, which is prone to breaking under incorrect TERM values. If you're not using xterm, your TERM should not be xterm!
Can I have Notcurses without this huge multimedia stack? Yes! Build with -DUSE_MULTIMEDIA=none.
Can I build this individual Notcurses program without aforementioned multimedia stack? Again yes! Use notcurses_core_init() or ncdirect_core_init() in place of notcurses_init()/ ncdirect_init(), and link with -lnotcurses-core. Your application will likely start a few milliseconds faster; more importantly, it will link against minimal Notcurses installations.
Notcurses looks like absolute crap in screen. screen doesn't support RGB colors (at least as of 4.08.00); if you have COLORTERM defined, you'll have a bad time. If you have a screen that was compiled with --enable-colors256, try exporting TERM=screen-256color as opposed to TERM=screen.
Notcurses looks like absolute crap in mosh. Yeah it sure does. I'm not yet sure what's up.
Why didn't you just render everything to Sixel? That's not a TUI; it's a slow and inflexible GUI. Many terminal emulators don't support Sixel. Sixel doesn't work well with mouse selection. Sixel has a limited color palette. With that said, both Sixel and the Kitty bitmap protocol are well-supported.
I'm not seeing NCKEY_RESIZE until I press some other key. You've almost certainly failed to mask SIGWINCH in some thread, and that thread is receiving the signal instead of the thread which called notcurses_getc_blocking(). As a result, the poll() is not interrupted. Call pthread_sigmask() before spawning any threads.
Using the C++ wrapper, how can I ensure that the NotCurses destructor is run when I return from main()? As noted in the C++ FAQ, wrap it in an artificial scope (this assumes your NotCurses is scoped to main()).
How do I hide a plane I want to make visible later? In order of least to most performant: move it offscreen using ncplane_move_yx(), move it underneath an opaque plane with ncplane_move_below(), or move it off-pile with ncplane_reparent().
Why isn't there an ncplane_box_yx()? Do you hate orthogonality, you dullard? ncplane_box() and friends already have far too many arguments, you monster.
Why doesn't Notcurses support 10- or 16-bit color? Notcurses supports 24 bits of color, spread across three eight-bit channels. You presumably mean 10-bit-per-channel color. I needed those six bits for other things. When terminals support it, Notcurses might support it.
The name is dumb. That's not a question?
I'm not finding qrcodegen on BSD, despite having installed graphics/qr-code-generator. Try cmake -DCMAKE_REQUIRED_INCLUDES=/usr/local/include. This is passed by bsd.port.mk.
Do you support musl? I try to! You'll need at least 1.20.
I only seem to blit in ASCII, and/or can't emit Unicode beyond ASCII in general. Your LANG environment variable is underdefined or incorrectly defined, or the necessary locale is not present on your machine (it is also possible that you explicitly supplied NCOPTION_INHIBIT_SETLOCALE, but never called setlocale(3), in which case don't do that).
I pretty much always need an ncplane when using a nccell. Why doesn't the latter hold a pointer to the former? Besides the massive redundancy this would entail, nccell needs to remain as small as possible, and you almost always have the ncplane handy if you've got a reference to a valid nccell anyway.
I ran notcurses-demo, but my table numbers don't match the Notcurses banner numbers, you charlatan. notcurses-demo renders several frames beyond the actual demos.
When my program exits, I don't have a cursor, or text is invisible, or colors are weird, ad nauseam. Ensure you're calling notcurses_stop()/ncdirect_stop() on all exit paths, including fatal signals (note that, by default, Notcurses installs handlers for most fatal signals to do exactly this).
How can I use Direct Mode in conjunction with libreadline? Pass NCDIRECT_OPTION_CBREAK to ncdirect_init(), and ensure you do not pass NCDIRECT_OPTION_NO_READLINE. If you'd like, set rl_readline_name and rl_attempted_completion_function prior to calling ncdirect_init(). With that said, consider using a Notcurses ncreader.
Will there ever be Java wrappers? I should hope not. If you want a Java solution, try Autumn Lamonte's Jexer.
Given that the glyph channel is initialized as transparent for a plane, shouldn't the foreground and background be initialized as transparent, also? Probably (they are instead by default initialized to opaque). This would change some of the most longstanding behavior of Notcurses, though, so it isn't happening.
Why does my right-to-left text appear left-to-right? Notcurses doesn't honor the BiDi state machine, and in fact forces left-to-right with BiDi codes. Likewise, ultra-wide glyphs will have interesting effects. ﷽!
I get linker errors when statically linking. Are you linking all necessary libraries? Use pkg-config --static --libs notcurses (or --libs notcurses-core) to discover them.
Can I avoid manually exporting COLORTERM=24bit everywhere? Sure. Add SendEnv COLORTERM to .ssh/config, and AcceptEnv COLORTERM to sshd_config on the remote server. Yes, this will probably require root on the remote server. Don't blame me, man; I didn't do it.
How about *arbitrary image manipulation here* functionality? I'm not going to beat ImageMagick et al. on image manipulation, but you can load an ncvisual from RGBA memory using ncvisual_from_rgba().
My program locks up during initialization. Notcurses interrogates the terminal. If the terminal doesn't reply to standard interrogations, file a Notcurses bug, send upstream a patch, or use a different terminal. No known terminal emulators exhibit this behavior.
Why no NCSTYLE_REVERSE? It would consume a precious bit. You can use ncchannels_reverse() to correctly invert fore- and background colors.
How do I mix Rendered and Direct mode? You really don't want to. You can stream a subprocess to a plane with the ncsubproc widget.
How can I clear the screen on startup in Rendered mode when not using the alternate screen? Call notcurses_refresh() after notcurses_init() returns successfully.
Why do the stats show more Linux framebuffer bitmap bytes written than total bytes written to the terminal? Linux framebuffer graphics aren't implemented via terminal writes, but instead writes directly into a memory map.

Useful links

“Our fine arts were developed, their types and uses were established, in times very different from the present, by men whose power of action upon things was insignificant in comparison with ours. But the amazing growth of our techniques, the adaptability and precision they have attained, the ideas and habits they are creating, make it a certainty that profound changes are impending in the ancient craft of the Beautiful.” —Paul Valéry

Issues
  • chafa sixel-encodes AllRGB images substantially faster than notcurses

    chafa sixel-encodes AllRGB images substantially faster than notcurses

    In the course of stunting on https://github.com/hpjansson/chafa/issues/27, I discovered that chafa 1.8.0 renders AllRGB/balloon.jpg in about half the time of ncplayer on my 3970X. Representative timings:

    [schwarzgerat](0) $ time chafa /media/chungus/images/allrgb/balloon.png  -f sixel > /dev/null
    
    real    0m0.420s
    user    0m0.744s
    sys     0m0.057s
    [schwarzgerat](0) $ 
    

    vs

    [schwarzgerat](0) $ time ~/src/dankamongmen/notcurses/build-3.0.5/ncplayer /media/chungus/images/allrgb/balloon.png  -sscale -k > /dev/null
    
    real    0m0.774s
    user    0m0.720s
    sys     0m0.053s
    [schwarzgerat](0) $ 
    

    in addition, the chafa output is slightly better -- look at the purple sections, and their borders with the blue sections to their right. we have some weird green pixels in there, unlike chafa.

    ncplayer:

    2022-01-23-150607_883x891_scrot

    chafa:

    2022-01-23-150616_880x922_scrot

    note that this is on amd64, where chafa AFAIK uses hand-coded SIMD. i'm not sure if that's true on other architectures, but who cares; i tolerate defeat on no platform. well, i suppose there's only one thing to do now.

    oh lawd you didnt bring a victim child

    THERE CAN BE ONLY ONE

    bug perf 
    opened by dankamongmen 85
  • mpv -vo sixel is far superior to ncplayer -bpixel

    mpv -vo sixel is far superior to ncplayer -bpixel

    @dnkl pointed this out in #1380, but it's worth its own issue. Get two xterms up, along with a recent mpv build featuring libsixel support. Run it alongside ncplayer -bpixel. mpv's superiority is obvious (we beat it with cell output, though). Get to this level of output, in both speed and quality.

    bug perf bitmaps 
    opened by dankamongmen 63
  • split out libnotcurses-minimal without ffmpeg linkage

    split out libnotcurses-minimal without ffmpeg linkage

    @edmonds thinks it would be a good idea to split out a libnotcurses1 package sans ffmpeg linkage. I'm inclined to agree, though I think we differ a little on exactly how we'd like to see it done. This is not a blocker for uploading and sponsorship.

    documentation enhancement packaging 
    opened by dankamongmen 57
  • color divergence in sixel with fewer colors than color registers

    color divergence in sixel with fewer colors than color registers

    with quantanal improved in #2502, we're now seeing divergence on a more complex, but still simple, image:

    [schwarzgerat](0) $ ./quantanal ../data/chunli23.png
    analyzing ../data/chunli23.png...
     source pixels: 99x46
     rendered: 99x46 18216B
     control sequence: 3134 bytes (17.2%)
     00004554 pixels analyzed Δr 318498 Δg 3546 Δb 3600
     Colors: 17 vs 27
     4554px Δr 318498 (69.9) Δg 3546 (0.779) Δb 3600 (0.791)
     avg diff per pixel: 71.5
    done with ../data/chunli23.png.
    [schwarzgerat](0) $
    

    we're for some reason using 10 more colors, and missing by a wide 71.5 per. adding NOINTERPOLATION makes things worse:

    [schwarzgerat](0) $ ./quantanal ../data/chunli23.png
    analyzing ../data/chunli23.png...
     source pixels: 99x46
     rendered: 99x46 18216B
     control sequence: 3134 bytes (17.2%)
     00004554 pixels analyzed Δr 315107 Δg 5968 Δb 3489
     Colors: 17 vs 97
     4554px Δr 315107 (69.2) Δg 5968 (1.31) Δb 3489 (0.766)
     avg diff per pixel: 71.3
    done with ../data/chunli23.png.
    [schwarzgerat](0) $
    

    meanwhile, on another, we drastically reduce the number of colors:

    [schwarzgerat](0) $ ./quantanal ../data/worldmap.png
    analyzing ../data/worldmap.png...
     source pixels: 475x860
     rendered: 475x860 1634000B
     control sequence: 130695 bytes (7.998%)
     00408500 pixels analyzed Δr 828526 Δg 899641 Δb 877151
     Colors: 233 vs 43
     408500px Δr 828526 (2.03) Δg 899641 (2.2) Δb 877151 (2.15)
     avg diff per pixel: 6.38
    done with ../data/worldmap.png.
    [schwarzgerat](0) $
    
    bug bitmaps 
    opened by dankamongmen 55
  • become a thing on windows

    become a thing on windows

    In a Kantian sense, it would seem a good thing if notcurses worked on windows, for whatever definition of works that means. I very much doubt that I will ever undertake this work, but if some brave soul wishes to take a stab at it, or report problems, or whatever, here's a bug in which you might do that.

    question/research hax0rs-wanted 
    opened by dankamongmen 54
  • CLI mode always involves at least two rows

    CLI mode always involves at least two rows

    Run e.g. grid or any other CLI-style program that has no text output. There will be a blank line before the new prompt. Running e.g. true or other such tools results in no such blank line, and we oughtn't either.

    bug 
    opened by dankamongmen 51
  • Why ncplane_putegc() needs termination character?

    Why ncplane_putegc() needs termination character?

    opened by tomek-szczesny 51
  • `NCOPTION_SUPPRESS_BANNERS` breaks default colors in a non standard plane

    `NCOPTION_SUPPRESS_BANNERS` breaks default colors in a non standard plane

    I have a status line in my application that can be used to display an overview of all keyboard shortcuts. The status line has a default background color and is in a separate plane. Initially, the status line is drawn correctly with the right background and foreground color. When the user presses '?', the status line will print some application shortcut descriptions.

    I notice that when I suppress notcurses banners using NCOPTION_SUPPRESS_BANNER, when the help is displayed in the status line, the text is not printed with the background color for the status line plane:

    Initial view (the gray line is the status bar of the application, the rest is tmux):

    initial

    After pressing '?' without NCOPTION_SUPPRESS_BANNER:

    good

    After pressing '?' with NCOPTION_SUPPRESS_BANNER:

    bad

    The following program reproduces the problem:

    #include <locale.h>
    #include <notcurses/notcurses.h>
    #include <stdlib.h>
    
    static struct ncplane *make_status_line_plane(struct ncplane *std_plane) {
      struct ncplane_options opts = {0};
      opts.rows = 1;
      opts.cols = ncplane_dim_x(std_plane);
      opts.y = ncplane_dim_y(std_plane) - 1;
      opts.x = 0;
    
      nccell c = CELL_CHAR_INITIALIZER(' ');
      cell_set_bg_rgb8(&c, 0x20, 0x20, 0x20);
    
      struct ncplane *status_line_plane = ncplane_create(std_plane, &opts);
      ncplane_set_base_cell(status_line_plane, &c);
      return status_line_plane;
    }
    
    static void print_status_line(struct ncplane *plane) {
      ncplane_putstr_aligned(plane, 0, NCALIGN_LEFT, " ?: help");
    }
    
    static void print_help(struct ncplane *plane) {
      const int width = ncplane_dim_x(plane);
      ncplane_erase(plane);
      ncplane_putstr_aligned(
          plane, 0, NCALIGN_LEFT,
          " j/k: scroll up/down   C-B/C-F: page up/down   q: quit");
      ncplane_putstr_aligned(plane, 0, NCALIGN_RIGHT,
                             "press any key to close help ");
    }
    
    int main(int argc, char **argv) {
      setlocale(LC_ALL, "");
    
      notcurses_options opts = {0};
      opts.flags = NCOPTION_SUPPRESS_BANNERS;
    
      struct notcurses *nc;
      if ((nc = notcurses_core_init(&opts, NULL)) == NULL) {
        return EXIT_FAILURE;
      }
    
      struct ncplane *std_plane = notcurses_stdplane(nc);
      struct ncplane *status_line_plane = make_status_line_plane(std_plane);
    
      ncplane_move_top(status_line_plane);
    
      struct ncinput input = {0};
      bool quit = false;
      while (!quit) {
        print_status_line(status_line_plane);
        notcurses_render(nc);
        notcurses_getc_blocking(nc, &input);
        switch (input.id) {
        case '?':
          print_help(status_line_plane);
          notcurses_render(nc);
          notcurses_getc_blocking(nc, &input);
          ncplane_erase(status_line_plane);
          break;
        case 'q':
          quit = true;
          break;
        }
      }
    
      notcurses_stop(nc);
    }
    

    Is this an issue in the program above, or maybe a bug in notcurses itself?

    I am using notcurses 2.1.7. My terminal is st 0.8.4. Ouput from export | egrep 'LANG|LC_CTYPE|TERM':

    LANG=en_US.UTF-8
    TERM=tmux-256color
    TERMINAL=st
    TERMINFO=/home/ton/.local/share/terminfo
    
    bug 
    opened by ton 51
  • unite our two control sequence automata

    unite our two control sequence automata

    We have two automata we traverse to handle control escapes -- the one handled by pump_control_read(), and the special key trie. as a result, we have two distinct control loops, and two distinct states. this last is horrible, as there's no well-defined map of state changes effected by one on the other.

    unite these two automata. given that special keys require a dynamic state machine (it's prepared based on terminfo data), a wholly explicit controlflow-based automaton (like that used in pump_control_read()) won't work. we need a dataflow-based one, as used by our trie traversal.

    so we'll need add some special node types to our trie, basically the same we have from the other automaton:

    • accumulate a number
    • accumulate a string
    • accumulate a hex-encoded string, which is just a special case of either of the previous 2 ...and that's it, i think? pretty easy. let's do it up right
    documentation enhancement input 
    opened by dankamongmen 48
  • handle terminal interrogation failure better

    handle terminal interrogation failure better

    Currently, if we interrogate a terminal, and don't get a response, the program will simply hang. Hence the requirement that the user explicitly call some function (e.g. notcurses_check_pixel_support()) before we begin interrogation.

    I hate this so fucking much. I have no idea whether user input can break up the terminal response, but it wouldn't surprise me at all (and if it doesn't break the response, we'll at best lose said input). Hate hate hate hate hate.

    I've been unwilling to put in a timeout, because on a loaded system, a slow reply is totally normal, and what timeout would we use, and even worse would be pushing that timeout question to the user, because they know nothing. I stand by this decision, because I am a dinosaur and a curmudgeon and everyone's too busy these days. Let the computer cogitate, if that's what it needs to do.

    I do think, however, that we need at least print a diagnostic after a certain time goes by without a response, so the user isn't just left with no idea what's up. I think this can be dumped to stderr; it'll be jarring and disrupt any drawn screen, but hey, you've been sitting around for five (or whatver) stimulus-free seconds already, and in all likelihood you'll be sitting there until time ends or the power fails.

    So yeah, make a concession to reality, and after say 5 seconds without a response from the terminal, print a diagnostic to stderr about "N seconds without a response from the terminal....". Maybe include the TERM value in this output for the inevitable bug reports.

    Better yet would be a method to break user input up from terminal responses, but I doubt that this is possible =[. Maybe we ought take unrecognized input and queue it up as user input, but then we're just forwards-incompatible with new, wacky returns from tomorrow's terminals.

    Fuck the world, save yourself.

    enhancement 
    opened by dankamongmen 47
  • DECSDM is a poorly-understood hellscape

    DECSDM is a poorly-understood hellscape

    I haven't tested with a specific version of notcurses, but I've seen in the code that you set private mode 80 when you initialize sixel: https://github.com/dankamongmen/notcurses/blob/3dbb3c149d2dafa57f51bcaa96a54176a4cd66d1/src/lib/sixel.c#L871

    There is some confusion as to whether DECSDM is intended to enable sixel scrolling or disable it, and around half the terminals I've tested have implemented it one way, and half the other. On terminals that interpret mode 80 as a request to to disable sixel scrolling, your sixel images are going to be rendered in the wrong place.

    For the record, I think you are using it is the wrong way, but considering how terminals are currently split on this issue, there really isn't a right way. The best course of action is to leave that mode alone. Every terminal I've tested does at least have sixel scrolling enabled by default, so unless you actually need to disable scrolling, there should be no reason to change the mode.

    bug 
    opened by j4james 44
  • regarding ncstats initialization and deallocation

    regarding ncstats initialization and deallocation

    Working on the ncstats bindings I found something interesting:

    1. Without banners, If I don't call notcurses_stats after allocating a new ncstats object, the preallocated number of renders is absurdly high.
    2. With banners, If I don't call notcurses_stats after allocating a new ncstats object, the preallocated number of renders is 0. I guess that's expected.

    I also want to confirm whether I should use free to deallocate the ncstats objects before the end of the program. In that case maybe they ought to have have a destroy function?

    I made a small C program:

    #include <notcurses/notcurses.h>
    int main(void){
    	// ISSUE-1: uncomment this:
    	struct notcurses_options nopts = { .flags = NCOPTION_SUPPRESS_BANNERS | NCOPTION_CLI_MODE };
    
    	// ISSUE-2: uncomment this:
    	// struct notcurses_options nopts = { .flags = NCOPTION_CLI_MODE };
    
    	struct notcurses* nc = notcurses_core_init(&nopts, NULL);
    	if(nc == NULL){ return EXIT_FAILURE; }
    
    	// 1st render, before allocation
    	notcurses_render(nc);
    	struct ncstats* stats = notcurses_stats_alloc(nc);
    
    	// ISSUE-1 & ISSUE-2: leave commented out this:
    	notcurses_stats(nc, stats);
    
    	fprintf(stderr, "\nrenders:%lld\n", stats->renders);
    
    	// 2nd render
    	notcurses_render(nc);
    	notcurses_stats(nc, stats);
    	fprintf(stderr, "renders:%lld\n", stats->renders);
    
    	// resetting
    	notcurses_stats_reset(nc, stats);
    	notcurses_stats(nc, stats);
    	fprintf(stderr, "renders:%lld\n\n", stats->renders);
    
    	if (notcurses_stop(nc)) { return EXIT_FAILURE; }
    	return EXIT_SUCCESS;
    }
    
    

    results

    
    # A
    renders:140075559345600
    renders:2
    renders:0
    
    # B
    renders:0
    renders:2
    renders:0
    
    # calling notcurses_stats after allocation 
    renders:1
    renders:2
    renders:0
    
    userquestion 
    opened by joseluis 0
  • pkg-config files are broken when CMAKE_INSTALL_{INCLUDE,LIB}DIR is absolute

    pkg-config files are broken when CMAKE_INSTALL_{INCLUDE,LIB}DIR is absolute

    As per title: tools/notcurses-core.pc.in, tools/notcurses-ffi.pc.in, tools/notcurses++.pc.in, and tools/notcurses.pc.in have

    [email protected][email protected]
    [email protected][email protected]
    libdir=${prefix}/@[email protected]
    includedir=${prefix}/@[email protected]
    

    and so can’t handle absolute paths in CMAKE_INSTALL_{INCLUDE,LIB}DIR. This leads to broken .pc files on NixOS in particular. (Deriving libdir from prefix and not exec_prefix also seems a bit suspect, but is not the problem here.)

    See “Concatenating paths when building pkg-config files” for a thorough discussion of the problem and a suggested fix, or KDE’s extra-cmake-modules for a simpler approach.

    bug 
    opened by alexshpilkin 0
  • ncpp::Progbar breaks Plane it takes ownership of

    ncpp::Progbar breaks Plane it takes ownership of

    Maybe I'm missing something but:

    In the cpp Progbar implementation: https://github.com/dankamongmen/notcurses/blob/2316c7e646dfd8c6fc7af8cd25b96ab6bda15e8b/include/ncpp/Progbar.hh#L22

    progbar takes ownership of the ncpp::Plane 's C pointer but does not reset it inside the ncpp::Plane instance that is passed to Progbar. This always results in either a double free when the cpp Plane instance is released or a memory leak if the cpp Plane is never released to work around the double free issue.

    opened by bzeller 0
  • whether a plane is a root plane

    whether a plane is a root plane

    There doesn't seem to be a simple straightfoward way to check whether a plane is a root plane. Could we have method which simplly returns true in that case?

    documentation enhancement 
    opened by joseluis 0
  • Will this work on a headless FreeBSD 13.1 environment?

    Will this work on a headless FreeBSD 13.1 environment?

    I have a desktop PC with a graphics card which is capable of displaying quad 4K monitors.

    The thing is that I use this desktop PC as a headless environment using FreeBSD 13.1

    Can notcurses be used for my situation?

    Thanks.

    userquestion 
    opened by rajhlinux 0
Releases(v3.0.8)
  • v3.0.8(Apr 6, 2022)

    we haven't had as much notcurses lately as we were! well, after two and odd years going balls-to-the-wall on it, it had reached a point where i could finally cool off a bit, and i did! still absolutely resolving bugs and adding new features, just took some time to do other things. like build a new workstation and write a lengthy essay and regain favor at my day job, where terminal graphics absolutely do not pay the bills. but i still love ye, and we're still here.

    this fixes use of bare Escape as input in terminals other than kitty, and recognizes curly underlines in Contour. some other bugs came in over this period, but most of them were resolved via external fixes, hurrah.

    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-3.0.8.tar.gz(146.48 KB)
    notcurses_3.0.8+dfsg.1.orig.tar.xz(7.05 MB)
    notcurses_3.0.8+dfsg.1.orig.tar.xz.asc(833 bytes)
    v3.0.8.tar.gz.asc(833 bytes)
  • v3.0.7(Feb 20, 2022)

    I made the horrible decision to upgrade and generally trick out my home workstation, and a seeming eternity later, I finally have it more or less back up, except it now prints something about "spurious native exception"s every ~3s, Never get into watercooling, kids.

    • You can now output tabs (\t in Cese, ASCII/UCS 9 "Horizontal Tab")! Tabstops are relative to the output plane, and fixed at 8 cells (#1233)
    • Fixed bad bug in Sixel threading engine (#2627)
    • Oh! In a major change to fundamental operations, if the standard plane is scrolling, and you cause it to scroll, notcurses_render() will now be called in the context of that output. This was done to work around a major annoyance and limitation of CLI mode, that you can't just dump output like one does in a ... CLI, and instead had to call notcurses_render() explicitly a bunch if you wanted to actually generate all the output you wrote, and have it in the scrollback buffer etc. This was universally despised. So in a Alexanderish strike at this Gordian shit sandwich, we now call notcurses_render(). This means you can just dump output to a scrolling standard plane, and not worry about anything except a final notcurses_render(). Your output will be displayed as you write it, and all of it will be displayed.

    This mechanism is subject to change, but it's probably how things are working going forward.

    "but dank" i hear you asking, "wouldn't this rule apply to all planes? why the special case?" the answer is no, and the reasoning is that you've chosen to engage a scrolling standard plane, which comes with a host of different behaviors. ineluctable modalities of the hackable, as stephen daedalus might say.

    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-3.0.7.tar.gz(145.73 KB)
    notcurses_3.0.7+dfsg.1.orig.tar.xz(7.05 MB)
    notcurses_3.0.7+dfsg.1.orig.tar.xz.asc(833 bytes)
    v3.0.7.tar.gz.asc(833 bytes)
  • v3.0.6(Feb 10, 2022)

    • Fix empty output when ncplane_puttext() is used with NCALIGN_UNALIGNED (#2611 ) , thanks @alexhsamuel for the report!
    • Fixed numerous issues regarding mouse interactions with ncmenu (#2592), thanks @kascote for the report!
    • Fixed bug where ncmenu entered an infinite loop when opening a menu with no enabled items (#2606)
    • Fixed assert() when replies came broken across multiple reads (#2590 ); this was especially nasty when running over ssh. You wouldn't see this bug unless your Notcurses was built with CMAKE_BUILD_TYPE=Debug or NDEBUG was explicitly undefined, thanks @christianparpart for the report!
    • Don't emit DECSDM unless we know for sure what terminal we're talking to (#2587), thanks @autumnmeowmeow / @j4james / @dnkl for the report and discussion!
    • Massive overhaul of the Sixel encoder, ending this area of work for the time being. We now consume ~90% less memory per Sixel-targeted ncvisual, and encode in about 20%--50% of the 3.0.5 times. A tremendous improvement. How delightfully baller. We're still not where I'd like to be, but we're so much better than we have ever been. This work was tough, and dominated the 3.0.6 cycle (#2573 , #2603). #2573 is an epic story indeed, well worth reading IMHO.

    Welcome @alexhsamuel , who appears to be taking over the Python wrappers, aka the bane of my existence.

    i'll be having some intestines removed next week, having deemed them unfit for my august personage, but i doubt it'll slow me down for more than a few hours. hack on!

    I checked the guidebook and it said: Excellent food, malevolent ambience. I'd been habitually abusing an illegal growth hormone extracted from the pituitary glands of human corpses and I felt as if I were drowning in excremental filthiness but the prospect of having something good to eat cheered me up. I asked the waitress about the soup du jour and she said that it was primordial soup—which is ammonia and methane mixed with ocean water in the presence of lightning. Oh I'll take a tureen of that embryonic broth, I say, constraint giving way to exuberance—but as soon as she vanishes my spirit immediately sags because the ambience is so malevolent. The bouncers are hassling some youngsters who want drinks—instead of simply carding the kids, they give them radiocarbon tests, using traces of carbon 14 to determine how old they are—and also there's a young wise guy from Texas A&M at a table near mine who asks for freshly ground Rolaids on his fettuccine and two waiters viciously work him over with heavy bludgeon-sized pepper mills, so I get right back into my car and narcissistically comb my thick jet-black hair in the rearview mirror and I check the guidebook. There's an inn nearby—it's called Little Bo Peep's— its habitues are shepherds. And after a long day of herding, shearing, panpipe playing, muse invoking, and conversing in eclogues, it's Miller time, and Bo Peep's is packed with rustic swains who've left their flocks and sunlit, idealized arcadia behind for the more pungent charms of hard-core social intercourse. Everyone's favorite waitress is Kikugoro. She wears a pale-blue silk kimono and a brocade obi of gold and silver chrysanthemums with a small fan tucked into its folds, her face is painted and powdered to a porcelain white. A cowboy from south of the border orders a "Biggu Makku." But Kikugoro says, "This is not Makudonarudo." She takes a long cylinder of gallium arsenide crystal and slices him a thin wafer which she serves with soy sauce, wasabi, pickled ginger, and daikon. "Conducts electrons ten times faster than silicon... taste good, gaucho-san, you eat," she says, bowing.

    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-3.0.6.tar.gz(145.55 KB)
    notcurses_3.0.6+dfsg.1.orig.tar.xz(7.05 MB)
    notcurses_3.0.6+dfsg.1.orig.tar.xz.asc(833 bytes)
    v3.0.6.tar.gz.asc(833 bytes)
  • v3.0.5(Jan 21, 2022)

    For all my test images, Notcurses now encodes sixels as quickly or more quickly than libsixel, while producing output at least as good as libsixel (when the latter is run without dithering). This completes the drive to improve Sixel quantization described in the 3.0.0 release notes. Yay!

    • Fix invalid access resulting from Sixel moves when margins were in use #2546
    • notcurses-info colors its gradient based on colors 4--7 of the palette, allowing it to be "themed" #2568
    • add ncpalette_get() #2565
    • fix up cursor report location misaccounting when not attached to a terminal #2558
      • this finally fixed the growlight autopkgtests on debian
    • treat permanent failure reading as EOF rather than looping on failing read #2558
    • properly propagate error code from get_cursor_location()
    • unlock on error path in get_cursor_location()
    • always treat ctrl+d as EOF in ncdirect_readline()
    • avoid input drops under pressure by properly accounting for output space availability #2548
    • when CapsLock is set in the kitty protocol, capitalize any lowercase ascii to match other situations
    • when Ctrl is set in the kitty or XTMODKEYS protocols, capitalize any lowercase ascii to match other situations #2555
    • consider kitty events without an event type to be PRESS #2554
    • add support for super, hyper, numlock, and capslock modifiers from kitty protocol #2553
    • notcurses-demo: stop trying to read after EOF to avoid hot loop #2547
    • reject invalid XTGETTCAP bytes (see contour 582)
    • skip merge if it's not necessary in sixel quantization #2516
    • handle negative XTGETTCAP #2544
    • fold down XTGETTCAP responses #2541
    • improve accuracy in sixel color quantizing by using 100 scale, then folding 100 to 99
    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-3.0.5.tar.gz(144.89 KB)
    notcurses_3.0.5+dfsg.1.orig.tar.xz(7.05 MB)
    notcurses_3.0.5+dfsg.1.orig.tar.xz.asc(833 bytes)
    v3.0.5.tar.gz.asc(833 bytes)
  • v3.0.4(Jan 8, 2022)

    [a weary dank emerges from the codemines] This one had some rough bugs deep in the input layer to resolve. Hopefully they're all actually fixed. I think they are.

    • Yelled at our friends at the Alpine project and Notcurses there is now compiled the way mamma used to, for significant perf gainz. Thanks!
    • With any luck or justice or if I'm just not going to die a dickrotted leper, Debian bug 997845 is fixed
    • The input readiness file descriptor has for a long time been unreliable on all but Kitty. Unfortunately, I use Kitty as my daily driver, and tend to miss things easily. Thanks to @kmarius for staying on top of #2216, which i likewise believe to be well and truly fixed, finally
    • Work out the semantics of NCKEY_EOF and implement it properly along all paths #2525
    • Further work on improving the Sixel quantizer #2515
    • Full level-2 XTMODKEYS support including the Meta modifier and synthesized signals from XTMODKEYS #2522, #2518 thanks @cyanideforbreakfast for motivation and @dnkl for assistance
    • Report pixel-granular information for mouse events when Protocol 1016 is supported. Add pmouse entry to notcurses-info to see whether 1016 is available #2326.
    • Clean up the legend in the [reels] demo, which otherwise looked stupid in the [fission] demo for DFSG builds #2535
    • handle iTerm's particular XTSMGRAPHICS failure messages #2531 thanks @michaelsbradleyjr for report
    • properly reset keyboard protocol when leaving alternate screen #2509 thanks @Mukundan314 for report
    • fix sixel unit tests to work in all geometries
    • terminology now supports XTVERSION. good for them.
    • install tfman.1 into doc tarball.
    • actually implement BUILD_FFI_LIBS #2519

    this was not a fun work cycle, not at all. but these were all deep bugs that needed be knocked out. work on input isn't sexy, and it's hard to show off, but when the chips are down, it's something that'll differentiate the players from the scrubs. ours is the most general, complex, and powerful of which i'm aware (would you expect anything less?), and input's something where a lot of terminals went their own ways.

    anyway, hack on.

    metal fingers in my body

    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-3.0.4.tar.gz(144.26 KB)
    notcurses_3.0.4+dfsg.1.orig.tar.xz(7.04 MB)
    notcurses_3.0.4+dfsg.1.orig.tar.xz.asc(833 bytes)
    v3.0.4.tar.gz.asc(833 bytes)
  • v3.0.3(Jan 2, 2022)

    No big changes here. Sixel quantization has been rewritten; it is now substantially faster, but has taken a quality hit on some images. I'll be working on rectifying this for 3.0.4 (see #1452, #2503, and #2516).

    • Eliminate garbage input in XTerm on startup when Sixel is not supported (#2517)
    • Count sixel properly in bitmap stats (#2507)
    • Fix [box] demo when there is no available pixel geometry (#2505)

    there might have been a few other things in there, but they were small. Most work was related to improving SIxel quantization.

    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-3.0.3.tar.gz(143.26 KB)
    notcurses_3.0.3+dfsg.1.orig.tar.xz(7.04 MB)
    notcurses_3.0.3+dfsg.1.orig.tar.xz.asc(833 bytes)
    v3.0.3.tar.gz.asc(833 bytes)
  • v3.0.2(Dec 21, 2021)

    • General blending: default colors and palette-indexed colors can now be blended along with RGB colors (#2433, #2442)
    • ncplayer -k and the notcurses-demo usage screen have been converted from Direct Mode to CLI mode (#2188, #2486)
    • Cell blitters properly clear target cells when transparent.
      • Results in colors being properly preserved from [highcontrast] to [dragon] (#2419)
    • When libdeflate is unavailable, use zlib for kitty graphics (#2423)
    • Avoid lockup when redirecting input from a small file (#2496)
      • Resolves https://github.com/dankamongmen/growlight/issues/153...
      • ...and thus https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=997845
    • Call nccell_release() on cells lost to ncplane_resize() (#2426)
    • Fix bug where NCALIGN_RIGHT with overfull line resulted in no output (#2472)
    • Fix crash in certain cases when resizing the visible area (#2471)
    • The [view] demo now keeps the picture-in-a-picture aligned with the right border on resize (#2479)
    • Implement the -L option for ncls (dereference symlinks) (#2006)
    • Don't assert() out of ncneofetch when lacking a logo (#2494)
    • New binary tfman, a man page browser ala man(1). Experimental.

    2021-12-21-144807_1453x1410_scrot

    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-3.0.2.tar.gz(142.45 KB)
    notcurses_3.0.2+dfsg.1.orig.tar.xz(7.04 MB)
    notcurses_3.0.2+dfsg.1.orig.tar.xz.asc(833 bytes)
    v3.0.2.tar.gz.asc(833 bytes)
  • v3.0.1(Dec 12, 2021)

    • fixes up build and unit test problems when using DFSG_BUILD.
    • add NCPLANE_OPTION_VSCROLL to enable scrolling on a plane from the beginning.
    • add NCPLANE_OPTION_AUTOGROW to support autogrowth of planes
      • if scrolling is enabled, autogrowth happens down
      • otherwise, it happens right
    • nctrees are now dynamic. add nctree_del() and nctree_add(). you can now create an empty nctree. #2458
    • query palette from terminals supporting this functionality #2442
    • restore original palette on terminals lacking XTPUSHCOLORS/XTPOPCOLORS #2435
    • stop issuing oc on startup and shutdown, preserving custom palettes #2450
    • fix static linking #2454
    • add some Kitty keyboard protocol elements we were missing #2439, #2452
    • properly handle control sequences split across multiple reads #2448
    • properly handle newlines in ncplane_puttext() #2446
    • don't allow ncchannels_reverse() to enter illegal states #2421
    • copy EGCs when calling ncplane_putc(), as they could be invalidated within (fixes OfflineEGCs unit test) #2420
    • fix for Linuxbrew build #2428
    • install alternate signal stack handler via sigaltstack() on UNIX #2424
    • faster ncplane_resize() when only the y dimension is changing #2425
    Source code(tar.gz)
    Source code(zip)
    notcurses-3.0.1.exe(45.65 MB)
    notcurses-doc-3.0.1.tar.gz(142.09 KB)
    notcurses_3.0.1+dfsg.1.orig.tar.xz(7.03 MB)
    notcurses_3.0.1+dfsg.1.orig.tar.xz.asc(833 bytes)
    v3.0.1.tar.gz.asc(833 bytes)
  • v3.0.0(Dec 2, 2021)

    in the A! I keep it playa while some choose to play it safe boi, check the résumé: it's risky business in the 'A'

    Notcurses 3.0.0 “In the 'A'” with API/ABI3

    boom! =]

    Notcurses 3.0.0 represents over a year of development since Notcurses 2.0.0 "Stankonia".

    The overall vision remains unchanged from the very beginning—composition of z-ordered planes, with an API naturally expressed in terms of 888RGB DirectColor and Unicode Extended Grapheme Clusters, amenable to multithreading—but it's grown beyond all my dreams. Notcurses has pushed the terminal ecosystem forward, with patches and influence going into XTerm, Kitty, Alacritty, MLterm, Contour, foot, the Linux console, iTerm2, MSYS2, console-setup, Valgrind, musl, and some I'm forgetting. Notcurses makes use of advanced new kernel functionality like Linux's pidfds, but at the same time runs on various BSDs, macOS, and even Microsoft Windows (natively, not just through WSL). It fully supports the new Windows ConPTY and Microsoft Terminal. It can be used to build fixed-screen TUIs and scrolling CLIs. Aside from its lack of Curses compatibility, it is—as far as I'm aware—the best, most powerful, ballinest terminal graphics library in existence.

    If you're writing a new terminal application in 202x, you probably ought be using Notcurses.

    help wanted/needed

    a python eating a crocodile

    are you a python hacker with a solid understanding of wrapping C? because i absolutely am not, and honestly have no interest in becoming one. i desperately need someone committed to adapting new C functionality in python as it emerges, ideally further extending that to create a truly pythonesque Notcurses interface. pick up @igo95862 's work in python/ and go to town. do you write go? same shit! c#? dot-net this motherfucker! what's in it for you? i wish i knew the answer to that question myself. @joseluis seems to have the situation pretty well handled for rust; ask him. i'll be handling fortran, prolog, and threaded intercal wrappers.

    left: a python eats a crocodile, before unhinging its dynamically-typed jaw and eating my time. note that the python is devouring the crocodile without a hint of parallelism, despite having seemingly evolved for, like, six hundred million years now. i bet it OOMs.

    API and ABI break

    Notcurses 3.0.0 introduces a hard ABI break relative to previous versions, and changes the SONAME to reflect this. Previous binaries will not link against Notcurses 3.0.0+. Even if you use no new API, nor any API which has been deprecated, your binary must be recompiled. The API has expanded throughout 2.x development, but 3.0.0 removes all functionality previously only deprecated. See the API changenotes below for complete information. I'm sorry for the API changes, but they leave Notcurses much improved for the future. Most changes can be safely implemented via global regex.

    There may be any number of additions to the API for Notcurses 4, but every attempt will be made to maintain backwards compatibility. The ABI will not change across 3.x development.

    major additions since 2.0.0

    kill your masters; become ungovernable

    With that, the most major changes since 2.0.0 include:

    • Direct interrogation of terminals, when present, to determine capabilities—Notcurses is moving away from reliance on Terminfo. Capabilities acquired in this fashion aren't dependent on the local copy of the terminfo database, nor upstream authors getting their terminfo changes into NCURSES, and especially not on the user correctly setting TERM.
    • Support for XTMODKEYS and the Kitty keyboard protocol for rich events. Support for console mice via GPM. Note that the Kitty keyboard protocol is now supported by foot! Among other things, this allows disambiguation of key depress, repeat, and release, as well as detection of modifier keys by themselves. Clients can now specify which mouse events they want, and get mouse movement events even when no buttons are pressed.
    • Support for Sixel and Kitty bitmap graphics, and direct draws to the Linux framebuffer console. Note that Kitty graphics are now supported by WezTerm! Bitmap capabilities are determined at runtime, and no matter what the backend, they're efficiently integrated into the overall z-axis model. They cover glyphs, and are covered by glyphs, just like any other plane. As always, Notcurses steps down among its blitters based on local capabilities.
    • The Unicode 13-based 3x2 "sexblitter" and 8x1 "eightsplotter" were added.
    • Support for Microsoft Windows, macOS, and Dragonfly BSD. macOS support benefitted greatly from @michaelsbradleyjr 's assistance testing, setting up GitHub CI, and providing a development platform. Windows support benefitted greatly from the wisdom and grandmotherly patience of @j4james. Both were substantial efforts, with Windows being by far the larger one, consuming close to two months' development time. It was worth it, though, to show off the powerful new Microsoft Terminal and the ConPTY, wherein Microsoft gets it almost right. Notcurses is nothing less than a sea change for Windows console app developers.
    • Non-interpolative scaling suitable for e.g. pixel art.
    • Scrolling on the standard plane for construction of CLI-like programs in Rendered Mode.
    • New nctree, ncprogbar, and nctabbed widgets, the latter from @MasFlam.
    • Much-improved Python wrappers from @igo95862.
    • Rust wrappers taken to an entirely new level by @joseluis.
    • Construction of ncvisuals via various RGB formats, as requested by @kaniini .
    • libnotcurses-core has been split out from libnotcurses, allowing binaries to be linked without the multimedia stack, even if the installed Notcurses was built with a multimedia stack.
    • Distinct rendering contexts are available as piles; there are no concurrency hazards shared between piles.
    • The new notcurses-info binary provides a quick summation and exercise of terminal capabilities.
    • The new ncls binary lists and renders files.
    • notcurses-view has been renamed to ncplayer, and now accepts -n for non-interpolative scaling, and -a to alpha-mask a color.

    ...but this is only a small sample of the expansions, improvements, and achievements of Notcurses 3.0.0! Give it a test drive. Write some apps around it. Hack. May one hundred flowers bloom! 百花齊放,百家爭鳴

    868 issues were closed via 7.7K+ commits in this release cycle.

    what they're saying

    the south's got somethin' to say

    The first time I ran notcurses’ “jungle” demo in foot nothing happened. Turned out to be a bug in foot’s handling of color palette changes. This phenomenon has kept repeating itself; notcurses using features in novel ways unearths terminal emulator bugs. notcurses-demo turns your terminal emulator into a 90s computer demo—and that’s a good thing." —Daniel Eklöf (@dnkl), author of foot

    I believe notcurses forms an excellent foundation for the next generation of terminal applications, with rich support for graphics and input, and lots of effort into graceful degradation for legacy terminals. I recommend anyone starting to build a terminal application in 2021 consider it as the foundation layer. —Kovid Goyal (@kovidgoyal), author of Kitty

    Terminals have long been seen as an old era tech, and so, many applications retain the behavior of those apps and standard being even older than I am. Notcurses not so much! I am glad notcurses is trying to break out and breathe fresh air and new life into our beloved eco system again with many features the young generation of users and developers want and will expect. A huge thanks to Nick Black for helping us move forward in the terminal land. The notcurses demos are mind blowing and inspiring of what modern terminal applications can be capable of and I recommend anyone asking me what to use when building terminal apps to give notcurses a try. Hack on! —Christian Parpart (@christianparpart), author of Contour

    The demo is great, and looks like it can push out enough detail to pull off silliness like pushing an SNES game’s output straight to the console. What might be the most impressive element of the library is that while it can blit high res graphics through a terminal emulator with graphical support, it will also work on the basic Linux console, with no graphical system installed, by using some very old tricks. I know what you’re wondering: That’s all well and good, but can it run Doom? Yep. —Hackaday 2021-05-20 "Terminal Magic with Notcurses"

    Just ran notcurses-demo. Mind blowing. Is it even legal? —u/rmrfchik

    gallery

    Microsoft Terminal running ncneofetch

    Two Microsoft Terminals run ncneofetch and ncplayer. Microsoft Terminal does not (yet) support bitmap graphics, nor Unicode 13 (necessary for the sexblitter), so here we see the quadblitter.

    Microsoft Terminal running ncneofetch

    Terminal.App, iTerm2, and Kitty 0.21.2 on macOS. iTerm2 does not yet support partially-transparent bitmap graphics, but its author is working on it. Terminal.App is a somewhat lackluster program.

    Microsoft Terminal running ncneofetch

    WezTerm runs ncneofetch while ssh'd into a FreeBSD 13 virtual machine. On the left, Kitty 0.21.3 churns through the [xray] phase of notcurses-demo.

    the new CLI mode

    In the beginning, there was struct notcurses for a "Rendered Mode" context, and struct ncdirect for a "Direct Mode" context. Among other differences, output never resulted in true, externally-meaningful screen scrolling in Rendered Mode (you could fake it internally with a scrolling plane, but this wouldn't e.g. scroll existing content you hadn't generated). Rendered Mode was geared towards fullscreen TUIs, and free-scrolling CLIs were only possible in Direct Mode.

    Well, Direct Mode allows other programs to generate output, and thus never knows the screen contents, eliminating most optimizations. The two APIs diverged extensively, and you basically couldn't use any of the Notcurses widgets etc. with a CLI program. @klamonte's "The Command Line vs. the Terminal" speaks truth:

    ...users really need the "command line", but not so much the "terminal". What do I mean by that? By "command line", I mean pipe-able (composable) programs that read from stdin, write to stdout, and do a sequence of command / response / command / response. Just like the "read-eval-print-loop" (REPL) used by Lisp, Python, and many other programming languages.

    We needed to unleash the full power of Rendered Mode on CLI-style applications. Hence "CLI mode", which uses the struct notcurses context. It ought be initialized with NCOPTION_NO_CLEAR_BITMAPS (to leave previous output unmolested), NCOPTION_PRESERVE_CURSOR (to start wherever the program was launched), and NCOPTION_NO_ALTERNATE_SCREEN (hopefully obvious). Upon acquiring the context, invoke ncplane_set_scrolling() on the standard plane (it was not previously possible to enable scrolling on the standard plane). Congratulations, you now have a CLI app. You must continue to invoke notcurses_render() or some other rasterizer to generate output.

    I'm not yet satisfied with the CLI mode (see "Notcurses IV" below), but think its shortcomings can be remedied without any API/ABI breakage. In particular, it's currently too difficult to simply stream data and ensure you have it all in your scrollback history, due to all those manual render/raster calls. This will be improved.

    porting api2 applications to api3

    let the breakage begin!

    If you've kept your application up to date through the 2.x.x development cycle, updating to eliminate deprecation warnings, congratulations! 3.0.0 introduces no user-visible changes relative to 2.4.x, save the removal of long-deprecated material. Some functions which were previously symbols in the library are now static inline header-only implementations, and a recompile will be sufficient to get you linked and going. A recompile is in any case necessary due to struct changes and other ABI variations.

    Let's assume the worst plausible case: you have a program built against Notcurses 2.0.0, and want to build it against 3.0.0, retaining prior behavior. You'll probably need to make a change or two, most of them insubstantial:

    • It is no longer possible to have multiple contexts open concurrently, including a rendered mode notcurses context alongside a direct mode ncdirect context. If you were doing this to handle input, manage your cursor and use an ncreader. If you were doing this to run a subprocess, use an ncsubproc.
    • ncvisual_render() has been dropped in favor of ncvisual_blit(). The latter responds to a NULL target plane by creating a new pile, rather than creating a new plane in the standard pile. To get the old behavior, pass the standard plane as n in ncvisual_options, and add NCVISUAL_OPTION_CHILDPLANE to flags.
    • Removed unsafe cell_fchannel(), cell_bchannel(), cell_set_fchannel(), and cell_set_bchannel(). If you were using these, the safe parts can be accomplished with other existing functions. cell_width() has been replaced by nccell_cols(), and no longer requires an ncplane* argument. All other functions starting with cell now start with nccell, and the cell type is now nccell. Macros starting with CELL now start with NCCELL.
    • All functions starting with channel now start with ncchannel, and the channel/channels types are now ncchannel/ncchannels. Macros beginning with CHANNEL now begin with NCCHANNEL.
    • All functions starting with palette now start with ncpalette. The palette256 type has been renamed ncpalette.
    • ncvisual_subtitle() has been replaced with ncvisual_subtitle_plane(), and returns a new ncplane*.
    • NCSTYLE_REVERSE has been eliminated. ncchannels_reverse() is available to reverse the fore- and background of an ncchannels variable, but is not a direct replacement.
    • NCSTYLE_DIM has been eliminated. The same effect can be more portably achieved with channel RGB.
    • NCSTYLE_BLINK has been eliminated. The same effect can be more portably achieved with ncplane_pulse().
    • renderfp has been removed from notcurses_options, with no replacement functionality.
    • ncplane_rgba() has been renamed ncplane_as_rgba().
    • ncvisual_geom() has been reworked to use the new ncvgeom struct.
    • ncplane_align() has been replaced by ncplane_halign().
    • notcurses_stats() traded the const modifier on its notcurses* parameter for elimination of data races.
    • ncplane_qrcode() no longer accepts a blitter specification, since only NCBLIT_2x1 works.
    • All ncplane_put*() functions now return the number of columns output, as documented (some were erroneously returning the number of bytes output).
    • ncdirect_styles_{set, on, off}() have been renamed ncdirect_{set, on, off}_styles().
    • ncdirect_raster_frame() no longer requires blitter nor scale.
    • ncdirect_{fg, bg}_{default, rgb}() have been renamed ncdirect_set_{fg, bg}_{default, rgb}().
    • ncplane_options lost its horiz union, which was replaced with its x member.
    • There were many changes to Direct Mode, but I've not bothered listing them here because you ought be using CLI mode.

    what's coming in Notcurses IV

    good news from home! I've got big plans for Notcurses IV, most of them regarding sweet, sweet perf.

    the endankification of CLI mode

    The CLI mode came up kinda late in Notcurses design, well into the 2.x cycle. It became clear that streaming stdio CLIs are more frequently authored than high-performance, non-scrolling TUIs. By allowing the standard plane to be placed into scrolling mode, this functionality was bolted on. It's not where I want it. You currently have to manage all the scrolling yourself, which gets pretty hairy once you bring multiple planes into the picture. You furthermore need decide when to render, and no one wants to think about that. Render insufficiently frequently, and data will be lost to virtual internal scrolling; render every line, and you do a lot of extra work (CLI mode doesn't yet always take advantage of hardware scrolling). I intend to make fuller use of hardware scrolling so that rendering can take place on every virtual scroll event, for full fidelity, full performance, and no developer effort.

    wholesale emancipation from terminfo

    Notcurses has made use of Terminfo (as distributed with NCURSES) since its inception. The limitations of that library have become more and more apparent, and with Notcurses now using direct terminal queries wherever possible, it's time to consider ditching libterminfo (and perhaps even the TERM environment variable, which can be—and all too often is—incorrect). Terminfo doesn't cover a substantial amount of behavior Notcurses actively employs, from bitmap graphics to extended input protocols. Many terminals in any case don't bother putting together an accurate terminfo database entry, simply calling themselves xterm or xterm-256color and approximating XTerm to one degree or another. Let us cast off this taint, and become taintless.

    If you're a terminal author, I encourage you to implement the XTGETTCAP and XTVERSION control sequences.

    mosaicworld

    It was obvious from the very first days of bitmap graphics support that breaking an image into cell-sized fragments offered many significant advantages. Performance issues of some terminals when making use of hundreds of independent graphics prevented me from immediately pursuing this implementation, but it's time to use it where possible. Mosaics will improve performance when interacting with other planes, improve reliability when the screen geometry changes, eliminate problems when a sprixel moves partially off-screen, and drastically simplify the logic of bitmapped graphics atop a terminal's matrix of cells.

    better and faster sixel quantization

    My quantization algorithm is slower than libsixel, and yet manages to also produce lower-quality encodings (on the plus side, it's not known to be riddled with major security problems). I look forward to significant improvements in both regards, certainly to the level of libsixel. It's likely that we'll want to integrate some dithering capabilities as well. Here's another area where mosaics have benefits: when your sixels are only as large as a single cell, you're less likely to suffer from quantization effects (at the cost, of course, of bandwidth).

    When using the Kitty graphics protocol, Notcurses is unparalleled.

    a replacement for libsixel

    The maintainer of libsixel has been missing for years. @ctrlcctrlv roped me into comaintainership of a fork earlier this year, and we've been patching up the worst of things, but it's a fundamentally insecure API. I'll be wrapping the Notcurses sixel code with a libsixel-like API, one existing applications can move to with simple changes (essentially, a length needs be passed in along with the source buffer).

    Notcurses-within-Notcurses and Background-Stay-Resident terminal "widgets"

    This is some Deeper Fucking Magic from Beyond the Dawn of Time. Stay tuned to see something fundamentally new, if I can pull it off.

    optimized PseudoColor palettes derived from dynamic RGB DirectColor content

    It's oftentimes (almost always, actually) the case that a palette-indexed encoding of a given frame can require less bandwidth than a pure RGB version, yet encode all colors losslessly (assuming it can freely fall back to RGB). Notcurses currently always uses RGB when it is available, and maps RGB to palette-indexed terminals in a naive fashion. We can instead come up with an optimal palette on the fly, so long as it can be done with sufficient performance (i.e. median cut on all cells of every frame is not going to cut it). Suitable algorithms seem pretty obvious, if perhaps non-trivial. Implement this to save bandwidth (the first-order determinant of overall performance), and also to improve image quality when rendering to non-RGB terminals, especially color-starved terminals like the Linux console.

    support for Linux's Direct Rendering Infrastructure

    Just when I added Linux framebuffer support, it gets well and truly obsoleted. DRM is the (relatively) new hotness. I started in on some support during this development cycle, but it proved an unexpectedly tremendous pain in my ass, and was punted down the road.

    more of the usual bullshit

    • more commit messages making esoteric references to the literature of High Modernism
    • more Ice Cube videos embedded into GitHub issues
    • more ballin'
    • yes of course i'm going to make a dank hype video for this release, gimme a week/fortnight

    in the 'A'

    A-T-L
    That's my City in the Forest, the Capital of the New South,
    home to Georgia Tech, Home Park, and the Danktower.
    The South's got somethin' to say. ATL, baby, ATL!
    🖤 dank 2021-12-01
    Source code(tar.gz)
    Source code(zip)
    notcurses-3.0.0.exe(46.17 MB)
    notcurses-doc-3.0.0.tar.gz(138.17 KB)
    notcurses_3.0.0+dfsg.1.orig.tar.xz(7.02 MB)
    notcurses_3.0.0+dfsg.1.orig.tar.xz.asc(833 bytes)
    v3.0.0.tar.gz.asc(833 bytes)
  • v2.4.9(Nov 11, 2021)

    The judge set the bottle on the bar. Hear me, man, he said. There is room on the stage for one beast and one alone. All others are destined for a night that is eternal and without name. One by one they will step down into the darkness before the footlamps. Bears that dance, bears that dont.—Cormac McCarthy, Blood Meridian


    This is the final release planned for the 2.x.x series. The next release will be 3.0.0, shipping SONAME 3. This will be an API break, as well; all functionality currently marked deprecated will be removed. So long as you are not using deprecated functions, impact ought be minimal, perhaps requiring only a recompile.


    • ncvgeom now has its rcellx and rcelly fields filled in, providing the rendered dimensions in terms of cells. This is thus immediately available to callers of ncdirectf_geom(). The new function ncvisual_geom() replaces ncvisual_blitter_geom(), which has been deprecated, and fills in an ncvgeom with this and other information.
    • notcurses_mice_enable() and notcurses_mice_disable() have been added, replacing notcurses_mouse_enable() and notcurses_mouse_disable(). notcurses_mice_disable() is a static inline wrapper for notcurses_mice_enable(NCMICE_NO_EVENTS). notcurses_mice_enable() accepts a bitmask over types of mouse event. Mouse movement without a button pressed can now be tracked with NCMICE_MOVE_EVENT. For the old behavior (report only when a button is pressed), use notcurses_mice_enable(NCMICE_BUTTON_EVENT).
    • On transitions between ncplanes during rendering, on terminals known to have complex handling of glyphs, Notcurses will now sometimes issue hpa ("horizontal position absolute") control sequences that ought not be necessary, but ought normalize position when Notcurses and the terminal disagree about glyph width. The number of sequences thus issued is available as the new stat hpa_gratuitous. This fixes some longstanding bugs in e.g. the [whiteout] and [uniblock] demos.
    • Some improvements to ZWJ handling and Unicode segmentation.
    • Clean up ncdirect_cursor_yx thanks to new input system.
    • Only send XTMODKEYS if the Kitty keyboard protocol is not available.
    • Prefer XTVERSION results to the TN value of XTGETTCAP.
    • Fix bug when width was 2 in ncdirect_box().
    • [mojibake] add the Unicode 7.0 emoji, which were missing for whatever reason.
    • Eliminate recursion in ncplane_polyfill_yx() and ncvisual_polyfill_yx(), fixing bug on environments with small stacks.
    • Stop issuing LTR forcings following RTL bidi Unicode.
    • FIx regression in [fission] demo that drew background over previous material
    • Cap size of orca in [intro] demo at 1/4 width, 1/3 height of screen
    • Fix small memory leak in nctree
    • Wait for input at end of procroller PoC
    • Use NCSCALE_STRETCH instead of NCSCALE_NONE in some unit tests so they work on small screens
    • Use rgb with XTGETTCAP to detect DirectColor unambiguously on supporting terminals
    • Properly flush the clear before completing raster in notcurses_refresh()
    • Use u7 for cursor location reports on Microsoft Windows
    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.4.9.tar.gz(133.47 KB)
    notcurses_2.4.9+dfsg.1.orig.tar.xz(5.88 MB)
    notcurses_2.4.9+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.4.9.tar.gz.asc(833 bytes)
  • v2.4.8(Oct 23, 2021)

    OK, after a few kinda rough releases--it's been a difficult month--I feel really, really good about this one. I believe 2.4.8 will honor its righteous progression of powers-of-two. Very few new features here, but instead lots of subtle fixes and analysis. Also, full Unicode 14.0 support on macOS now!

    2021-10-23-052100_887x691_scrot

    • Multithread the [view] and [yield] demos (#1613)
      • improves their performance on most platforms
      • provides examples for multithreaded employment of multiple ncpiles
    • Fix bug in notcurses-demo where [zoo] left its background plane up
    • Fix bug in Kitty graphics rendering where glyphs under opaque sprixcells weren't invalidated, but needed to be
      • Fixes several longstanding bugs in notcurses-demo (#1932, #2297)
    • Fix a bad memory leak in ncvisual_stream() (#2286) and several others on error paths (#2282)
    • Fix bad memory write when wiping/rebuilding sixel which is partially offscreen (#2287)
    • Fix use-after-free in automaton construction that likely never hit anyone, but was lurking (#2279)
    • Address scan-build warnings, some of them real, others (i think/hope) not (#1348)
    • Allocate auxiliary vectors appropriate for graphics protocol, saving 50% of memory for fbcon / kitty-static
    • Don't discount a character simply because wcwidth() returns -1; gets most Unicode 13 working on macOS (#2285)
    • Support environment variable NOTCURSES_LOGLEVEL (#2277)
    • [keller] demo now exits out when it fails to blit something it thinks ought have worked (#2278)
      • Fix bitmap sizing bug this surfaced
    • Add USE_ASAN to build with AddressSanitizer, add several compiler optimization flags for floating point (but not the rollup -ffast-math, which includes -ffinite-math-only, which is incompatible with libav, which sometimes reports NaN for timing information). Do not enable this unless actively debugging; it will greatly reduce performance!

    The man he stepped up to the microphone and he gave it a kiss. It was a big wet, slippery kiss. He had sweat dripping off of his nose onto the windscreen. As he looked out over the audience he said, "God bless you, God bless you one and all." Then he took a can of Ronson lighter fluid and he squirted it over the top of his head, and proceeded to light himself on fire, and as he stood there glowing he said, "Remember this day."

    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.4.8.tar.gz(131.28 KB)
    notcurses_2.4.8+dfsg.1.orig.tar.xz(5.87 MB)
    notcurses_2.4.8+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.4.8.tar.gz.asc(833 bytes)
  • v2.4.7(Oct 17, 2021)

    be aware: 3.0.0 and ABI3 are coming soon! this will see all deprecated material removed, possibly requiring code changes on your part. be sure you're actively moving away from deprecated functions (they're all marked, and ought elicit compiler warnings).

    haxorec16

    • Add full support for features 2 and 8 of the Kitty keyboard protocol. This results in very thorough coverage of keyboard events, but some of them might be unexpected. Each keypress will typically now result in at least two input events (a press and release). Keys that previously resulted in no event (e.g. shift, alt, etc.) now result in events. These events will only be generated on Kitty or other terminals implementing this protocol.
    • XTMODKEYS is now used where supported, providing more coverage of keyboard events.
    • Sixel support was previously detected via XTSMGRAPHICS replies. It is now predicated on the presence of a '4' feature in the Device Attributes response. As a result, Sixel is now supported on numerous terminal emulators where it was not previously detected. Terminal authors are strongly encouraged to implement XTSMGRAPHICS if implementing Sixel.
    • ncvisualplane_create() now allows for a new pile to be created by passing a NULL ancestor plane in vopts.
    • ncvisual_render() has been deprecated, replaced by ncvisual_blit(). ncvisual_render() is still available, but will be removed for ABI3. The new function is pile-aware. When a NULL value is passed as vopts->n, or when vopts itself is NULL, a new plane will still be created, but it will now be in a new pile (previously, the new plane would be in the standard plane). To maintain the old behavior with ncvisual_blit() (i.e. to make a new plane bound to the standard plane), pass the standard plane as vopts->n, and add NCVISUAL_OPTION_CHILDPLANE to n->flags. See #1462.
    • Use unnamed pipes on Windows for input readiness notification.
    • constify most of the relevant members of various widget creation options.
    • notcurses-demo now uses seconds rather than semiseconds as the base unit of the FPS plot.
    • Detect GNU screen. Never attempt to use RGB with screen 4.
    • Support smooth bitmap movement / precise bitmap placement when using the Kitty graphics protocol. Support will be added for sixel and fbcon soon. Use the new pxoffy and pxoffx members of the ncvisual_options struct.
    • Replace all wcstombs() calls with thread-safe wcsrtombs().
    • Send synthesized signals even when NCOPTION_INPUT_DRAIN is in use.
    • Extract version from Secondary Device Attributes for older XTerms.
    • Properly reset the keyboard state after a crash in initialization.
    • Properly push and pop keyboard states when switching to and from the alternate screen post-initialization.
    • Widget input handling functions ignore all keyboard event types save press.
    • Add new NCKEY constants for modifiers and other keys which previously didn't generate events.
    • Use explicit CRLFs where necessary on Windows, fixing banners.
    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.4.7.tar.gz(130.77 KB)
    notcurses_2.4.7+dfsg.1.orig.tar.xz(5.87 MB)
    notcurses_2.4.7+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.4.7.tar.gz.asc(833 bytes)
  • v2.4.5(Oct 7, 2021)

    haxorec13

    • If you currently have 2.4.4 installed/packaged, I urge you in the strongest of terms to upgrade to 2.4.5. I conjectured in the 2.4.4 release notes that the massive input automaton unification would probably have some bugs shake out. That conjecture was demonstrated true. Most noticeably, backspace didn't work in most terminals, and Notcurses would sometimes hang during initialization (this was dependent on where on the screen it started). All discovered problems in the input layer have been resolved.
    • Support has been added for feature 2 of the Kitty keyboard protocol, along with XTMODKEYS where that extension is supported. The upshot is that we can now properly identify more combinations of special keys and modifiers.
    • Support has been added for media keys when using the Kitty protocol.
    • Properly initialize evtype for resize events.
    • Avoid divide-by-zero in intro demo when we knew cell geometry but not pixel geometry.
    • Added "Notes for Terminal Authors" section to TERMINALS.md
    • Add some line-editing shortcuts to ncdirect_readline().
    • Properly reset the terminal when no output is generated.
    • Drop mouse events in the right and bottom margins.
    • ncplane_dup now works correctly on root planes.
    • Fix a bug in ncdirect_reparent_family() that led to invalid memory accesses.
    • Added ncplane_move_family_{above, below}()
    • Added ncplane_move_family_{top, bottom}()
    • Fix workaround for kitty default background color being treated as transparent
    • Remove poorly-thought-out ncplane_boundlist(), which I hope no one was using.
    • Distinguish between known and unknown default background color in notcurses-info.
    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.4.5.tar.gz(130.41 KB)
    notcurses_2.4.5+dfsg.1.orig.tar.xz(5.86 MB)
    notcurses_2.4.5+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.4.5.tar.gz.asc(833 bytes)
  • v2.4.4(Oct 3, 2021)

    haxorec47

    Qui si convien lasciare ogne sospetto; ogne viltà convien che qui sia morta. —Dante Alighieri, The Inferno, Canto III, 14-15

    I am dankamongmen, wrangler of automata! Look upon my works, ye Mighty, and despair! This release sees the much-heralded unification of input automata, and the most complex bit of coding since at least the initial pixel blitter work, and very possibly the most complex code in the project. Essentially, we have two sources of input escape sequences we need match: simple strings dynamically loaded from terminfo, and regex-like sequences statically hardcoded into the library. Previously, we had two distinct automata: a dataflow-based one for the (acquired at runtime) terminfo sequences, and a controlflow-based one for the (known ahead of time, but more complex) response sequences. Being a man of taste and means, this was completely aesthetically unacceptable. We now build a single, wholly dynamic, dataflow-based automaton encompassing all possible control sequence inputs. Being much too cool/stupid/autistic to simply string together some ɛ-transitions (are we remembering our Sipser, or perhaps our Hopcroft+Ullman, friends?), spool out a GNFA, take the power set, apply Glushkov/Thompson and reduce that fucker (the idea of using some other jabronie's DFA library was of course never considered), we build the reduced DFA on the fly, which is probably way more difficult than you think.

    i am not left-handed, either

    I've tested it in my standard set of testing terminals, and held off from release until it seemed perfect in all. I'm sure you'l find some small (or larger) issues, though, so please file bugs and have a little patience. It's been a long week.

    Besides that...

    • 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 with ncdirect_readline(), or else it can't implement line-editing keybindings. Packagers, please stop supplying -DUSE_READLINE to CMake, and drop libreadline from Notcurses dependencies.
    • ncwcsrtombs() has been added to convert a wchar_t* to a heap-allocated, UTF8-encoded char*.
    • For those of you paying by the electron, -DUSE_CPP=off can now avoid any need for a C++ compiler. This cannot be used with -DUSE_MULTIMEDIA=oiio, since OpenImageIO is fundamentally C++. You also won't be able to build the NCPP C++ wrappers, natch, nor notcurses-tester, notcurses-input, ncplayer, nor even humble nctetris.

    So. Not the most exciting release for y'all, but very exciting for me. Next time, more cool shit you can use!

    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.4.4.tar.gz(129.06 KB)
    notcurses_2.4.4+dfsg.1.orig.tar.xz(5.86 MB)
    notcurses_2.4.4+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.4.4.tar.gz.asc(833 bytes)
  • v2.4.3(Sep 26, 2021)

    • Use posix_spawn() and its ass-ugly API in place of fork()+exec*() #2194.
    • Fix a bug in ncplane_erase_region(), and make it much more general. It can now be used for cursor-relative erasure through the end/beginning of the current line, etc #2181.
    • It was recently discovered that many terminals, including XTerm, had inverted the semantics of DECSDM aka "Sixel Display Mode". Since then, a number of these terminals have changed their semantics to match the VT340 semantics. Unfortunately, this means older versions of Notcurses now display all sixels in the upper left of the visual area. Notcurses now knows the semantics changed in XTerm 369, the ayosec/graphics branch of Alacritty 15.1, foot 1.8.2, and MinTTY 3.5.2 #2205. Many thanks to @j4james for his assistance here, and general spearheading of this ecosystem-wide change.

    If it weren't for that last, I probably wouldn't have bothered to release just yet. Most work this week was on #2183, which isn't easily visible from the outside, but is absolutely critical for robust and performant handling of input. It's been a fascinating problem -- take a look at #2208 to see what all's going down. automata theory, huzzah! but yeah, not too much here, been busy at the day job, sorry i'll try to suck less ass.

    btw if anyone needs multi-gigabit low-latency satellite transit, i can get you a good price!

    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.4.3.tar.gz(129.06 KB)
    notcurses_2.4.3+dfsg.1.orig.tar.xz(5.86 MB)
    notcurses_2.4.3+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.4.3.tar.gz.asc(833 bytes)
  • v2.4.2(Sep 20, 2021)

    ok look, this one has an absolute shitton of churn in it. i'd not have released it yet, except a few bugfixes needed to go out. here's the deal: i completely rewrote the input subsystem, which was already complex as hell. it now spawns its own thread so that i can reliably get terminal messages even if you're not looking for input--i have to have my own execution context involved. it is a great improvement overall, but has deep, subtle, platform-specific effects.

    Microsoft Windows definitely regresses a bit with this release; I recommend you stick to 2.4.1 on that platform. otherwise, brave souls are encouraged to beat on this, and report any bugs you find.

    • The Rust bindings are no longer included in the main Notcurses repository. They can instead be found here: dankamongmen/libnotcurses-sys
    • Notcurses now supports Unicode 14 (if the underlying system supports it).
    • The input subsystem has been completely rewritten, making it much more robust.
      • NCOPTION_DRAIN_INPUT and NCDIRECT_OPTION_DRAIN_INPUT have been added. Your program ought use them if it doesn't intend to handle input. Failure to do so will result in unnecessary work, and possibly even dropped messages from the console.
      • A distinct input thread is now spawned, ensuring responsive handling of terminal control sequences even when the user isn't actively looking for input.
      • Notcurses can now distinguish between a key press, a repeat, and a key release for some events. NCKEY_RELEASE has been removed. When a mouse button is released, you'll now get the actual button (plus NCTYPE_RELEASE).
      • When input is redirected from a file, notcurses-input will now exit once the entire file is processed. Not coincidentally, NCKEY_EOF now indicates the end of input.
      • notcurses_getvec() allows batched reads from input.
      • Sequences beginning with an Escape character that aren't recognized control sequences are now returned as input.
      • GPM mouse events now account for margins.
      • Mouse clicks in the margins are no longer returned.
    • SIGWINCH and SIGCONT are now masked in the thread that calls notcurses_init(). This is because the addition of a distinct input thread exacerbated the problem of SIGWINCH being delivered to an unexpected thread. While this change will suffice for otherwise single-threaded programs, it remains your responsibility to ensure all threads have masked SIGWINCH and SIGCONT. See the FAQs!
    • A bug was fixed when moving graphics using the Kitty protocol in the presence of margins.
    • A bug was fixed when using multiframe bitmap graphics using the Kitty protocol, and a graphic was drawn over, then restored.
    • A resize callback can now be set for the standard plane.
    • A bug was fixed when characters were erased in a resize callback, thanks @kevinconley19.
    • Notcurses now supports libavformat 59+.
    • Cell blitting in direct mode is now faster and more robust.
    • ncneofetch no longer attempts to run xrandr on Microsoft Windows.
    • ncneofetch properly centers its logo now, a problem most noticeable on macOS.
    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.4.2.tar.gz(129.43 KB)
    notcurses_2.4.2+dfsg.1.orig.tar.xz(5.85 MB)
    notcurses_2.4.2+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.4.2.tar.gz.asc(833 bytes)
  • v2.4.1(Sep 13, 2021)

    • Fixed up nasty memory leak with NCBLIT_PIXEL. Turns out valgrind doesn't track mmap() by default, a fact of which I was sadly unaware (#2150).
    • Support for second generation kitty animation was determined to break down in the presence of multiframe plus wiping/rebuilding. This was fixed, but it led to unacceptable slowdown. I've instead disabled second generation animation support until this is fixed (#2143, #2161).
    • Properly synthesize SIGINT and SIGQUIT from kitty keyboard protocol.
    • Properly send the kitty keyboard pop directive to the alternate screen when it's being used. Fixes the terminal being left in an unexpected keyboard state on exit on kitty when redirected (#2149).
    • ncneofetch now properly extracts the macOS version (#2158).
    • Some small fixes and tweaks to plots. The summary number now describes the ongoing slot, so it spins up in e.g. notcurses-demo (#2152).
    • Added ncstrwidth_valid() (#2153).

    2.4.2 work will hopefully see the new input subsystem completed, plus resolution of some CLI-mode problems seen on macOS.

    hack on!

    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.4.1.tar.gz(127.79 KB)
    notcurses_2.4.1+dfsg.1.orig.tar.xz(7.47 MB)
    notcurses_2.4.1+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.4.1.tar.gz.asc(833 bytes)
  • v2.4.0(Sep 6, 2021)

    120 days, 1581 commits, and 323 issues resolved since 2.3.0. 660 days, 6769 commits, and 1,442 issues resolved since Day 0. split your lungs with blood and thunder when you see the white whale! check out this gource video of development!


    the 2.4.0 release of Notcurses is dedicated with loving memory to Gregory Allen Black, aka Pa Dank, 1949–2021. give 'em shit in the afterlife, dad. don't take any guff from those fucking swine. hearts alive. roll tide roll.


    A MASTODONIC RELEASE, primarily focused on bugfixes, portability, and robustness, but with plenty of new features as well. This development cycle saw our first kernel patch land; it will be present in Linux 5.15. I hope to do some further kernel work to enhance the Linux console. Since 2.3.0, changes include (but are not at all limited to):

    • Notcurses now supports macOS and Microsoft Windows. It is included in Homebrew and MacPorts.
      • Big thanks to @michaelsbradleyjr who bought a Mac Mini and made it available to the project, and figured out what the hell MSYS2 and UCRT are, and generally dragged us (for better or worse) into the dread lands of closed source.
      • Here it is running in the lovely new Microsoft Terminal:

    2021-09-06-001545_2526x1408_scrot

    • Support for bitmap graphics on the Linux framebuffer console.
    • Support for Linux console mouse events via GPM when built with -DUSE_GPM=on.
    • Support for the kitty keyboard protocol.
      • I encourage its adoption by other terminals!
    • Tremendous improvement in Sixel and especially Kitty graphics, including support for extremely efficient updates using the new Kitty animation protocol, including a feature motivated by Notcurses.
    • Support for NCBLIT_PIXEL in ncuplot/ncdplot. Behold beautiful pixel plots:

    2021-09-06-044721_1256x1389_scrot

    • The terminal is now extensively (but efficiently) queried on startup. Some properties are derived from the results.
      • Numerous patches were submitted to upstream terminals to support this functionality.
      • Eventually, this will be expanded to eliminate our reliance on TERM and dependence on terminfo.
      • Eliminated the need to call notcurses_check_pixel_support() before using NCBLIT_PIXEL.
    • Non-interpolative scaling is now available for ncvisuals, suitable for pixel art and other purposes (thanks @joseluis !).
      • ncplayer now supports -n for non-interpolative scaling
    • Removed NCSTYLE_{INVIS, BLINK, STANDOUT, REVERSE}. They remain defined for now, but will be removed for ABI3.
      • Added ncchannels_reverse() to make up for NCSTYLE_REVERSE.
    • Scrolling is now supported on the standard plane.
    • A new binary, notcurses-info, explores Unicode conformance and terminal capabilities in a single screen of output.

    2021-09-06-045342_807x625_scrot

    • The new "CLI mode" supports CLI-style (as opposed to fullscreen TUI) applications with the full power of Notcurses, and is intended to replace Direct Mode. Direct Mode will be maintained, but not expanded any further. ncneofetch, notcurses-demo's summary table, and notcurses-info all use CLI mode.
    • Added support for synchronized updates
    • Scrolling a plane now scrolls bound planes with it, unless they're created with NCPLANE_OPTION_FIXED.
    • Added NCOPTION_PRESERVE_CURSOR.
    • ncvisual_subtitle_plane() has replaced ncvisual_subtitle(), and now supports all LibAV subtitle types, including Type-1 DVB (bitmap subtitles)
    • ncblit_as_rgba()/ncvisual_from_plane() now support NCBLIT_BRAILLE
    • Added ncvisual_from_rgb_loose(), ncvisual_from_rgb_packed() (thanks @kaniini!), and ncvisual_from_palindex()
    • ncls now defaults to pixel blitting.
    • Added ncplane_moverel() (thanks @tomek-szczesny!).

    with <3 from the dankest

    hearts alive

    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.4.0.tar.gz(127.52 KB)
    notcurses_2.4.0+dfsg.1.orig.tar.xz(7.47 MB)
    notcurses_2.4.0+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.4.0.tar.gz.asc(833 bytes)
  • v2.3.17(Aug 22, 2021)

    • fixed major bug on non-Linux platforms, introduced in 2.3.15, that broke all frames >2MB
    • add support for NCBLIT_PIXEL to plots
    • use absolute coordinates for rendering sprixels, resolving placement of bound sprixels
    • add notcurses_enter_alternate_screen() and notcurses_leave_alternate_screen()
    • stop honoring the renderfp field of notcurses_options. it is left in until ABI3
    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.3.17.tar.gz(127.09 KB)
    notcurses_2.3.17+dfsg.1.orig.tar.xz(7.46 MB)
    notcurses_2.3.17+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.3.17.tar.gz.asc(833 bytes)
  • v2.3.16(Aug 20, 2021)

  • v2.3.15(Aug 17, 2021)

    This is the first Notcurses release that builds on Windows, though Windows support is still very experimental.

    • Terminals which invert cursor reports are now detected in all modes, and accounted for #1886
    • Terminals which 0-index cursor reports are now detected in all modes, and accounted for #2044
      • This fixes notcurses-info output in kmscon
    • notcurses-tester now only requires 50 columns to run, down from 80 #2042
    • Loop on EBUSY and EWOULDBLOCK in control_read(), eliminating some initialization failures, thanks @christianparpart !
    • Properly hold fixed subplanes where they are on parent plane scroll #2036
    • Implement terminfo k*n input sequences, so we no longer return error on ctrl/shift+special #2028
    • Improve startup latency and unite direct/rendered mode startup #2023
    • notcurses-info: simplify coloring
    • Detect kitty graphics support via query #1998
    • Merge in portable fbuf replacement for POSIX memstreams, necessary for windows #1977 , #2038
      • We now build and, to a degree, work on Microsoft Windows #463
    • Lots of improvements for Linux framebuffer console graphics #2048
    • Fix ncls path separation #2063
    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.3.15.tar.gz(126.64 KB)
    notcurses_2.3.15+dfsg.1.orig.tar.xz(7.46 MB)
    notcurses_2.3.15+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.3.15.tar.gz.asc(833 bytes)
  • v2.3.13(Aug 5, 2021)

    Primarily a bugfix release, especially for the macOS environment. Most development work this cycle has not yet been merged, and is all about supporting Microsoft Windows and the Microsoft Terminal.

    • Obliterate any query text bled out by the terminal #2019
    • Allow the intro demo to run in any size window #2015
    • Allow the uniblock demo to run in 25 lines #2018
    • Force EGC combinations when U+200D Zero-width-joiner is used #2016
    • Plug memory leak in the composing+reflecting Kitty blitter used with 0.22.1+ #2012
    • Added some emoji to notcurses-info #2005
    • Fix invalid free() in fission demo #2003
    • Fix failure in fission demo #2002
    • Support building on macOS Mojave and other environments lacking C++17 std::filesystem #2001
    • Properly detect pixel geometry when running in Docker #1891
    • New portable functions notcurses_accountname() and notcurses_hostname() #2022
    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.3.13.tar.gz(126.64 KB)
    notcurses_2.3.13+dfsg.1.orig.tar.xz(7.46 MB)
    notcurses_2.3.13+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.3.13.tar.gz.asc(833 bytes)
  • v2.3.12(Jul 29, 2021)

    I think this will be a pretty solid one. Did a lot of testing and bugfixing this week.

    • Fix crash/errors on Linux framebuffer graphics when they weren't multiples of the cell geometry (#1996)
    • Scrub Linux framebuffer so multiframe partially-transparent graphics don't combine.
    • Support Type-1 DVB bitmap subtitles with ffmpeg (#1311). ncplayer will now display them when pixel blitting is available, regardless of whether pixel blitting is being used for the main image. They're only available from the new function ncvisual_subtitle_plane(), which supersedes ncvisual_subtitle(). The latter is now deprecated, and will be removed in ABI3.
    • Fix a memory leak on frame decode when a container had subtitles. This leak has been present since ffmpeg support was added, i.e. pre-1.0.
    • Add ncvisual_from_palindex() to build ncvisuals from palette-indexed streams.
    • Add support for Kitty 0.22.0's self-referential composition, though disable it for now due to a presumed bug in Kitty (see https://github.com/kovidgoyal/kitty/issues/3874). When enabled, this allows for much less memory usage/copying when using Kitty graphics #1900. I proposed it; see https://github.com/kovidgoyal/kitty/issues/3809 for more details. Thanks @kovidgoyal for implementing it!
    • In CLI mode, always move to the bottom before attempting to scroll #1994. This fixes notcurses-info when launched close to, but not at, the bottom of the screen.
    • Propagate out the error when we abort in intro; it was always reporting FAILURE rather than ABORTED.
    • Handle arbitrary glyph widths #1873. wcwidth() doesn't report any widths greater than 2 currently, but it might in the future, and should we ever use mosaics, we'll need this.
    • Added static inline nccell_cols(), which is faster than nccell_width(), which has been deprecated and will be removed for ABI 3.
    • Implement wipes and restores in Linux framebuffer graphics #1954.
    • Many changes necessary for supporting Windows, which is coming very soon
    • Removed sigset_t from the API by deprecating notcurses_getc() and ncdirect_getc(). notcurses_get() and ncdirect_get() have been added, which do not take a sigset_t. There was much rejoicing.
    • We now run CI on macOS (#1933), thanks @michaelsbradleyjr !
    • ncplayer now passes a specified loglevel through to ncdirect_core_init() #1981
    • Get Linux framebuffer graphics working in direct mode #1959
    • Fix terrible bug where we returned error instead of special keys from input
    • Replace %ju + uintmax_t casts everywhere with PRIu64 from inttypes.h
    • We now deflate Kitty bitmaps, reducing bandwidth at the cost of some latency #1695
    • Fix NCVISUAL_ADD_ALPHA when restoring cells in Kitty graphics
    • Flush before deciding whether to use Synchronized Update mode, to get the true length
    • ncmenu now uses NCPLANE_OPTION_FIXED so it doesn't move on scrolling planes #1958
    • Recognize Terminology based off DA3
    • Invert DECSDM on foot 1.8.2+ (thanks @dknl!)
    • notcurses-demo now creates the HUD and FPS graph with NCPLANE_OPTION_FIXED, so they no longer scroll off the screen in the whiteout demo, heh

    Enjoy!

    laughin' at bassheads

    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.3.12.tar.gz(125.27 KB)
    notcurses_2.3.12+dfsg.1.orig.tar.xz(7.46 MB)
    notcurses_2.3.12+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.3.12.tar.gz.asc(833 bytes)
  • v2.3.11(Jul 20, 2021)

    • Experimental support for iTerm2 and Linux fbcon bitmaps
    • SIGFPE is now handled like other fatal signals
    • NCALPHA_HIGHCONTRAST now works properly atop default backgrounds
    • NCPLANE_OPTION_FIXED has been added to change default behavior of bound planes, which now scroll alongside the parent plane.
    • Notcurses now requires libz to build.
    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.3.11.tar.gz(125.17 KB)
    notcurses_2.3.11+dfsg.1.orig.tar.xz(7.45 MB)
    notcurses_2.3.11+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.3.11.tar.gz.asc(833 bytes)
  • v2.3.10(Jul 15, 2021)

    • OS X is now supported, closing our oldest open bug (#195). File bugs, kiddos.
    • Fixed brown-bagger segfault on context shutdown.
    • XTPOPCOLORS and XTPUSHCOLORS are now emitted on terminals that support them (XTerm, Kitty).
    • notcurses-info will now continue after hitting an unsupported Unicode character, rather than truncating the line.
    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.3.10.tar.gz(132.00 KB)
    notcurses_2.3.10+dfsg.1.orig.tar.xz(7.44 MB)
    notcurses_2.3.10+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.3.10.tar.gz.asc(833 bytes)
  • v2.3.9(Jul 12, 2021)

    • 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() and ncdirect_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_moverel() thanks to @tomek-szczesny.
    • Documented ncplane_move_yx() in notcurses_plane.3, and removed the false comment that "passing -1 as a coordinate will hold that axis constant" from USGAE.md and notcurses.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.
    • ncmenus 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 and CHANNEL_RGB_INITIALIZER have been renamed NCCHANNELS_INITIALIZER and NCCHANNEL_INITIALIZER. The former two are now deprecated, and will be removed for ABI3.
    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.3.9.tar.gz(125.08 KB)
    notcurses_2.3.9+dfsg.1.orig.tar.xz(7.44 MB)
    notcurses_2.3.9+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.3.9.tar.gz.asc(833 bytes)
  • v2.3.8(Jul 4, 2021)

    a bugfix release.

    • stop using Synchronized Update Mode with kitty due to a bug which was rapidly fixed upstream (#1864)
    • fix serious issues in the OpenImageIO backend that had gone neglected for too long (#1722, #1723).
    • ncvisual_blitset_geom() fixes for several cases, mostly involving NCVISUAL_OPTION_CHILDPLANE (#1854 )
    • fix SM-based Synchronization Mode (#1850)
    • clear old glyphs even when under new sixel (#1537). this fixes the [xray] demo in foot and xterm
    • mojibake demo: add new emoji from Unicode 14.0β
    • fix cell_extended_p() for big-endian
    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.3.8.tar.gz(123.77 KB)
    notcurses_2.3.8+dfsg.1.orig.tar.xz(7.43 MB)
    notcurses_2.3.8+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.3.8.tar.gz.asc(833 bytes)
  • v2.3.7(Jun 29, 2021)

    • Colorized notcurses-info, and move to new scrolling-rendered mode (#1823)
    • ncls now uses NCBLIT_PIXEL by default. If using NCBLIT_PIXEL, it will default to NCSCALE_NONE_HIRES (#1835)
    • Support SM/RM-based Synchronized Updates in addition to DCS-based (#1850/#1845)
    • Fix crash when filling in transparent sprixcell with new frame, manifested as crash in ncplayer -bpixel -a (#1847)
    • Stop using sgr (#1818)
    • Identify the Linux framebuffer console, and extract pixel geometry from it (#1369)
    • Fix cursor detection in the Linux console (#1837)
    • Emit damaged glyphs when hidden by opaque kitty sprixcells. This won't be necessary anymore once we move to the animation protocol for holing out Kitty bitmaps, but it's necessary for now (#1704)
    • Fix problems compiling Rust crate on non-x86 architectures (#1339)
    • Reject control characters when loading nccells or outputing to an ncplane (#1840)
      • '\n' is still allowed, for scrolling planes only. '\0' is always allowed to zorch out a cell.
    • Added ncplane_scrolling_p() (#1841)
    • Add labels to interp PoC
    • Fix double free() in ffmpeg backend when destroying an ncvisual following a resize (#1800)
    • If TIOCGWINSZ fails, check LINES/COLUMNS environment variables, and terminfo database (#1826)
    • Fine libreadline properly on FreeBSD, and fix up FreeBSD builds prior to FreeBSD 12
    • Unified attribute backends for direct and rendered mode, eliminating a bunch of code duplication and some small errors
    • Don't install man pages for binaries we haven't built (#1824)
    • Added NCOPTION_PRESERVE_CURSOR (#1823)
    • Don't use C=1 with Kitty unless it's at least version 0.20.0, fixing NCBLIT_PIXEL on pre-0.20.0 Kitty (#1804)
    • Fix bouncing effect in XTerm when bitmap hit the last line (#1820)

    scream on 'em, axl

    Source code(tar.gz)
    Source code(zip)
    notcurses-doc-2.3.7.tar.gz(122.59 KB)
    notcurses_2.3.7+dfsg.1.orig.tar.xz(7.16 MB)
    notcurses_2.3.7+dfsg.1.orig.tar.xz.asc(833 bytes)
    v2.3.7.tar.gz.asc(833 bytes)
  • v2.3.6(Jun 24, 2021)

Free open-source modern C++17 / C++20 framework to create console, forms (GUI like WinForms) and unit test applications on Microsoft Windows, Apple macOS and Linux.

xtd Modern C++17/20 framework to create console (CLI), forms (GUI like WinForms) and tunit (unit tests like Microsoft Unit Testing Framework) applicat

Gammasoft 319 Jun 22, 2022
Latte is a dock based on plasma frameworks that provides an elegant and intuitive experience for your tasks and plasmoids.

Latte is a dock based on plasma frameworks that provides an elegant and intuitive experience for your tasks and plasmoids. It animates its contents by using parabolic zoom effect and trys to be there only when it is needed.

KDE GitHub Mirror 1.2k Jul 3, 2022
Build performant, native and cross-platform desktop applications with Node.js and CSS like styling. 🚀

NodeGui Build performant, native and cross-platform desktop applications with Node.js and CSS like styling. ?? NodeGUI is powered by Qt5 ?? which make

NodeGui 7.7k Jun 25, 2022
C, C++ headers and C# classes for icon fonts: Font Awesome, Fork Awesome, Material Design, Kenney game icons and Fontaudio

C, C++ headers and C# classes for icon fonts: Font Awesome, Fork Awesome, Material Design, Kenney game icons and Fontaudio

Juliette Foucaut 718 Jun 24, 2022
Purely native C++ cross-platform GUI framework for Android and iOS development. https://www.boden.io

BODEN CROSS-PLATFORM FRAMEWORK Build purely native cross-platform experiences with Boden Website ⬡ Getting Started ⬡ API Reference ⬡ Guides ⬡ Twitter

Ashampoo Systems GmbH & Co KG 1.5k Jun 26, 2022
GPU Accelerated C++ User Interface, with WYSIWYG developing tools, XML supports, built-in data binding and MVVM features.

GacUI GPU Accelerated C++ User Interface, with WYSIWYG developing tools, XML supports, built-in data binding and MVVM features. Read the LICENSE first

Vczh Libraries 2.1k Jun 29, 2022
Simple and portable (but not inflexible) GUI library in C that uses the native GUI technologies of each platform it supports.

libui: a portable GUI library for C This README is being written. Status It has come to my attention that I have not been particularly clear about how

Pietro Gagliardi 10.3k Jun 30, 2022
Minimalistic C++/Python GUI library for OpenGL, GLES2/3, Metal, and WebAssembly/WebGL

NanoGUI NanoGUI is a minimalistic cross-platform widget library for OpenGL 3+, GLES 2/3, and Metal. It supports automatic layout generation, stateful

Mitsuba Physically Based Renderer 1k Jun 27, 2022
A barebones single-header GUI library for Win32 and X11.

luigi A barebones single-header GUI library for Win32 and X11. Building example Windows Update luigi_example.c to #define UI_WINDOWS at the top of the

Nakst 168 Jun 17, 2022
An efficient graphical Minecraft seed finder and map viewer.

Cubiomes Viewer provides a graphical interface for the efficient and flexible seed-finding utilities provided by cubiomes and a map viewer for the Minecraft biomes and structure generation.

null 280 Jun 22, 2022
DeskGap is a framework for building cross-platform desktop apps with web technologies (JavaScript, HTML and CSS).

A cross-platform desktop app framework based on Node.js and the system webview

Wang, Chi 1.8k Jun 24, 2022
[WIP] Demo of a minimal but functional Dawn-based WebGPU client and server

dawn client-server example The goal of this demo is to create a minimal but functional Dawn-based WebGPU client and server with the following traits:

Rasmus 15 Nov 20, 2021
A minimalist andf platform-agnostic application layer for writing graphical applications, with a strong emphasis on simplicity and ease of use.

SlimApp A minimalist(*) and platform-agnostic application layer for writing graphical applications. Available as either a single header file or a dire

Arnon Marcus 33 Apr 22, 2022
Nvui: A NeoVim GUI written in C++ and Qt

Nvui: A NeoVim GUI written in C++ and Qt

Rohit Pradhan 1.6k Jun 25, 2022
Podman System Tray Icon for controlling `podman machine` and `podman system connection`.

Podman System Tray Icon Running Open in Qt Creator GUI: qtcreator systray.pro Or on the command line: $ qmake

Anders Björklund 6 Dec 11, 2021
super duper simple gui for C, wrapping imgui and stb

super duper simle gui for C, wrapping imgui and stb You can use it as a static library with cmake. See the example directory for a complete example. E

Rasmus 11 May 19, 2022
U++ is a C++ cross-platform rapid application development framework focused on programmer's productivity. It includes a set of libraries (GUI, SQL, Network etc.), and integrated development environment (TheIDE).

Ultimate++ Ultimate++ is a C++ cross-platform rapid application development framework focused on programmers productivity. It includes a set of librar

Ultimate++ 454 Jun 25, 2022
raygui is a simple and easy-to-use immediate-mode-gui library.

raygui is a simple and easy-to-use immediate-mode-gui library.

Ray 1.8k Jul 3, 2022
A wallpaper changer using Wallhaven api. Written with C++/CLR, only 0.5 MB and have a GUI.

WHaven Wallpaper WHaven Wallpaper is a desktop wallpaper change program for change your wallpapers directly from wallhaven. Features You have a search

null 3 Dec 31, 2021