From 8c1edd17e323d69c5fcfa6894b2ee0d4dcde49ac Mon Sep 17 00:00:00 2001 From: Chris Allegretta Date: Mon, 16 Nov 2009 04:28:40 +0000 Subject: [PATCH] Further fixes, also fix some page/up down issues where we go way off course. git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@4428 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- src/global.c | 2 ++ src/move.c | 19 ++++++++++++++----- src/proto.h | 1 + src/winio.c | 35 ++++++++++++++++++++++------------- 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/global.c b/src/global.c index c7f8ea1e..a2f3979e 100644 --- a/src/global.c +++ b/src/global.c @@ -66,6 +66,8 @@ WINDOW *bottomwin; * messages, the statusbar prompt, and a list of shortcuts. */ int editwinrows = 0; /* How many rows does the edit window take up? */ +int maxrows = 0; + /* How many usable lines are there (due to soft wrapping) */ filestruct *cutbuffer = NULL; /* The buffer where we store cut text. */ diff --git a/src/move.c b/src/move.c index ebea8817..f22e6fea 100644 --- a/src/move.c +++ b/src/move.c @@ -29,7 +29,7 @@ /* Move to the first line of the file. */ void do_first_line(void) { - openfile->current = openfile->fileage; + openfile->current = openfile->edittop = openfile->fileage; openfile->current_x = 0; openfile->placewewant = 0; @@ -90,7 +90,7 @@ void do_page_down(void) /* If there's less than a page of text left on the screen, put the * cursor at the beginning of the last line of the file, and then * update the edit window. */ - if (openfile->current->lineno + editwinrows - 2 >= + if (openfile->current->lineno + maxrows - 2 >= openfile->filebot->lineno) { do_last_line(); return; @@ -107,15 +107,24 @@ void do_page_down(void) } #endif - for (i = editwinrows - 2; i > 0 && openfile->current != - openfile->filebot; i--) +#ifdef DEBUG + fprintf(stderr, "do_page_down: maxrows = %d\n", maxrows); +#endif + + for (i = maxrows - 2; i > 0 && openfile->current != + openfile->filebot; i--) { openfile->current = openfile->current->next; +#ifdef DEBUG + fprintf(stderr, "do_page_down: moving to line %d\n", openfile->current->lineno); +#endif + + } openfile->current_x = actual_x(openfile->current->data, openfile->placewewant); /* Scroll the edit window down a page. */ - edit_scroll(DOWN_DIR, editwinrows - 2); + edit_scroll(DOWN_DIR, maxrows - 2); } #ifndef DISABLE_JUSTIFY diff --git a/src/proto.h b/src/proto.h index 740ba809..436b15c4 100644 --- a/src/proto.h +++ b/src/proto.h @@ -46,6 +46,7 @@ extern WINDOW *topwin; extern WINDOW *edit; extern WINDOW *bottomwin; extern int editwinrows; +extern int maxrows; extern filestruct *cutbuffer; extern filestruct *cutbottom; diff --git a/src/winio.c b/src/winio.c index 96d25fc9..2bbb1758 100644 --- a/src/winio.c +++ b/src/winio.c @@ -41,9 +41,6 @@ static bool disable_cursorpos = FALSE; /* Should we temporarily disable constant cursor position * display? */ -static int maxrows = 0; - /* With soft wrapping, how many lines really fit on the curent page */ - /* Control character compatibility: * * - NANO_BACKSPACE_KEY is Ctrl-H, which is Backspace under ASCII, ANSI, @@ -2945,16 +2942,23 @@ void compute_maxrows(void) int n; filestruct *foo = openfile->edittop; + if (!ISSET(SOFTWRAP)) { + maxrows = editwinrows; + return; + } + maxrows = 0; for (n = 0; n < editwinrows && foo; n++) { maxrows += 1 - strlenpt(foo->data) / COLS; foo = foo->next; } + if (n < editwinrows) + maxrows += editwinrows - n; + #ifdef DEBUG fprintf(stderr, "compute_maxrows(): maxrows = %ld\n", maxrows); #endif - } /* Scroll the edit window in the given direction and the given number @@ -3035,6 +3039,7 @@ void edit_scroll(scroll_dir direction, ssize_t nlines) } } + compute_maxrows(); /* Limit nlines to the number of lines we could scroll. */ nlines -= i; @@ -3173,8 +3178,6 @@ void edit_redraw(filestruct *old_current, size_t pww_save) else edit_scroll(DOWN_DIR, nlines); - compute_maxrows(); - #ifndef NANO_TINY /* If the mark is on, update all the lines between the old first * line or old last line of the edit window (depending on @@ -3224,12 +3227,16 @@ void edit_refresh(void) int nlines; /* Figure out what maxrows should really be */ - if (openfile->current->lineno > openfile->edittop->lineno) - compute_maxrows(); + compute_maxrows(); if (openfile->current->lineno < openfile->edittop->lineno || openfile->current->lineno >= openfile->edittop->lineno + - maxrows) + maxrows) { + +#ifdef DEBUG + fprintf(stderr, "edit_refresh(): line = %d, edittop %d + maxrows %d\n", openfile->current->lineno, openfile->edittop->lineno, maxrows); +#endif + /* Put the top line of the edit window in range of the current * line. */ edit_update( @@ -3237,6 +3244,7 @@ void edit_refresh(void) ISSET(SMOOTH_SCROLL) ? NONE : #endif CENTER); + } foo = openfile->edittop; @@ -3275,21 +3283,22 @@ void edit_update(update_type location) * screen as before, or at the top or bottom of the screen if * edittop is beyond either. */ if (location == CENTER) - goal = editwinrows / 2; + goal = maxrows / 2; else { goal = openfile->current_y; /* Limit goal to (editwinrows - 1) lines maximum. */ - if (goal > editwinrows - 1) - goal = editwinrows - 1; + if (goal > maxrows - 1) + goal = maxrows - 1; } for (; goal > 0 && foo->prev != NULL; goal--) { if (ISSET(SOFTWRAP)) - goal -= strlenpt(foo->data) / COLS; + goal -= 1 + strlenpt(foo->data) / COLS; foo = foo->prev; } openfile->edittop = foo; + compute_maxrows(); } /* Unconditionally redraw the entire screen. */ -- 2.39.5