From 426eca8f2efa0de1c51f0cf3af118a049ecbb7c6 Mon Sep 17 00:00:00 2001 From: bakkeby Date: Wed, 7 Jul 2021 09:43:43 +0200 Subject: [PATCH] Adding proposed scrollback changes for sixel graphics ref. #30 --- patch/scrollback.c | 8 +++++++ patch/sixel_st.c | 24 +++++++++++++++++++++ patch/sixel_st.h | 3 ++- st.c | 53 +++++++++++++++++++++++++++++----------------- x.c | 3 ++- 5 files changed, 69 insertions(+), 22 deletions(-) diff --git a/patch/scrollback.c b/patch/scrollback.c index 71a1854..e97f21b 100644 --- a/patch/scrollback.c +++ b/patch/scrollback.c @@ -14,6 +14,10 @@ kscrolldown(const Arg* a) selscroll(0, -n); tfulldirt(); } + + #if SIXEL_PATCH + scroll_images(-1*n); + #endif // SIXEL_PATCH } void @@ -28,4 +32,8 @@ kscrollup(const Arg* a) selscroll(0, n); tfulldirt(); } + + #if SIXEL_PATCH + scroll_images(n); + #endif // SIXEL_PATCH } diff --git a/patch/sixel_st.c b/patch/sixel_st.c index 10b0b98..ed64fee 100644 --- a/patch/sixel_st.c +++ b/patch/sixel_st.c @@ -15,4 +15,28 @@ dcshandle(void) term.mode |= MODE_SIXEL; break; } +} + +void +scroll_images(int n) { + ImageList *im; + int tmp; + + /* maximum sixel distance in lines from current view before + * deallocation + * TODO: should be in config.h */ + int max_sixel_distance = 10000; + + for (im = term.images; im; im = im->next) { + im->y += n; + + /* check if the current sixel has exceeded the maximum + * draw distance, and should therefore be deleted */ + tmp = im->y; + if (tmp < 0) { tmp = tmp * -1; } + if (tmp > max_sixel_distance) { + fprintf(stderr, "im@0x%08x exceeded maximum distance\n"); + im->should_delete = 1; + } + } } \ No newline at end of file diff --git a/patch/sixel_st.h b/patch/sixel_st.h index 0d4febc..cf2f0e1 100644 --- a/patch/sixel_st.h +++ b/patch/sixel_st.h @@ -1 +1,2 @@ -static void dcshandle(void); \ No newline at end of file +static void dcshandle(void); +static void scroll_images(int n); \ No newline at end of file diff --git a/st.c b/st.c index b4d5b33..ebda730 100644 --- a/st.c +++ b/st.c @@ -1399,9 +1399,6 @@ tscrolldown(int orig, int n) #endif // VIM_BROWSE_PATCH int i; Line temp; - #if SIXEL_PATCH - ImageList *im; - #endif // SIXEL_PATCH LIMIT(n, 0, term.bot-orig+1); @@ -1424,12 +1421,7 @@ tscrolldown(int orig, int n) } #if SIXEL_PATCH - for (im = term.images; im; im = im->next) { - if (im->y < term.bot) - im->y += n; - if (im->y > term.bot) - im->should_delete = 1; - } + scroll_images(n); #endif // SIXEL_PATCH #if SCROLLBACK_PATCH @@ -1453,9 +1445,6 @@ tscrollup(int orig, int n) #endif // VIM_BROWSE_PATCH int i; Line temp; - #if SIXEL_PATCH - ImageList *im; - #endif // SIXEL_PATCH LIMIT(n, 0, term.bot-orig+1); @@ -1481,12 +1470,7 @@ tscrollup(int orig, int n) } #if SIXEL_PATCH - for (im = term.images; im; im = im->next) { - if (im->y+im->height/win.ch > term.top) - im->y -= n; - if (im->y+im->height/win.ch < term.top) - im->should_delete = 1; - } + scroll_images(-1 * n); #endif // SIXEL_PATCH #if SCROLLBACK_PATCH @@ -2106,6 +2090,9 @@ csihandle(void) { char buf[40]; int len; + #if SIXEL_PATCH + ImageList *im; + #endif // SIXEL_PATCH switch (csiescseq.mode[0]) { default: @@ -2201,6 +2188,16 @@ csihandle(void) tputtab(csiescseq.arg[0]); break; case 'J': /* ED -- Clear screen */ + + #if SIXEL_PATCH + /* purge sixels */ + /* TODO: kinda gross, should probably make this only purge + * visible sixels */ + for (im = term.images; im; im = im->next) { + im->should_delete = 1; + } + #endif // SIXEL_PATCH + switch (csiescseq.arg[0]) { case 0: /* below */ tclearregion(term.c.x, term.c.y, term.col-1, term.c.y); @@ -2237,7 +2234,9 @@ csihandle(void) break; case 'S': /* SU -- Scroll line up */ DEFAULT(csiescseq.arg[0], 1); - #if SCROLLBACK_PATCH + #if SIXEL_PATCH && SCROLLBACK_PATCH + tscrollup(term.top, csiescseq.arg[0], 1); + #elif SCROLLBACK_PATCH tscrollup(term.top, csiescseq.arg[0], 0); #else tscrollup(term.top, csiescseq.arg[0]); @@ -2245,7 +2244,9 @@ csihandle(void) break; case 'T': /* SD -- Scroll line down */ DEFAULT(csiescseq.arg[0], 1); - #if SCROLLBACK_PATCH + #if SIXEL_PATCH && SCROLLBACK_PATCH + tscrolldown(term.top, csiescseq.arg[0], 1); + #elif SCROLLBACK_PATCH tscrolldown(term.top, csiescseq.arg[0], 0); #else tscrolldown(term.top, csiescseq.arg[0]); @@ -2308,6 +2309,12 @@ csihandle(void) case 'u': /* DECRC -- Restore cursor position (ANSI.SYS) */ tcursor(CURSOR_LOAD); break; + #if SIXEL_PATCH + case 't': + /* TODO should probably not be hard-coded */ + ttywrite(";420;720t", 10, 1); + break; + #endif // SIXEL_PATCH case ' ': switch (csiescseq.mode[1]) { case 'q': /* DECSCUSR -- Set Cursor Style */ @@ -2404,6 +2411,9 @@ strhandle(void) else redraw(); break; + #elif SIXEL_PATCH + ttywrite("10;rgb:0000/0000/0000", 21, 1); + return; #endif // OSC_10_11_12_2_PATCH case 11: /* background set */ #if OSC_10_11_12_2_PATCH @@ -2416,6 +2426,9 @@ strhandle(void) else redraw(); break; + #elif SIXEL_PATCH + ttywrite("11;rgb:ffff/ffff/ffff", 21, 1); + return; #endif // OSC_10_11_12_2_PATCH case 12: /* cursor color */ #if OSC_10_11_12_2_PATCH diff --git a/x.c b/x.c index 2767045..6c8e165 100644 --- a/x.c +++ b/x.c @@ -2028,8 +2028,9 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) g.bg = defaultrcs; } else { #if DYNAMIC_CURSOR_COLOR_PATCH + unsigned int tmpcol = g.bg; g.bg = g.fg; - g.fg = defaultbg; + g.fg = tmpcol; #else g.fg = defaultbg; g.bg = defaultcs;