From 6f499096ad5968f7da0b576519e3e9b41e312401 Mon Sep 17 00:00:00 2001
From: David Lawrence Ramsey <pooka109@gmail.com>
Date: Fri, 30 Jun 2006 21:01:55 +0000
Subject: [PATCH] in do_browser() and do_help(), simplify screen update
 handling

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@3708 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
---
 ChangeLog     |  4 ++++
 src/browser.c | 28 +++++++++++++---------------
 src/help.c    | 44 ++++++++++++++++++++++----------------------
 3 files changed, 39 insertions(+), 37 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e6a3662e..202a7ac6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -16,6 +16,7 @@ CVS code -
 	- Remove unneeded call to blank_edit(). (DLR)
 	- After entering "..", select the directory we were in before
 	  instead of the first filename in the list, as Pico does. (DLR)
+	- Simplify screen update handling. (DLR)
   browser_refresh()
 	- Simplify. (DLR)
 	- Fix problems where translated versions of "(dir)" could be
@@ -32,6 +33,9 @@ CVS code -
 	  allocated, use null_at() to strip the directory from the
 	  string.  Also, return the stripped path instead of modifying
 	  path. (DLR)
+- help.c:
+  do_help()
+	- Simplify screen update handling. (DLR)
 - doc/syntax/c.nanorc:
 	- Since .i and .ii are preprocessed C and C++ output, colorize
 	  them here. (Mike Frysinger)
diff --git a/src/browser.c b/src/browser.c
index 2d53601e..6d28e18a 100644
--- a/src/browser.c
+++ b/src/browser.c
@@ -49,8 +49,7 @@ static bool search_last_file = FALSE;
 char *do_browser(char *path, DIR *dir)
 {
     int kbinput;
-    bool meta_key, func_key;
-    bool old_const_update = ISSET(CONST_UPDATE);
+    bool meta_key, func_key, old_const_update = ISSET(CONST_UPDATE);
     char *prev_dir = NULL;
 	/* The directory we were in, if any, before backing up via
 	 * entering "..". */
@@ -102,10 +101,13 @@ char *do_browser(char *path, DIR *dir)
     }
 
     do {
-	bool abort = FALSE;
+	size_t fileline;
+		/* The line number the selected file is on. */
+	size_t old_selected = selected;
+		/* We display the file list only if the selected file
+		 * changed. */
 	struct stat st;
 	int i;
-	size_t fileline;
 	char *new_path;
 
 	/* Compute the line number we're on now, so that we don't divide
@@ -124,8 +126,6 @@ char *do_browser(char *path, DIR *dir)
 			/* We can click in the edit window to select a
 			 * file. */
 			if (wenclose(edit, mouse_y, mouse_x)) {
-			    size_t old_selected = selected;
-
 			    /* Subtract out the size of topwin. */
 			    mouse_y -= 2 - no_more_space();
 
@@ -325,7 +325,7 @@ char *do_browser(char *path, DIR *dir)
 		 * get out. */
 		if (!S_ISDIR(st.st_mode)) {
 		    retval = mallocstrcpy(NULL, filelist[selected]);
-		    abort = TRUE;
+		    kbinput = NANO_EXIT_KEY;
 		    break;
 		/* If we've successfully opened a directory, and it's
 		 * "..", save the current directory in prev_dir, so that
@@ -349,16 +349,14 @@ char *do_browser(char *path, DIR *dir)
 		/* Start over again with the new path value. */
 		free_chararray(filelist, filelist_len);
 		goto change_browser_directory;
-	    /* Abort the browser. */
-	    case NANO_EXIT_KEY:
-		abort = TRUE;
-		break;
 	}
 
-	if (abort)
-	    break;
-
-	browser_refresh();
+	/* Display the file list if we don't have a key, we do have a
+	 * key and the selected file has changed, or if we haven't
+	 * updated the screen already. */
+	if ((kbinput == ERR || old_selected == selected) && kbinput !=
+		NANO_REFRESH_KEY)
+	    browser_refresh();
 
 	kbinput = get_kbinput(edit, &meta_key, &func_key);
 	parse_browser_input(&kbinput, &meta_key, &func_key);
diff --git a/src/help.c b/src/help.c
index 2967343f..dc1a74af 100644
--- a/src/help.c
+++ b/src/help.c
@@ -43,8 +43,7 @@ void do_help(void (*refresh_func)(void))
 	/* The line number in help_text of the last help line.  This
 	 * variable is zero-based. */
     int kbinput = ERR;
-    bool meta_key, func_key;
-    bool old_no_help = ISSET(NO_HELP);
+    bool meta_key, func_key, old_no_help = ISSET(NO_HELP);
 #ifndef DISABLE_MOUSE
     const shortcut *oldshortcut = currshortcut;
 	/* We will set currshortcut to allow clicking on the help
@@ -139,30 +138,31 @@ void do_help(void (*refresh_func)(void))
 		break;
 	}
 
-	if ((kbinput != ERR && line == old_line) || kbinput ==
-		NANO_REFRESH_KEY)
-	    goto skip_redisplay;
-
-	blank_edit();
-
-	/* Calculate where in the text we should be, based on the
-	 * page. */
-	for (i = 0; i < line; i++) {
-	    ptr += help_line_len(ptr);
-	    if (*ptr == '\n')
-		ptr++;
-	}
+	/* Display the help text if we don't have a key, we do have a
+	 * key and the help text has moved, or if we haven't updated the
+	 * screen already. */
+	if ((kbinput == ERR || line != old_line) && kbinput !=
+		NANO_REFRESH_KEY) {
+	    blank_edit();
+
+	    /* Calculate where in the text we should be, based on the
+	     * page. */
+	    for (i = 0; i < line; i++) {
+		ptr += help_line_len(ptr);
+		if (*ptr == '\n')
+		    ptr++;
+	    }
 
-	for (i = 0; i < editwinrows && *ptr != '\0'; i++) {
-	    size_t j = help_line_len(ptr);
+	    for (i = 0; i < editwinrows && *ptr != '\0'; i++) {
+		size_t j = help_line_len(ptr);
 
-	    mvwaddnstr(edit, i, 0, ptr, j);
-	    ptr += j;
-	    if (*ptr == '\n')
-		ptr++;
+		mvwaddnstr(edit, i, 0, ptr, j);
+		ptr += j;
+		if (*ptr == '\n')
+		    ptr++;
+	    }
 	}
 
-  skip_redisplay:
 	kbinput = get_kbinput(edit, &meta_key, &func_key);
 	parse_help_input(&kbinput, &meta_key, &func_key);
     } while (kbinput != NANO_EXIT_KEY);
-- 
GitLab