nano-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/2] display: an attempt to support the scroll bar also with --so


From: Benno Schulenberg
Subject: [PATCH 2/2] display: an attempt to support the scroll bar also with --softwrap
Date: Mon, 11 May 2020 19:35:50 +0200

From: Marco Diego Aurélio Mesquita <address@hidden>

Signed-off-by: Benno Schulenberg <address@hidden>
---
 src/cut.c   |  5 +++--
 src/files.c |  5 +++--
 src/nano.c  | 31 ++++++++++++++++++++++++-------
 src/nano.h  |  4 ++++
 src/winio.c | 11 ++++++++++-
 5 files changed, 44 insertions(+), 12 deletions(-)

diff --git a/src/cut.c b/src/cut.c
index fbc145c3..4de93467 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 &&
-                               number_of_chunks_in(openfile->current) != 
old_amount)
+       if (ISSET(SOFTWRAP) && number_of_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 a392ba67..8c4fdee2 100644
--- a/src/files.c
+++ b/src/files.c
@@ -537,9 +537,10 @@ void redecorate_after_switch(void)
        /* While in a different buffer, the screen may have been resized
         * or softwrap mode maybe have been toggled, so make sure that the
         * starting column for the first row gets an appropriate value. */
-       if (ISSET(SOFTWRAP))
+       if (ISSET(SOFTWRAP)) {
                ensure_firstcolumn_is_aligned();
-       else
+               renumber_from(openfile->filetop);
+       } else
                openfile->firstcolumn = 0;
 #endif
 
diff --git a/src/nano.c b/src/nano.c
index a30ec912..ad0edf67 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -76,6 +76,8 @@ linestruct *make_new_node(linestruct *prevnode)
 #endif
        newnode->lineno = (prevnode) ? prevnode->lineno + 1 : 1;
 #ifndef NANO_TINY
+       newnode->chunk_nr = (prevnode) ?
+                                       prevnode->chunk_nr + 
number_of_chunks_in(prevnode) + 1 : 1;
        newnode->has_anchor = FALSE;
 #endif
 
@@ -151,6 +153,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 +189,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 +
+                                                                       
number_of_chunks_in(line->prev) + 1;
+#endif
                line = line->next;
        }
 }
@@ -1038,7 +1054,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 +1098,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 +1501,7 @@ void inject(char *burst, size_t count)
        if (ISSET(SOFTWRAP) && ((openfile->current_y == editwinrows - 1 &&
                                chunk_for(xplustabs(), openfile->current) > 
original_row) ||
                                number_of_chunks_in(openfile->current) != 
old_amount)) {
+               renumber_from(openfile->current);
                refresh_needed = TRUE;
                focusing = FALSE;
        }
@@ -2285,7 +2302,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 a6db4679..c1936802 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 292e38c7..f206bf21 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 +
+                                                       
number_of_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]