1From de7a1acf3168a35c19a569cc7f6f572c39e96c82 Mon Sep 17 00:00:00 2001
2From: Michael Forney <mforney@mforney.org>
3Date: Thu, 3 Jun 2021 00:32:57 -0700
4Subject: [PATCH] Don't wrap when adding past last line in non-scrolling window
5
6X/Open curses says
7
8> If scrolling is disabled, any characters that would extend beyond
9> the last column of the last line are truncated.
10
11However, currently libcurses wraps the cursor back to the beginning
12of the last line.
13
14To fix this, when we try to add a character that would go past the
15end of the last line, leave the cursor where it is. If the character
16goes exactly to the end of the last line, add the character but set
17the cursor to the last column (to match ncurses behavior).
18
19[0] https://pubs.opengroup.org/onlinepubs/7908799/xcurses/intov.html#tag_001_004_002_002
20---
21 lib/libcurses/addbytes.c | 20 +++++++++++---------
22 1 file changed, 11 insertions(+), 9 deletions(-)
23
24diff --git a/lib/libcurses/addbytes.c b/lib/libcurses/addbytes.c
25index 9fd917ca..e52dc310 100644
26--- a/lib/libcurses/addbytes.c
27+++ b/lib/libcurses/addbytes.c
28@@ -232,8 +232,6 @@ _cursesi_addbyte(WINDOW *win, __LINE **lp, int *y, int *x, int c,
29 #endif
30
31 if (char_interp && ((*lp)->flags & __ISPASTEOL)) {
32- *x = 0;
33- (*lp)->flags &= ~__ISPASTEOL;
34 if (*y == win->scr_b) {
35 #ifdef DEBUG
36 __CTRACE(__CTRACE_INPUT,
37@@ -246,6 +244,8 @@ _cursesi_addbyte(WINDOW *win, __LINE **lp, int *y, int *x, int c,
38 } else {
39 (*y)++;
40 }
41+ *x = 0;
42+ (*lp)->flags &= ~__ISPASTEOL;
43 *lp = win->alines[*y];
44 if (c == '\n')
45 return OK;
46@@ -341,8 +341,6 @@ _cursesi_addwchar(WINDOW *win, __LINE **lnp, int *y, int *x,
47 return OK;
48 case L'\n':
49 wclrtoeol(win);
50- *x = 0;
51- (*lnp)->flags &= ~__ISPASTEOL;
52 if (*y == win->scr_b) {
53 if (!(win->flags & __SCROLLOK))
54 return ERR;
55@@ -350,6 +348,8 @@ _cursesi_addwchar(WINDOW *win, __LINE **lnp, int *y, int *x,
56 } else {
57 (*y)++;
58 }
59+ *x = 0;
60+ (*lnp)->flags &= ~__ISPASTEOL;
61 return OK;
62 case L'\t':
63 cc.vals[0] = L' ';
64@@ -395,8 +395,6 @@ _cursesi_addwchar(WINDOW *win, __LINE **lnp, int *y, int *x,
65 }
66 /* check for new line first */
67 if (char_interp && ((*lnp)->flags & __ISPASTEOL)) {
68- *x = 0;
69- (*lnp)->flags &= ~__ISPASTEOL;
70 if (*y == win->scr_b) {
71 if (!(win->flags & __SCROLLOK))
72 return ERR;
73@@ -404,6 +402,8 @@ _cursesi_addwchar(WINDOW *win, __LINE **lnp, int *y, int *x,
74 } else {
75 (*y)++;
76 }
77+ *x = 0;
78+ (*lnp)->flags &= ~__ISPASTEOL;
79 (*lnp) = win->alines[*y];
80 lp = &win->alines[*y]->line[*x];
81 }
82@@ -459,7 +459,6 @@ _cursesi_addwchar(WINDOW *win, __LINE **lnp, int *y, int *x,
83 if (newx > *(*lnp)->lastchp)
84 *(*lnp)->lastchp = newx;
85 __touchline(win, *y, sx, (int) win->maxx - 1);
86- sx = *x = 0;
87 if (*y == win->scr_b) {
88 if (!(win->flags & __SCROLLOK))
89 return ERR;
90@@ -467,6 +466,7 @@ _cursesi_addwchar(WINDOW *win, __LINE **lnp, int *y, int *x,
91 } else {
92 (*y)++;
93 }
94+ sx = *x = 0;
95 lp = &win->alines[*y]->line[0];
96 (*lnp) = win->alines[*y];
97 }
98@@ -547,14 +547,16 @@ _cursesi_addwchar(WINDOW *win, __LINE **lnp, int *y, int *x,
99 if (newx > *(*lnp)->lastchp)
100 *(*lnp)->lastchp = newx;
101 __touchline(win, *y, sx, (int) win->maxx - 1);
102- *x = sx = 0;
103 if (*y == win->scr_b) {
104- if (!(win->flags & __SCROLLOK))
105+ if (!(win->flags & __SCROLLOK)) {
106+ *x = win->maxx - 1;
107 return ERR;
108+ }
109 scroll(win);
110 } else {
111 (*y)++;
112 }
113+ *x = sx = 0;
114 lp = &win->alines[*y]->line[0];
115 (*lnp) = win->alines[*y];
116 } else {
117--
1182.31.1
119