[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/2 V5] display: an attempt to support the scroll bar also with -
From: |
Benno Schulenberg |
Subject: |
[PATCH 2/2 V5] display: an attempt to support the scroll bar also with --softwrap |
Date: |
Wed, 13 May 2020 14:18:34 +0200 |
From: Marco Diego Aurélio Mesquita <address@hidden>
V5: Updated for changes in current git.
Signed-off-by: Benno Schulenberg <address@hidden>
---
src/cut.c | 5 +++--
src/files.c | 3 +++
src/nano.c | 32 +++++++++++++++++++++++++-------
src/nano.h | 4 ++++
src/winio.c | 11 ++++++++++-
5 files changed, 45 insertions(+), 10 deletions(-)
diff --git a/src/cut.c b/src/cut.c
index bce06d68..3a7805d7 100644
--- a/src/cut.c
+++ b/src/cut.c
@@ -106,9 +106,10 @@ void do_deletion(undo_type action)
/* If the number of screen rows that a softwrapped line occupies
* has changed, we need a full refresh. */
- if (ISSET(SOFTWRAP) && refresh_needed == FALSE &&
- extra_chunks_in(openfile->current) !=
old_amount)
+ if (ISSET(SOFTWRAP) && extra_chunks_in(openfile->current) !=
old_amount) {
+ renumber_from(openfile->current);
refresh_needed = TRUE;
+ }
#endif
set_modified();
diff --git a/src/files.c b/src/files.c
index 1a6cbc05..34085423 100644
--- a/src/files.c
+++ b/src/files.c
@@ -538,6 +538,9 @@ void redecorate_after_switch(void)
* or softwrap mode may have been toggled, so make sure that the
* starting column for the first row gets an appropriate value. */
ensure_firstcolumn_is_aligned();
+
+ if (ISSET(SOFTWRAP))
+ renumber_from(openfile->filetop);
#endif
/* Update title bar and multiline info to match the current buffer. */
diff --git a/src/nano.c b/src/nano.c
index e5cf4f8a..7c31777a 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -76,6 +76,9 @@ linestruct *make_new_node(linestruct *prevnode)
#endif
newnode->lineno = (prevnode) ? prevnode->lineno + 1 : 1;
#ifndef NANO_TINY
+ if (ISSET(SOFTWRAP))
+ newnode->chunk_nr = (prevnode) ?
+ prevnode->chunk_nr +
extra_chunks_in(prevnode) + 1 : 1;
newnode->has_anchor = FALSE;
#endif
@@ -151,6 +154,7 @@ linestruct *copy_node(const linestruct *src)
#endif
dst->lineno = src->lineno;
#ifndef NANO_TINY
+ dst->chunk_nr = src->chunk_nr;
dst->has_anchor = FALSE;
#endif
@@ -186,8 +190,21 @@ void renumber_from(linestruct *line)
{
ssize_t number = (line->prev == NULL) ? 0 : line->prev->lineno;
+#ifndef NANO_TINY
+ if (ISSET(SOFTWRAP) && line->prev == NULL) {
+ line->lineno = ++number;
+ line->chunk_nr = 1;
+ line = line->next;
+ }
+#endif
+
while (line != NULL) {
line->lineno = ++number;
+#ifndef NANO_TINY
+ if (ISSET(SOFTWRAP))
+ line->chunk_nr = line->prev->chunk_nr +
+
extra_chunks_in(line->prev) + 1;
+#endif
line = line->next;
}
}
@@ -1038,7 +1055,7 @@ void regenerate_screen(void)
LINES = win.ws_row;
#endif
#ifndef NANO_TINY
- thebar = (LINES > 5 && COLS > 9 && !ISSET(SOFTWRAP)) ? 1 : 0;
+ thebar = (LINES > 5 && COLS > 9) ? 1 : 0;
bardata = nrealloc(bardata, LINES * sizeof(int));
#endif
editwincols = COLS - margin - thebar;
@@ -1082,12 +1099,12 @@ void do_toggle(int flag)
signal_init();
break;
case SOFTWRAP:
- if (!ISSET(SOFTWRAP)) {
- thebar = (LINES > 5 && COLS > 9) ? 1 : 0;
- bardata = nrealloc(bardata, LINES *
sizeof(int));
+ if (ISSET(SOFTWRAP))
+ renumber_from(openfile->filetop);
+ else
openfile->firstcolumn = 0;
- } else
- thebar = 0;
+ thebar = (LINES > 5 && COLS > 9) ? 1 : 0;
+ bardata = nrealloc(bardata, LINES * sizeof(int));
editwincols = COLS - margin - thebar;
refresh_needed = TRUE;
break;
@@ -1485,6 +1502,7 @@ void inject(char *burst, size_t count)
if (ISSET(SOFTWRAP) && ((openfile->current_y == editwinrows - 1 &&
chunk_for(xplustabs(), openfile->current) >
original_row) ||
extra_chunks_in(openfile->current) !=
old_amount)) {
+ renumber_from(openfile->current);
refresh_needed = TRUE;
focusing = FALSE;
}
@@ -2285,7 +2303,7 @@ int main(int argc, char **argv)
curs_set(0);
#ifndef NANO_TINY
- thebar = (LINES > 5 && COLS > 9 && !ISSET(SOFTWRAP)) ? 1 : 0;
+ thebar = (LINES > 5 && COLS > 9) ? 1 : 0;
bardata = nrealloc(bardata, LINES * sizeof(int));
#endif
editwincols = COLS - thebar;
diff --git a/src/nano.h b/src/nano.h
index a54082e1..d9950113 100644
--- a/src/nano.h
+++ b/src/nano.h
@@ -284,6 +284,10 @@ typedef struct linestruct {
/* The text of this line. */
ssize_t lineno;
/* The number of this line. */
+#ifndef NANO_TINY
+ ssize_t chunk_nr;
+ /* The ordinal number of the first chunk in this line. */
+#endif
struct linestruct *next;
/* Next node. */
struct linestruct *prev;
diff --git a/src/winio.c b/src/winio.c
index 6a9fa04b..3765e65c 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -2968,7 +2968,16 @@ bool less_than_a_screenful(size_t was_lineno, size_t
was_leftedge)
void draw_scrollbar(void)
{
int totalrows = openfile->filebot->lineno;
- int lowest = ((openfile->edittop->lineno - 1) * editwinrows) /
totalrows;
+ int first_row = openfile->edittop->lineno;
+
+ if (ISSET(SOFTWRAP)) {
+ totalrows = openfile->filebot->chunk_nr +
+
extra_chunks_in(openfile->filebot);
+ first_row = openfile->edittop->chunk_nr +
+
chunk_for(openfile->firstcolumn, openfile->edittop);
+ }
+
+ int lowest = ((first_row - 1) * editwinrows) / totalrows;
int highest = lowest + (editwinrows * editwinrows) / totalrows;
if (editwinrows > totalrows)
--
2.25.4