diff --git a/ChangeLog b/ChangeLog
index 8d95220a013559d63ff4a67eaf608ba27b487657..8b844f06d37956c8b8b76a5691d16b301bff4f8d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -311,6 +311,11 @@ CVS code -
   get_escape_seq_kbinput()
 	- Add proper support for the keypad values and escape sequences
 	  generated by the NumLock glitch. (DLR)
+	- Add ignore_seq parameter.  If a sequence is recognized but
+	  ignored, we will now return ERR and set ignore_seq to TRUE, and
+	  if a sequence is unrecognized, we will now return ERR and set
+	  ignore_seq to FALSE.  Also, here and elsewhere, don't bother
+	  assigning ERR to retval when that's its initial value. (DLR)
   get_mouseinput()
 	- Don't ungetch() anything if there's no control key and no meta
 	  key defined in the shortcut we clicked. (DLR)
diff --git a/src/proto.h b/src/proto.h
index 951099896718dfd889bc73ac879e1532d275c899..5f77dcb8c73b4669138af660c0bc6de05bb29e49 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -491,7 +491,8 @@ int get_ascii_kbinput(int kbinput, size_t ascii_digits
 #endif
 	);
 int get_control_kbinput(int kbinput);
-int get_escape_seq_kbinput(int *escape_seq, size_t es_len);
+int get_escape_seq_kbinput(int *escape_seq, size_t es_len, int
+	*ignore_seq);
 int get_escape_seq_abcd(int kbinput);
 int *get_verbatim_kbinput(WINDOW *win, int *verbatim_kbinput, size_t
 	*verbatim_len, int allow_ascii);
diff --git a/src/winio.c b/src/winio.c
index a6f4430bb8c8272474e934b787e10bba7d1fd9c7..72cde515bdd34f2e856a470f1fb87e1dd081443a 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -152,14 +152,18 @@ int get_kbinput(WINDOW *win, int *meta_key)
 	    escape_seq = get_verbatim_kbinput(win, escape_seq, &es_len,
 		FALSE);
 
+	    /* If the escape sequence is more than one character
+	     * long, set meta_key to FALSE, translate the escape
+	     * sequence into the corresponding key value, and save
+	     * that as the result. */
 	    if (es_len > 1) {
-		/* The escape sequence is more than one character
-		 * long.  Set meta_key to FALSE, translate the escape
-		 * sequence into the corresponding key value, and save
-		 * that as the result. */
+		int ignore_seq;
+
 		*meta_key = FALSE;
-		if ((retval = get_escape_seq_kbinput(escape_seq,
-			es_len)) == ERR) {
+		retval = get_escape_seq_kbinput(escape_seq, es_len,
+			&ignore_seq);
+
+		if (retval == ERR && !ignore_seq) {
 		    /* This escape sequence is unrecognized.  Send it
 		     * back. */
 		    for (; es_len > 1; es_len--)
@@ -236,7 +240,6 @@ int get_translated_kbinput(int kbinput, int *es
 	case KEY_ALT_L:
 	case KEY_ALT_R:
 #endif
-	    retval = ERR;
 	    break;
 	default:
 	    switch (escapes) {
@@ -293,7 +296,6 @@ int get_translated_kbinput(int kbinput, int *es
 			    break;
 			case KEY_B2:	/* Center (5) on numeric keypad
 					 * with NumLock off. */
-			    retval = ERR;
 			    break;
 			case KEY_C1:	/* End (1) on numeric keypad
 					 * with NumLock off. */
@@ -307,7 +309,6 @@ int get_translated_kbinput(int kbinput, int *es
 			/* Slang doesn't support KEY_BEG. */
 			case KEY_BEG:	/* Center (5) on numeric keypad
 					 * with NumLock off. */
-			    retval = ERR;
 			    break;
 #endif
 #ifdef KEY_END
@@ -558,12 +559,18 @@ int get_control_kbinput(int kbinput)
 
 /* Translate escape sequences, most of which correspond to extended
  * keypad values, nto their corresponding key values.  These sequences
- * are generated when the keypad doesn't support the needed keys.
- * Assume that Escape has already been read in. */
-int get_escape_seq_kbinput(int *escape_seq, size_t es_len)
+ * are generated when the keypad doesn't support the needed keys.  If
+ * the escape sequence is recognized but we want to ignore it, return
+ * ERR and set ignore_seq to TRUE; if it's unrecognized, return ERR and
+ * set ignore_seq to FALSE.  Assume that Escape has already been read
+ * in. */
+int get_escape_seq_kbinput(int *escape_seq, size_t es_len, int
+	*ignore_seq)
 {
     int retval = ERR;
 
+    *ignore_seq = FALSE;
+
     if (es_len > 1) {
 	switch (escape_seq[0]) {
 	    case 'O':
@@ -593,7 +600,7 @@ int get_escape_seq_kbinput(int *escape_seq, size_t es_len)
 			break;
 		    case 'E': /* Esc O E == Center (5) on numeric keypad
 			       * with NumLock off on xterm. */
-			retval = ERR;
+			*ignore_seq = TRUE;
 			break;
 		    case 'F': /* Esc O F == End on xterm. */
 			retval = NANO_END_KEY;
@@ -704,7 +711,7 @@ int get_escape_seq_kbinput(int *escape_seq, size_t es_len)
 		    case 'u': /* Esc O u == Center (5) on numeric keypad
 			       * with NumLock off on
 			       * VT100/VT220/VT320/rxvt/Eterm. */
-			retval = ERR;
+			*ignore_seq = TRUE;
 			break;
 		    case 'v': /* Esc O v == Right (6) on numeric keypad
 			       * with NumLock off on
@@ -910,7 +917,7 @@ int get_escape_seq_kbinput(int *escape_seq, size_t es_len)
 			break;
 		    case 'E': /* Esc [ E == Center (5) on numeric keypad
 			       * with NumLock off on FreeBSD console. */
-			retval = ERR;
+			*ignore_seq = TRUE;
 			break;
 		    case 'F': /* Esc [ F == End on FreeBSD
 			       * console/Eterm. */
@@ -1036,7 +1043,7 @@ int get_escape_seq_kbinput(int *escape_seq, size_t es_len)
     }
 
 #ifdef DEBUG
-    fprintf(stderr, "get_escape_seq_kbinput(): retval = %d\n", retval);
+    fprintf(stderr, "get_escape_seq_kbinput(): retval = %d, ignore_seq = %d\n", retval, *ignore_seq);
 #endif
 
     return retval;