From 38f87fb5c393eb017d1ca9659d8c23d5a223926e Mon Sep 17 00:00:00 2001 From: Benno Schulenberg Date: Sat, 17 Jan 2026 12:34:04 +0100 Subject: [PATCH] display: add extra variable, to avoid one-way toggling of SOLO_SIDESCROLL Panning should not be switched off for the whole session when the window became too narrow at some point. --- src/cut.c | 2 +- src/global.c | 2 ++ src/nano.c | 12 ++++++++---- src/prototypes.h | 1 + src/search.c | 4 ++-- src/utils.c | 2 +- src/winio.c | 8 ++++---- 7 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/cut.c b/src/cut.c index 1172d45c..ed7bc159 100644 --- a/src/cut.c +++ b/src/cut.c @@ -54,7 +54,7 @@ void expunge(undo_type action) if (ISSET(SOFTWRAP) && extra_chunks_in(openfile->current) != old_amount) refresh_needed = TRUE; /* When panning, and we have come near edge of the viewport... */ - else if (!ISSET(SOLO_SIDESCROLL) && openfile->placewewant < brink + CUSHION) + else if (united_sidescroll && openfile->placewewant < brink + CUSHION) refresh_needed = TRUE; /* Adjust the mark if it is after the cursor on the current line. */ diff --git a/src/global.c b/src/global.c index fc2a36de..d4408597 100644 --- a/src/global.c +++ b/src/global.c @@ -73,6 +73,8 @@ char *title = NULL; bool refresh_needed = FALSE; /* Did a command mangle enough of the buffer that we should * repaint the screen? */ +bool united_sidescroll = TRUE; + /* Whether to scroll all lines sideways. That is: whether to pan. */ size_t brink = 0; /* From which column the edit window is drawn (when panning). */ bool focusing = TRUE; diff --git a/src/nano.c b/src/nano.c index 34379685..afe66915 100644 --- a/src/nano.c +++ b/src/nano.c @@ -1553,7 +1553,7 @@ void inject(char *burst, size_t count) openfile->placewewant = xplustabs(); /* When panning, and we have come near the edge of the viewport... */ - if (!ISSET(SOLO_SIDESCROLL) && openfile->placewewant > brink + editwincols - CUSHION - 1 ) + if (united_sidescroll && openfile->placewewant > brink + editwincols - CUSHION - 1 ) refresh_needed = TRUE; #ifndef NANO_TINY @@ -2687,9 +2687,13 @@ int main(int argc, char **argv) if (currmenu != MMAIN) bottombars(MMAIN); - /* Fall back to single-line sidescrolling when the window is narrow. */ - if (editwincols < 2 * CUSHION + 2) - SET(SOLO_SIDESCROLL); + /* Do sideways scrolling only when the user didn't switch it off, + * when not softwrapping, and the window is wide enough. */ + if (united_sidescroll != (!ISSET(SOLO_SIDESCROLL) && !ISSET(SOFTWRAP) && + editwincols > 2 * CUSHION + 2)) { + united_sidescroll = !united_sidescroll; + refresh_needed = TRUE; + } #ifndef NANO_TINY if (ISSET(MINIBAR) && !ISSET(ZERO) && LINES > 1 && lastmessage < REMARK) diff --git a/src/prototypes.h b/src/prototypes.h index b8299228..1eda8be7 100644 --- a/src/prototypes.h +++ b/src/prototypes.h @@ -47,6 +47,7 @@ extern int final_status; extern bool inhelp; extern char *title; +extern bool united_sidescroll; extern size_t brink; extern bool focusing; diff --git a/src/search.c b/src/search.c index 3ff1cf04..46cfb7ff 100644 --- a/src/search.c +++ b/src/search.c @@ -334,7 +334,7 @@ int findnextstr(const char *needle, bool whole_word_only, int modus, light_to_col = wideness(line->data, found_x + found_len); /* When panning, ensure the end of the match will be visible too. */ - if (!ISSET(SOLO_SIDESCROLL) && !ISSET(SOFTWRAP)) + if (united_sidescroll) brink = get_page_start(light_to_col); refresh_needed = TRUE; @@ -596,7 +596,7 @@ ssize_t do_replace_loop(const char *needle, bool whole_word_only, light_to_col = wideness(openfile->current->data, openfile->current_x + match_len); - if (!ISSET(SOLO_SIDESCROLL) && !ISSET(SOFTWRAP)) + if (united_sidescroll) brink = get_page_start(light_to_col); /* Refresh the edit window, scrolling it if necessary. */ diff --git a/src/utils.c b/src/utils.c index 7940d556..953a570f 100644 --- a/src/utils.c +++ b/src/utils.c @@ -343,7 +343,7 @@ char *free_and_assign(char *dest, char *src) * displayed in the edit window when the cursor is at the given column. */ size_t get_page_start(size_t column) { - if (!ISSET(SOLO_SIDESCROLL) && !ISSET(SOFTWRAP)) { + if (united_sidescroll) { if (column < CUSHION) return 0; else if (column < brink + CUSHION) diff --git a/src/winio.c b/src/winio.c index 91036811..7865d425 100644 --- a/src/winio.c +++ b/src/winio.c @@ -2838,7 +2838,7 @@ int update_line(linestruct *line, size_t index) #endif row = line->lineno - openfile->edittop->lineno; - if (!ISSET(SOLO_SIDESCROLL)) + if (united_sidescroll) from_col = brink; else from_col = get_page_start(wideness(line->data, index)); @@ -2937,7 +2937,7 @@ bool line_needs_update(const size_t old_column, const size_t new_column) #endif if (get_page_start(old_column) == get_page_start(new_column)) return FALSE; - if (!ISSET(SOLO_SIDESCROLL) && !ISSET(SOFTWRAP)) + if (united_sidescroll) refresh_needed = TRUE; return !refresh_needed; @@ -3349,7 +3349,7 @@ void edit_redraw(linestruct *old_current, update_type manner) adjust_viewport(ISSET(JUMPY_SCROLLING) ? CENTERING : manner); refresh_needed = TRUE; return; - } else if (!ISSET(SOLO_SIDESCROLL) && !ISSET(SOFTWRAP)) { + } else if (united_sidescroll) { refresh_needed = TRUE; return; } @@ -3392,7 +3392,7 @@ void edit_refresh(void) adjust_viewport((focusing || ISSET(JUMPY_SCROLLING)) ? CENTERING : FLOWING); /* When panning, ensure the cursor will be within the viewport. */ - if (!ISSET(SOLO_SIDESCROLL) && !ISSET(SOFTWRAP)) + if (united_sidescroll) brink = get_page_start(xplustabs()); #ifdef ENABLE_COLOR