[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/2 V5] possible new feature: a position+portion indicator on the
From: |
Benno Schulenberg |
Subject: |
[PATCH 1/2 V5] possible new feature: a position+portion indicator on the righthand side |
Date: |
Wed, 13 May 2020 14:18:33 +0200 |
V5: Draw the scrollbar also on the blank lines beyond end-of-file.
This was broken in V4.
[This scrollbar is optionless for the moment, for ease of testing.]
This fulfills https://savannah.gnu.org/bugs/?57956.
Original-patch-by: Marco Diego Aurélio Mesquita <address@hidden>
---
src/global.c | 4 ++++
src/help.c | 10 +++++-----
src/nano.c | 21 +++++++++++++++++----
src/proto.h | 2 ++
src/winio.c | 43 +++++++++++++++++++++++++++++++++++++++----
5 files changed, 67 insertions(+), 13 deletions(-)
diff --git a/src/global.c b/src/global.c
index 84103d26..0138ee80 100644
--- a/src/global.c
+++ b/src/global.c
@@ -131,7 +131,11 @@ int editwincols = -1;
/* The number of usable columns in the edit window: COLS -
margin. */
int margin = 0;
/* The amount of space reserved at the left for line numbers. */
+int thebar = 0;
+ /* Becomes 1 when a scrollbar is shown. */
#ifndef NANO_TINY
+int *bardata = NULL;
+ /* An array of characters that together depict the scrollbar. */
ssize_t stripe_column = 0;
/* The column at which a vertical bar will be drawn. */
#endif
diff --git a/src/help.c b/src/help.c
index afd1f453..4a2aa5b2 100644
--- a/src/help.c
+++ b/src/help.c
@@ -44,7 +44,7 @@ void wrap_help_text_into_buffer(void)
{
size_t sum = 0;
/* Avoid overtight and overwide paragraphs in the introductory text. */
- size_t wrapping_point = (COLS < 40) ? 40 : (COLS > 74) ? 74 : COLS;
+ size_t wrapping_point = ((COLS < 40) ? 40 : (COLS > 74) ? 74 : COLS) -
thebar;
const char *ptr = start_of_body;
make_new_buffer();
@@ -55,7 +55,7 @@ void wrap_help_text_into_buffer(void)
char *oneline;
if (ptr == end_of_intro)
- wrapping_point = (COLS < 40) ? 40 : COLS;
+ wrapping_point = ((COLS < 40) ? 40 : COLS) - thebar;
if (ptr < end_of_intro || *(ptr - 1) == '\n') {
length = break_line(ptr, wrapping_point, TRUE);
@@ -63,7 +63,7 @@ void wrap_help_text_into_buffer(void)
shim = (*(ptr + length - 1) == ' ') ? 0 : 1;
snprintf(oneline, length + shim, "%s", ptr);
} else {
- length = break_line(ptr, (COLS < 40) ? 22 : COLS - 18,
TRUE);
+ length = break_line(ptr, ((COLS < 40) ? 22 : COLS - 18)
- thebar, TRUE);
oneline = nmalloc(length + 5);
snprintf(oneline, length + 5, "\t\t %s", ptr);
}
@@ -145,7 +145,7 @@ void show_help(void)
#ifdef ENABLE_LINENUMBERS
UNSET(LINE_NUMBERS);
- editwincols = COLS;
+ editwincols = COLS - thebar;
margin = 0;
#endif
tabsize = 8;
@@ -250,7 +250,7 @@ void show_help(void)
#ifdef ENABLE_LINENUMBERS
margin = was_margin;
- editwincols = COLS - margin;
+ editwincols = COLS - margin - thebar;
#endif
tabsize = was_tabsize;
#ifdef ENABLE_COLOR
diff --git a/src/nano.c b/src/nano.c
index f41b66c4..e5cf4f8a 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -1037,7 +1037,11 @@ void regenerate_screen(void)
COLS = win.ws_col;
LINES = win.ws_row;
#endif
- editwincols = COLS - margin;
+#ifndef NANO_TINY
+ thebar = (LINES > 5 && COLS > 9 && !ISSET(SOFTWRAP)) ? 1 : 0;
+ bardata = nrealloc(bardata, LINES * sizeof(int));
+#endif
+ editwincols = COLS - margin - thebar;
/* Ensure that firstcolumn is the starting column of its chunk. */
ensure_firstcolumn_is_aligned();
@@ -1078,8 +1082,13 @@ void do_toggle(int flag)
signal_init();
break;
case SOFTWRAP:
- if (!ISSET(SOFTWRAP))
+ if (!ISSET(SOFTWRAP)) {
+ thebar = (LINES > 5 && COLS > 9) ? 1 : 0;
+ bardata = nrealloc(bardata, LINES *
sizeof(int));
openfile->firstcolumn = 0;
+ } else
+ thebar = 0;
+ editwincols = COLS - margin - thebar;
refresh_needed = TRUE;
break;
case WHITESPACE_DISPLAY:
@@ -1242,7 +1251,7 @@ void confirm_margin(void)
if (needed_margin != margin) {
margin = needed_margin;
- editwincols = COLS - margin;
+ editwincols = COLS - margin - thebar;
#ifndef NANO_TINY
/* Ensure that firstcolumn is the starting column of its chunk.
*/
@@ -2275,7 +2284,11 @@ int main(int argc, char **argv)
window_init();
curs_set(0);
- editwincols = COLS;
+#ifndef NANO_TINY
+ thebar = (LINES > 5 && COLS > 9 && !ISSET(SOFTWRAP)) ? 1 : 0;
+ bardata = nrealloc(bardata, LINES * sizeof(int));
+#endif
+ editwincols = COLS - thebar;
/* Set up the signal handlers. */
signal_init();
diff --git a/src/proto.h b/src/proto.h
index 78172809..2475ac35 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -93,7 +93,9 @@ extern WINDOW *bottomwin;
extern int editwinrows;
extern int editwincols;
extern int margin;
+extern int thebar;
#ifndef NANO_TINY
+extern int *bardata;
extern ssize_t stripe_column;
#endif
diff --git a/src/winio.c b/src/winio.c
index ba39f9fd..6a9fa04b 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -2412,6 +2412,9 @@ void draw_row(int row, const char *converted, linestruct
*line, size_t from_col)
if (is_shorter || ISSET(SOFTWRAP))
wclrtoeol(edit);
+ if (thebar)
+ mvwaddch(edit, row, COLS - 1, bardata[row]);
+
#ifdef USING_OLD_NCURSES
/* Tell ncurses to really redraw the line without trying to optimize
* for what it thinks is already there, because it gets it wrong in
@@ -2780,7 +2783,7 @@ int update_line(linestruct *line, size_t index)
}
if (has_more) {
wattron(edit, hilite_attribute);
- mvwaddch(edit, row, COLS - 1, '>');
+ mvwaddch(edit, row, COLS - 1 - thebar, '>');
wattroff(edit, hilite_attribute);
}
@@ -2960,6 +2963,24 @@ bool less_than_a_screenful(size_t was_lineno, size_t
was_leftedge)
return (openfile->current->lineno - was_lineno < editwinrows);
}
+#ifndef NANO_TINY
+/* Draw a scroll bar on the righthand side of the screen. */
+void draw_scrollbar(void)
+{
+ int totalrows = openfile->filebot->lineno;
+ int lowest = ((openfile->edittop->lineno - 1) * editwinrows) /
totalrows;
+ int highest = lowest + (editwinrows * editwinrows) / totalrows;
+
+ if (editwinrows > totalrows)
+ highest = editwinrows;
+
+ for (int row = 0; row < editwinrows; row++) {
+ bardata[row] = ' '|((row >= lowest && row <= highest) ?
A_REVERSE : 0);
+ mvwaddch(edit, row, COLS - 1, bardata[row]);
+ }
+}
+#endif
+
/* Scroll the edit window one row in the given direction, and
* draw the relevant content on the resultant blank row. */
void edit_scroll(bool direction)
@@ -2993,6 +3014,9 @@ void edit_scroll(bool direction)
go_forward_chunks(editwinrows - nrows, &line, &leftedge);
#ifndef NANO_TINY
+ if (thebar)
+ draw_scrollbar();
+
if (ISSET(SOFTWRAP)) {
/* Compensate for the earlier chunks of a softwrapped line. */
nrows += chunk_for(leftedge, line);
@@ -3263,6 +3287,11 @@ void edit_refresh(void)
if (current_is_offscreen())
adjust_viewport((focusing || ISSET(JUMPY_SCROLLING)) ?
CENTERING : FLOWING);
+#ifndef NANO_TINY
+ if (thebar)
+ draw_scrollbar();
+#endif
+
line = openfile->edittop;
while (row < editwinrows && line != NULL) {
@@ -3273,8 +3302,14 @@ void edit_refresh(void)
line = line->next;
}
- while (row < editwinrows)
- blank_row(edit, row++);
+ while (row < editwinrows) {
+ blank_row(edit, row);
+#ifndef NANO_TINY
+ if (thebar)
+ mvwaddch(edit, row, COLS - 1, bardata[row]);
+#endif
+ row++;
+ }
place_the_cursor();
wnoutrefresh(edit);
@@ -3422,7 +3457,7 @@ void spotlight(size_t from_col, size_t to_col)
wattron(edit, interface_color_pair[SELECTED_TEXT]);
waddnstr(edit, word, actual_x(word, to_col));
if (overshoots)
- mvwaddch(edit, openfile->current_y, COLS - 1, '>');
+ mvwaddch(edit, openfile->current_y, COLS - 1 - thebar, '>');
wattroff(edit, interface_color_pair[SELECTED_TEXT]);
free(word);
--
2.25.4
- [PATCH 1/2 V5] possible new feature: a position+portion indicator on the righthand side,
Benno Schulenberg <=