diff options
Diffstat (limited to 'gnu/packages/patches/rxvt-unicode-fix-cursor-position.patch')
-rw-r--r-- | gnu/packages/patches/rxvt-unicode-fix-cursor-position.patch | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/gnu/packages/patches/rxvt-unicode-fix-cursor-position.patch b/gnu/packages/patches/rxvt-unicode-fix-cursor-position.patch new file mode 100644 index 0000000000..1905c4ccf6 --- /dev/null +++ b/gnu/packages/patches/rxvt-unicode-fix-cursor-position.patch @@ -0,0 +1,79 @@ +Fix a bug that causes the cursor position to be incorrect when opening +new terminals: + +http://lists.schmorp.de/pipermail/rxvt-unicode/2023q1/002639.html +https://bugs.archlinux.org/task/77062 +https://gitlab.alpinelinux.org/alpine/aports/-/issues/14525 + +This patches reverts all changes made to 'src/screen.C' in rxvt-unicode 9.31. + +--- rxvt-unicode-9.31/src/screen.C 2022-08-08 06:33:08.000000000 -0400 ++++ rxvt-unicode-9.30/src/screen.C 2021-07-02 23:55:47.000000000 -0400 +@@ -293,7 +293,6 @@ + + int common_col = min (prev_ncol, ncol); + +- // resize swap_buf, blank drawn_buf + for (int row = min (nrow, prev_nrow); row--; ) + { + scr_blank_screen_mem (drawn_buf [row], DEFAULT_RSTYLE); +@@ -307,7 +306,6 @@ + int pend = MOD (term_start + top_row , prev_total_rows); + int q = total_rows; // rewrapped row + +-#if ENABLE_FRILLS + if ((rewrap_always || top_row) && !rewrap_never) + { + // Re-wrap lines. This is rather ugly, possibly because I am too dumb +@@ -389,35 +387,36 @@ + scr_blank_line (*qline, qline->l, ncol - qline->l, DEFAULT_RSTYLE); + } + while (p != pend && q > 0); ++ ++ term_start = total_rows - nrow; ++ top_row = q - term_start; ++ ++ // make sure all terminal lines exist ++ while (top_row > 0) ++ scr_blank_screen_mem (ROW (--top_row), DEFAULT_RSTYLE); + } + else +-#endif + { +- // wing, instead of wrap +- screen.cur.row += nrow - prev_nrow; ++ // if no scrollback exists (yet), wing, instead of wrap + +- do ++ for (int row = min (nrow, prev_nrow); row--; ) + { +- p = MOD (p - 1, prev_total_rows); +- q--; ++ line_t &src = prev_row_buf [MOD (term_start + row, prev_total_rows)]; ++ line_t &dst = row_buf [row]; + +- copy_line (row_buf [q], prev_row_buf [p]); ++ copy_line (dst, src); + } +- while (p != pend && q > 0); +- } + +- term_start = total_rows - nrow; +- top_row = q - term_start; ++ for (int row = prev_nrow; row < nrow; row++) ++ scr_blank_screen_mem (row_buf [row], DEFAULT_RSTYLE); + +- // make sure all terminal lines exist +- while (top_row > 0) +- scr_blank_screen_mem (ROW (--top_row), DEFAULT_RSTYLE); ++ term_start = 0; ++ } + + clamp_it (screen.cur.row, 0, nrow - 1); + clamp_it (screen.cur.col, 0, ncol - 1); + } + +- // ensure drawn_buf, swap_buf and terminal rows are all initialized + for (int row = nrow; row--; ) + { + if (!ROW (row).valid ()) scr_blank_screen_mem (ROW (row), DEFAULT_RSTYLE); |