nano-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]