mirror of
git://git.sv.gnu.org/nano.git
synced 2024-11-26 14:51:36 +03:00
display: support the position indicator also when --softwrap is used
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>
This commit is contained in:
parent
b33a62af8c
commit
6bccedb319
@ -52,10 +52,12 @@ void do_deletion(undo_type action)
|
|||||||
&openfile->current->data[openfile->current_x + charlen],
|
&openfile->current->data[openfile->current_x + charlen],
|
||||||
line_len - charlen + 1);
|
line_len - charlen + 1);
|
||||||
#ifndef NANO_TINY
|
#ifndef NANO_TINY
|
||||||
/* If the number of screen rows that a softwrapped line occupies
|
/* When softwrapping and the number of chunks in the current line has
|
||||||
* has changed, we need a full refresh. */
|
* changed, the chunks must be renumbered and the screen refreshed. */
|
||||||
if (ISSET(SOFTWRAP) && extra_chunks_in(openfile->current) != old_amount)
|
if (ISSET(SOFTWRAP) && extra_chunks_in(openfile->current) != old_amount) {
|
||||||
|
renumber_from(openfile->current);
|
||||||
refresh_needed = TRUE;
|
refresh_needed = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Adjust the mark if it is after the cursor on the current line. */
|
/* Adjust the mark if it is after the cursor on the current line. */
|
||||||
if (openfile->mark == openfile->current &&
|
if (openfile->mark == openfile->current &&
|
||||||
|
22
src/nano.c
22
src/nano.c
@ -76,6 +76,9 @@ linestruct *make_new_node(linestruct *prevnode)
|
|||||||
#endif
|
#endif
|
||||||
newnode->lineno = (prevnode) ? prevnode->lineno + 1 : 1;
|
newnode->lineno = (prevnode) ? prevnode->lineno + 1 : 1;
|
||||||
#ifndef NANO_TINY
|
#ifndef NANO_TINY
|
||||||
|
if (ISSET(SOFTWRAP))
|
||||||
|
newnode->chunk_nr = (prevnode) ?
|
||||||
|
prevnode->chunk_nr + extra_chunks_in(prevnode) + 1 : 1;
|
||||||
newnode->has_anchor = FALSE;
|
newnode->has_anchor = FALSE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -151,6 +154,7 @@ linestruct *copy_node(const linestruct *src)
|
|||||||
#endif
|
#endif
|
||||||
dst->lineno = src->lineno;
|
dst->lineno = src->lineno;
|
||||||
#ifndef NANO_TINY
|
#ifndef NANO_TINY
|
||||||
|
dst->chunk_nr = src->chunk_nr;
|
||||||
dst->has_anchor = FALSE;
|
dst->has_anchor = FALSE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -186,8 +190,21 @@ void renumber_from(linestruct *line)
|
|||||||
{
|
{
|
||||||
ssize_t number = (line->prev == NULL) ? 0 : line->prev->lineno;
|
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) {
|
while (line != NULL) {
|
||||||
line->lineno = ++number;
|
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;
|
line = line->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1085,7 +1102,9 @@ void do_toggle(int flag)
|
|||||||
signal_init();
|
signal_init();
|
||||||
break;
|
break;
|
||||||
case SOFTWRAP:
|
case SOFTWRAP:
|
||||||
if (!ISSET(SOFTWRAP))
|
if (ISSET(SOFTWRAP))
|
||||||
|
renumber_from(openfile->filetop);
|
||||||
|
else
|
||||||
openfile->firstcolumn = 0;
|
openfile->firstcolumn = 0;
|
||||||
refresh_needed = TRUE;
|
refresh_needed = TRUE;
|
||||||
break;
|
break;
|
||||||
@ -1487,6 +1506,7 @@ void inject(char *burst, size_t count)
|
|||||||
if (ISSET(SOFTWRAP) && ((openfile->current_y == editwinrows - 1 &&
|
if (ISSET(SOFTWRAP) && ((openfile->current_y == editwinrows - 1 &&
|
||||||
chunk_for(xplustabs(), openfile->current) > original_row) ||
|
chunk_for(xplustabs(), openfile->current) > original_row) ||
|
||||||
extra_chunks_in(openfile->current) != old_amount)) {
|
extra_chunks_in(openfile->current) != old_amount)) {
|
||||||
|
renumber_from(openfile->current);
|
||||||
refresh_needed = TRUE;
|
refresh_needed = TRUE;
|
||||||
focusing = FALSE;
|
focusing = FALSE;
|
||||||
}
|
}
|
||||||
|
@ -284,6 +284,10 @@ typedef struct linestruct {
|
|||||||
/* The text of this line. */
|
/* The text of this line. */
|
||||||
ssize_t lineno;
|
ssize_t lineno;
|
||||||
/* The number of this line. */
|
/* 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;
|
struct linestruct *next;
|
||||||
/* Next node. */
|
/* Next node. */
|
||||||
struct linestruct *prev;
|
struct linestruct *prev;
|
||||||
|
16
src/winio.c
16
src/winio.c
@ -2954,7 +2954,16 @@ bool less_than_a_screenful(size_t was_lineno, size_t was_leftedge)
|
|||||||
void draw_scrollbar(void)
|
void draw_scrollbar(void)
|
||||||
{
|
{
|
||||||
int totalrows = openfile->filebot->lineno;
|
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;
|
int highest = lowest + (editwinrows * editwinrows) / totalrows;
|
||||||
|
|
||||||
if (editwinrows > totalrows)
|
if (editwinrows > totalrows)
|
||||||
@ -3133,10 +3142,11 @@ size_t leftedge_for(size_t column, linestruct *line)
|
|||||||
* has changed, because then the width of softwrapped chunks has changed. */
|
* has changed, because then the width of softwrapped chunks has changed. */
|
||||||
void ensure_firstcolumn_is_aligned(void)
|
void ensure_firstcolumn_is_aligned(void)
|
||||||
{
|
{
|
||||||
if (ISSET(SOFTWRAP))
|
if (ISSET(SOFTWRAP)) {
|
||||||
openfile->firstcolumn = leftedge_for(openfile->firstcolumn,
|
openfile->firstcolumn = leftedge_for(openfile->firstcolumn,
|
||||||
openfile->edittop);
|
openfile->edittop);
|
||||||
else
|
renumber_from(openfile->filetop);
|
||||||
|
} else
|
||||||
openfile->firstcolumn = 0;
|
openfile->firstcolumn = 0;
|
||||||
|
|
||||||
/* If smooth scrolling is on, make sure the viewport doesn't center. */
|
/* If smooth scrolling is on, make sure the viewport doesn't center. */
|
||||||
|
Loading…
Reference in New Issue
Block a user