nano

nano with my custom patches
git clone git://bsandro.tech/nano
Log | Files | Refs | README | LICENSE

commit 2789bb0813376caf59da7f80b83c3db28c0fc370
parent 4d996e4c394c4d80aa6cab51cb62a880382ac293
Author: Benno Schulenberg <bensberg@justemail.net>
Date:   Fri, 21 Oct 2016 13:52:40 +0200

screen: repaint the edit window in a single place -- the main loop

Instead of doing this in two places: after interpreting shortcuts,
and after injecting characters.

Diffstat:
Msrc/files.c | 3+--
Msrc/nano.c | 27+++++++++++----------------
Msrc/winio.c | 3+++
3 files changed, 15 insertions(+), 18 deletions(-)

diff --git a/src/files.c b/src/files.c @@ -567,8 +567,7 @@ void display_buffer(void) precalc_multicolorinfo(); #endif - /* Update the edit window. */ - edit_refresh(); + refresh_needed = TRUE; } #ifndef DISABLE_MULTIBUFFER diff --git a/src/nano.c b/src/nano.c @@ -1428,7 +1428,7 @@ void do_toggle(int flag) case LINE_NUMBERS: #endif case SOFTWRAP: - edit_refresh(); + refresh_needed = TRUE; break; } @@ -1733,13 +1733,7 @@ int do_input(bool allow_funcs) if (f && !f->viewok) reset_multis(openfile->current, FALSE); #endif - if (refresh_needed) { -#ifdef DEBUG - fprintf(stderr, "running edit_refresh() as refresh_needed is true\n"); -#endif - edit_refresh(); - refresh_needed = FALSE; - } else if (s->scfunc == do_delete || s->scfunc == do_backspace) + if (!refresh_needed && (s->scfunc == do_delete || s->scfunc == do_backspace)) update_line(openfile->current, openfile->current_x); } } @@ -1956,10 +1950,7 @@ void do_output(char *output, size_t output_len, bool allow_cntrls) reset_multis(openfile->current, FALSE); #endif - if (refresh_needed == TRUE) { - edit_refresh(); - refresh_needed = FALSE; - } else + if (!refresh_needed) update_line(openfile->current, openfile->current_x); } @@ -2718,10 +2709,14 @@ int main(int argc, char **argv) /* Forget any earlier statusbar x position. */ reinit_statusbar_x(); - /* Place the cursor in the edit window and make it visible. */ - reset_cursor(); - curs_set(1); - wnoutrefresh(edit); + /* Refresh either the entire edit window or just the cursor. */ + if (refresh_needed) + edit_refresh(); + else { + reset_cursor(); + curs_set(1); + wnoutrefresh(edit); + } /* Read in and interpret keystrokes. */ do_input(TRUE); diff --git a/src/winio.c b/src/winio.c @@ -2978,7 +2978,10 @@ void edit_refresh(void) blank_line(edit, nlines, 0, COLS); reset_cursor(); + curs_set(1); wnoutrefresh(edit); + + refresh_needed = FALSE; } /* Move edittop so that current is on the screen. manner says how it