softwrap: add two chunk-iterator functions
These functions, go_back_chunks() and go_forward_chunks(), take a number of softwrapped chunks (screen rows) to move, a pointer to a buffer, and a location (specifically, a starting column of a softwrapped chunk). If they move successfully, they will update the buffer pointer and location to point to the beginning of the softwrapped chunk they moved to. Since non-softwrap mode is effectively just a subset of softwrap mode in which every line takes up one chunk, these functions also work in non-softwrap mode. In this case, their starting column will always be zero, as it would be in softwrap mode on a line that takes up one chunk. Nothing uses these functions yet, but that is forthcoming.master
parent
da62ef8a43
commit
456d66b904
|
@ -707,6 +707,8 @@ void edit_draw(filestruct *fileptr, const char *converted,
|
||||||
int line, size_t from_col);
|
int line, size_t from_col);
|
||||||
int update_line(filestruct *fileptr, size_t index);
|
int update_line(filestruct *fileptr, size_t index);
|
||||||
bool need_horizontal_scroll(const size_t old_column, const size_t new_column);
|
bool need_horizontal_scroll(const size_t old_column, const size_t new_column);
|
||||||
|
int go_back_chunks(int nrows, filestruct **line, size_t *leftedge);
|
||||||
|
int go_forward_chunks(int nrows, filestruct **line, size_t *leftedge);
|
||||||
void edit_scroll(scroll_dir direction, int nrows);
|
void edit_scroll(scroll_dir direction, int nrows);
|
||||||
void edit_redraw(filestruct *old_current);
|
void edit_redraw(filestruct *old_current);
|
||||||
void edit_refresh(void);
|
void edit_refresh(void);
|
||||||
|
|
82
src/winio.c
82
src/winio.c
|
@ -2753,6 +2753,88 @@ void compute_maxlines(void)
|
||||||
maxlines = editwinrows;
|
maxlines = editwinrows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Try to move up nrows softwrapped chunks from the given line and the
|
||||||
|
* given column (leftedge). After moving, leftedge will be set to the
|
||||||
|
* starting column of the current chunk. Return the number of chunks we
|
||||||
|
* couldn't move up, which will be zero if we completely succeeded. */
|
||||||
|
int go_back_chunks(int nrows, filestruct **line, size_t *leftedge)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Don't move more chunks than the window can hold. */
|
||||||
|
if (nrows > editwinrows - 1)
|
||||||
|
nrows = (editwinrows < 2) ? 1 : editwinrows - 1;
|
||||||
|
|
||||||
|
#ifndef NANO_TINY
|
||||||
|
if (ISSET(SOFTWRAP)) {
|
||||||
|
size_t current_chunk = (*leftedge) / editwincols;
|
||||||
|
|
||||||
|
for (i = nrows; i > 0; i--) {
|
||||||
|
if (current_chunk > 0) {
|
||||||
|
current_chunk--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*line == openfile->fileage)
|
||||||
|
break;
|
||||||
|
|
||||||
|
*line = (*line)->prev;
|
||||||
|
current_chunk = strlenpt((*line)->data) / editwincols;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Only change leftedge when we actually could move. */
|
||||||
|
if (i < nrows)
|
||||||
|
*leftedge = current_chunk * editwincols;
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
for (i = nrows; i > 0 && (*line)->prev != NULL; i--)
|
||||||
|
*line = (*line)->prev;
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try to move down nrows softwrapped chunks from the given line and the
|
||||||
|
* given column (leftedge). After moving, leftedge will be set to the
|
||||||
|
* starting column of the current chunk. Return the number of chunks we
|
||||||
|
* couldn't move down, which will be zero if we completely succeeded. */
|
||||||
|
int go_forward_chunks(int nrows, filestruct **line, size_t *leftedge)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Don't move more chunks than the window can hold. */
|
||||||
|
if (nrows > editwinrows - 1)
|
||||||
|
nrows = (editwinrows < 2) ? 1 : editwinrows - 1;
|
||||||
|
|
||||||
|
#ifndef NANO_TINY
|
||||||
|
if (ISSET(SOFTWRAP)) {
|
||||||
|
size_t current_chunk = (*leftedge) / editwincols;
|
||||||
|
size_t last_chunk = strlenpt((*line)->data) / editwincols;
|
||||||
|
|
||||||
|
for (i = nrows; i > 0; i--) {
|
||||||
|
if (current_chunk < last_chunk) {
|
||||||
|
current_chunk++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*line == openfile->filebot)
|
||||||
|
break;
|
||||||
|
|
||||||
|
*line = (*line)->next;
|
||||||
|
current_chunk = 0;
|
||||||
|
last_chunk = strlenpt((*line)->data) / editwincols;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Only change leftedge when we actually could move. */
|
||||||
|
if (i < nrows)
|
||||||
|
*leftedge = current_chunk * editwincols;
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
for (i = nrows; i > 0 && (*line)->next != NULL; i--)
|
||||||
|
*line = (*line)->next;
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
/* Scroll the edit window in the given direction and the given number of rows,
|
/* Scroll the edit window in the given direction and the given number of rows,
|
||||||
* and draw new lines on the blank lines left after the scrolling. We change
|
* and draw new lines on the blank lines left after the scrolling. We change
|
||||||
* edittop, and assume that current and current_x are up to date. */
|
* edittop, and assume that current and current_x are up to date. */
|
||||||
|
|
Loading…
Reference in New Issue