[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/4 V7] display: support the scroll bar also when --softwrap is u
From: |
Benno Schulenberg |
Subject: |
[PATCH 2/4 V7] display: support the scroll bar also when --softwrap is used |
Date: |
Thu, 28 May 2020 11:07:27 +0200 |
From: Marco Diego Aurélio Mesquita <marcodiegomesquita@gmail.com>
A new member ('chunk_nr') is added to each 'linestruct', to store
the serial number of the first chunk of that line, so that, when
softwrap is on, the scroll-bar thing can be computed relative to
chunks instead of relative to actual lines.
To guarantee that 'chunk_nr' is correctly synced, the buffer is
renumbered whenever the number of chunks in a line changes, and
also when softwrap is toggled on, and when buffers are switched.
Signed-off-by: Marco Diego Aurélio Mesquita <marcodiegomesquita@gmail.com>
Signed-off-by: Benno Schulenberg <bensberg@telfort.nl>
---
src/cut.c | 8 +++++---
src/files.c | 3 +++
src/nano.c | 22 +++++++++++++++++++++-
src/nano.h | 4 ++++
src/winio.c | 11 ++++++++++-
5 files changed, 43 insertions(+), 5 deletions(-)
diff --git a/src/cut.c b/src/cut.c
index 435a9919..b4b2acf0 100644
--- a/src/cut.c
+++ b/src/cut.c
@@ -52,10 +52,12 @@ void do_deletion(undo_type action)
&openfile->current->data[openfile->current_x + charlen],
line_len - charlen + 1);
#ifndef NANO_TINY
- /* If the number of screen rows that a softwrapped line occupies
- * has changed, we need a full refresh. */
- if (ISSET(SOFTWRAP) && extra_chunks_in(openfile->current) !=
old_amount)
+ /* When softwrapping and the number of chunks in the current
line has
+ * changed, the chunks must be renumbered and the screen
refreshed. */
+ if (ISSET(SOFTWRAP) && extra_chunks_in(openfile->current) !=
old_amount) {
+ renumber_from(openfile->current);
refresh_needed = TRUE;
+ }
/* Adjust the mark if it is after the cursor on the current
line. */
if (openfile->mark == openfile->current &&
diff --git a/src/files.c b/src/files.c
index 1d183818..7a590d58 100644
--- a/src/files.c
+++ b/src/files.c
@@ -527,6 +527,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 159a8dc9..497c6c24 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;
}
}
@@ -1084,7 +1101,9 @@ void do_toggle(int flag)
signal_init();
break;
case SOFTWRAP:
- if (!ISSET(SOFTWRAP))
+ if (ISSET(SOFTWRAP))
+ renumber_from(openfile->filetop);
+ else
openfile->firstcolumn = 0;
thebar = (LINES > 5 && COLS > 9) ? 1 : 0;
bardata = nrealloc(bardata, LINES * sizeof(int));
@@ -1485,6 +1504,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;
}
diff --git a/src/nano.h b/src/nano.h
index 745b2b5a..75ad30e4 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