From 91dfb487ad20f172b0f025cc58ef55ed3a0d34f9 Mon Sep 17 00:00:00 2001 From: nick black Date: Sun, 15 Aug 2021 21:59:00 -0400 Subject: [PATCH] remove support for the iTerm2 graphics protocol #2060 --- NEWS.md | 3 + TERMINALS.md | 2 +- doc/man/man1/notcurses-info.1.md | 9 ++- src/info/main.c | 2 - src/lib/iterm.c | 101 ------------------------------- src/lib/sprite.h | 6 -- src/lib/termdesc.c | 22 ------- 7 files changed, 8 insertions(+), 137 deletions(-) delete mode 100644 src/lib/iterm.c diff --git a/NEWS.md b/NEWS.md index 3a35409d2..77f37d60a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -7,6 +7,9 @@ rearrangements of Notcurses. deprecated for ABI3. New code ought not be written using it. * Added `ncplane_scrollup()` and `ncplane_scrollup_child()`. * Fixed grotesque errors in `ncplane_set_*_palindex()`. + * Removed support for the iTerm2 graphics protocol, which is unsuitable for + the Notcurses model. macOS users who want graphics are recommended to use + Kitty or WezTerm. It will be added back if it gains necessary capabilities. * 2.3.13 (2021-08-04) * Added the portable utility functions `notcurses_accountname()` and diff --git a/TERMINALS.md b/TERMINALS.md index 71eda4594..833aa2f6d 100644 --- a/TERMINALS.md +++ b/TERMINALS.md @@ -118,7 +118,7 @@ Color Erase) capability, but Notcurses never relies on `bce` behavior. ### WezTerm WezTerm [implements](https://wezfurlong.org/wezterm/escape-sequences.html) some -interesting underline options, and the iTerm2 graphic protocol. +interesting underline options, and both the Sixel and Kitty graphic protocols. ### GNU screen diff --git a/doc/man/man1/notcurses-info.1.md b/doc/man/man1/notcurses-info.1.md index d64008d61..07574e042 100644 --- a/doc/man/man1/notcurses-info.1.md +++ b/doc/man/man1/notcurses-info.1.md @@ -76,11 +76,10 @@ The next five lines describe properties of the terminal environment: * The fifth line describes the available bitmap graphics. If Sixels are available, the maximum number of color registers and maximum Sixel - geometry are reported. If the iTerm2 protocol or Linux framebuffer graphics - are available, that is reported. If the Kitty graphics protocol is - detected, that will be reported with "rgba graphics are available"; if - Kitty's animation support is also present, that will be reported with - "rgba pixel animation support". + geometry are reported. If Linux framebuffer graphics are available, that is + reported. If the Kitty graphics protocol is detected, that will be reported + with "rgba graphics are available"; if Kitty's animation support is also + present, that will be reported with "rgba pixel animation support". The final eleven lines, only printed when in a UTF8 locale, show various Unicode glyphs. The first four lines include the quadrant, sextant, and diff --git a/src/info/main.c b/src/info/main.c index 960db5cc9..00f6292b8 100644 --- a/src/info/main.c +++ b/src/info/main.c @@ -353,8 +353,6 @@ tinfo_debug_bitmaps(struct ncplane* n, const tinfo* ti, const char* indent){ } }else if(ti->pixel_draw_late){ ncplane_printf(n, "%sframebuffer graphics supported", indent); - }else if(ti->pixel_move == NULL){ - ncplane_printf(n, "%siTerm2 graphics support", indent); }else if(ti->sixel_maxy_pristine){ ncplane_printf(n, "%srgba pixel graphics support", indent); }else{ diff --git a/src/lib/iterm.c b/src/lib/iterm.c deleted file mode 100644 index 3093bc1ac..000000000 --- a/src/lib/iterm.c +++ /dev/null @@ -1,101 +0,0 @@ -// the iterm2 graphics protocol is based entirely around containerized formats -// https://iterm2.com/documentation-images.html - -#include -#include "internal.h" -#include "termdesc.h" -#include "sprite.h" -#include "fbuf.h" -#include "png.h" - -// yank a cell out of the PNG by setting all of its alphas to 0. the alphas -// will be preserved in the auxvec. -int iterm_wipe(sprixel* s, int ycell, int xcell){ - (void)s; // FIXME - (void)ycell; - (void)xcell; - return -1; -} - -// build a cell of the PNG back up by copying auxvec alphas to it. -int iterm_rebuild(sprixel* s, int ycell, int xcell, uint8_t* auxvec){ - (void)s; // FIXME - (void)ycell; - (void)xcell; - (void)auxvec; - return -1; -} - -// spit out the control sequence and data. -int iterm_draw(const tinfo* ti, const ncpile *p, sprixel* s, fbuf* f, int y, int x){ - (void)ti; - if(p){ - if(goto_location(p->nc, f, y, x)){ - return -1; - } - } - if(fbuf_putn(f, s->glyph.buf, s->glyph.used) < 0){ - return -1; - } - return s->glyph.used; -} - -static int -write_iterm_graphic(tament* tam, const void* data, int leny, int stride, int lenx, fbuf *f){ - if(fbuf_puts(f, "\e]1337;File=inline=1:") < 0){ - return -1; - } - if(write_png_b64(tam, data, leny, stride, lenx, f)){ - return -1; - } - if(fbuf_puts(f, "\x1b\\") < 0){ - return -1; - } - return 0; -} - -// create an iterm2 control sequence complete with base64-encoded PNG. -int iterm_blit(ncplane* n, int linesize, const void* data, - int leny, int lenx, const blitterargs* bargs){ - int cols = bargs->u.pixel.spx->dimx; - int rows = bargs->u.pixel.spx->dimy; - sprixel* s = bargs->u.pixel.spx; - tament* tam = NULL; - bool reuse = false; - // if we have a sprixel attached to this plane, see if we can reuse it - // (we need the same dimensions) and thus immediately apply its T-A table. - if(n->tam){ - if(n->leny == rows && n->lenx == cols){ - tam = n->tam; - reuse = true; - } - } - int parse_start = 0; - if(!reuse){ - tam = malloc(sizeof(*tam) * rows * cols); - if(tam == NULL){ - return -1; - } - memset(tam, 0, sizeof(*tam) * rows * cols); - } - if(fbuf_init(&s->glyph)){ - free(tam); - return -1; - } - if(write_iterm_graphic(tam, data, leny, linesize, lenx, &s->glyph)){ - if(!reuse){ - free(tam); - } - fbuf_free(&s->glyph); - return -1; - } - scrub_tam_boundaries(tam, leny, lenx, s->cellpxy, s->cellpxx); - if(plane_blit_sixel(s, &s->glyph, leny, lenx, parse_start, tam) < 0){ - if(!reuse){ - free(tam); - } - fbuf_free(&s->glyph); - return -1; - } - return 1; -} diff --git a/src/lib/sprite.h b/src/lib/sprite.h index f779f8a33..5560f3e90 100644 --- a/src/lib/sprite.h +++ b/src/lib/sprite.h @@ -166,11 +166,9 @@ int kitty_wipe(sprixel* s, int ycell, int xcell); int kitty_wipe_animation(sprixel* s, int ycell, int xcell); int kitty_wipe_selfref(sprixel* s, int ycell, int xcell); // wipes out a cell by changing the alpha value throughout the PNG cell to 0. -int iterm_wipe(sprixel* s, int ycell, int xcell); int fbcon_wipe(sprixel* s, int ycell, int xcell); int sixel_rebuild(sprixel* s, int ycell, int xcell, uint8_t* auxvec); int kitty_rebuild(sprixel* s, int ycell, int xcell, uint8_t* auxvec); -int iterm_rebuild(sprixel* s, int ycell, int xcell, uint8_t* auxvec); int fbcon_rebuild(sprixel* s, int ycell, int xcell, uint8_t* auxvec); int kitty_rebuild_animation(sprixel* s, int ycell, int xcell, uint8_t* auxvec); int kitty_rebuild_selfref(sprixel* s, int ycell, int xcell, uint8_t* auxvec); @@ -178,8 +176,6 @@ int sixel_draw(const tinfo* ti, const struct ncpile *p, sprixel* s, fbuf* f, int y, int x); int kitty_draw(const tinfo* ti, const struct ncpile *p, sprixel* s, fbuf* f, int y, int x); -int iterm_draw(const tinfo* ti, const struct ncpile *p, sprixel* s, - fbuf* f, int y, int x); int kitty_move(sprixel* s, fbuf* f, unsigned noscroll); int sixel_scrub(const struct ncpile* p, sprixel* s); int kitty_scrub(const struct ncpile* p, sprixel* s); @@ -197,8 +193,6 @@ int sixel_blit(struct ncplane* nc, int linesize, const void* data, int leny, int lenx, const struct blitterargs* bargs); int kitty_blit(struct ncplane* nc, int linesize, const void* data, int leny, int lenx, const struct blitterargs* bargs); -int iterm_blit(struct ncplane* nc, int linesize, const void* data, - int leny, int lenx, const struct blitterargs* bargs); int kitty_blit_animated(struct ncplane* n, int linesize, const void* data, int leny, int lenx, const struct blitterargs* bargs); int kitty_blit_selfref(struct ncplane* nc, int linesize, const void* data, diff --git a/src/lib/termdesc.c b/src/lib/termdesc.c index 2ab70cfd5..cdc5a56ba 100644 --- a/src/lib/termdesc.c +++ b/src/lib/termdesc.c @@ -67,27 +67,6 @@ setup_sixel_bitmaps(tinfo* ti, int fd, bool invert80){ sprite_init(ti, fd); } -// iterm2 has a container-based protocol -static inline void -setup_iterm_bitmaps(tinfo* ti, int fd){ - ti->pixel_init = NULL; - ti->pixel_shutdown = NULL; - ti->pixel_remove = NULL; - // be awarre: absence of pixel_move plus absence of sixel details is used by - // notcurses-info to determine iTerm2 support. - ti->pixel_move = NULL; - ti->color_registers = 0; - ti->pixel_scrub = sixel_scrub; - ti->pixel_scroll = NULL; - ti->pixel_draw = iterm_draw; - ti->pixel_draw_late = NULL; - ti->pixel_wipe = iterm_wipe; - ti->pixel_rebuild = iterm_rebuild; - ti->pixel_trans_auxvec = kitty_trans_auxvec; - set_pixel_blitter(iterm_blit); - sprite_init(ti, fd); -} - // kitty 0.19.3 didn't have C=1, and thus needs sixel_maxy_pristine. it also // lacked animation, and must thus redraw the complete image every time it // changes. requires the older interface. @@ -578,7 +557,6 @@ apply_term_heuristics(tinfo* ti, const char* termname, queried_terminals_e qterm } ti->caps.quadrants = true; ti->caps.rgb = true; - setup_iterm_bitmaps(ti, ti->ttyfd); }else if(qterm == TERMINAL_APPLE){ termname = "Terminal.app"; // no quadrants, no sextants, no rgb, but it does have braille