Releases: dankamongmen/notcurses
v3.0.11—the frogurt is also cursed
the helpful Homebrew people pointed out in #2795 that i am deeply stupid. this is definitely 3.0.11, not 3.0.10 that thinks it's 3.10.0. please don't use 3.10.0. thanks @bevanjkay, who will presumably now be claimed as a contributor.
also, since it's kinda 311, https://www.youtube.com/watch?v=BsU_BwhPK7k
v3.0.10—panda panda panda panda panda
first release since april 2022! we're still here, bitches.
alright, so i pretty much ignored this project for 30 months while doing other shit--built a gigantic app at work built around XDP and @axboe's magnificent io_uring, topics regarding which i am now expert, but which had very little to do with terminal semigraphics. i also wrote and published my first novel, which everyone ought purchase, read, and give as gifts, but it too had very little bearing on notcurses. i felt really bad whenever i ignored a notification mail...but only until i got distracted, and there were many distractions. it makes me almost think that perhaps it's time for a comaintainer. we'll see. feel free to suggest yourself if you have contributions to notcurses, or can point at a largish thing you've written using it.
anyway, i was hesitant to release, because i have a vague sense that there have been regressions (primarily in the non-fullscreen paradigm) since...a few releases ago? but i haven't had the time to properly investigate this. and meanwhile real fixes were blocked up, and eventually debian/fedora forced my hand due to ffmpeg 7.0 updates. so that's the realpolitik motivation for this release.
but it's also good to show the world we're still active.
i was heartened: no release for 30 months, yet i ran tools/release.sh
and everything worked beautifully, running like a gentle wind, right up until the point we hit python when it exploded like agitated diarrhea for reasons i don't and will never give a shit about and now i'm trying to recover my pypi account which is mysteriously dysfunctional and i hate this language and all its practitioners and would like to go to some major python conference and just start throwing fucking People's Elbows like my Samoan brother The Rock. alas, it would almost certainly violate the CoC. i guess that's why they have those things. note that notcurses has no CoC, and should you approach me in the street, feeling froggy and like you want to jump up on it, i will represent and whoop your ass word is bond, but certainly not reject your patches. i'm not sure how the two are related.
anyway, i hope to dig into this over the next few months. butttttttttttttttttttttttttt i'm not promising anything! hack on everybody.
update: apparently tagging axboe marked him a contributor to this release, which he was not, though he'd certainly be welcome were he to show up and sling some VT code. sorry about the falsehood, argh.
v3.0.9—spacelord
by far the longest time between Notcurses releases, and there's not very much here, save a nasty infinite loop discovered and fixed by @drewt. is this project dead? let me answer that with dmx:
hell no this project isn't dead, but this project has achieved most of its primary goals, and i don't intend to move on longer-term, more speculative ones until next spring (2023) at the earliest. gotta make that paper in the meantime, and i'm deeply embroiled in the shit at work, keeping the satellites doing what they do best and generally doing the do as it's done. but this bugfix release did feel warranted.
ALSO, regarding inability to build against the most recent doctest 2.4.9, yeah it totally fucking sucks. it's a bug in doctest, and it was fixed months ago, and we just haven't had a new doctest release. I've asked for one; we'll see. Ugh. this isn't really something we can work around easily, and there's no reason i can see for doctest not dropping a fixed 2.4.10. if this continues, i might have to rethink reliance on doctest... =\
anyway! here you go, ya filthy animals
v3.0.8—spit it once, refuel reenergize and rewind
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.
v3.0.7—annnnd we're back
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 callnotcurses_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 callnotcurses_render()
. This means you can just dump output to a scrolling standard plane, and not worry about anything except a finalnotcurses_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.
v3.0.6—spinal meningitis got me down
- Fix empty output when
ncplane_puttext()
is used withNCALIGN_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 withCMAKE_BUILD_TYPE=Debug
orNDEBUG
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.
v3.0.5—the district sleeps alone tonight
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
v3.0.4—metal fingers in my body
[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 tonotcurses-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.
v3.0.3—true to form
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.
v3.0.2—hold your mouth for the war
- General blending: default colors and palette-indexed colors can now be blended along with RGB colors (#2433, #2442)
ncplayer -k
and thenotcurses-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)
- Results in colors being properly preserved from
- When libdeflate is unavailable, use zlib for kitty graphics (#2423)
- Avoid lockup when redirecting input from a small file (#2496)
- Resolves dankamongmen/growlight#153...
- ...and thus https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=997845
- Call
nccell_release()
on cells lost toncplane_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 forncls
(dereference symlinks) (#2006) - Don't
assert()
out ofncneofetch
when lacking a logo (#2494) - New binary
tfman
, a man page browser alaman(1)
. Experimental.