From f28ff9dece93b488f34aca68834e7cbb965f330f Mon Sep 17 00:00:00 2001
From: David Lawrence Ramsey <pooka109@gmail.com>
Date: Mon, 24 Jul 2006 18:53:54 +0000
Subject: [PATCH] in parse_kbinput(), properly handle combined control
 character and escape sequences, so that e.g. Esc Esc / will work properly
 when the / is on the numeric keypad and NumLock is off

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@3811 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
---
 ChangeLog   |  5 ++++-
 src/winio.c | 26 +++++++++++++++++++++++---
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c319585b..92ba4a21 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -136,7 +136,10 @@ CVS code -
   parse_kbinput()
 	- Properly handle combined meta and escape sequences, so that
 	  e.g. Meta-+ will work properly when the + is on the numeric
-	  keypad and NumLock is off. (DLR)
+	  keypad and NumLock is off.  Also, properly handle combined
+	  control character and escape sequences, so that e.g. Esc Esc /
+	  will work properly when the / is on the numeric keypad and
+	  NumLock is off. (DLR)
 	- Translate extended keypad keys to their ASCII equivalents even
 	  when we hit Escape once or twice before typing them, for
 	  consistency. (DLR)
diff --git a/src/winio.c b/src/winio.c
index 6e0b6c47..78fa0bac 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -347,11 +347,13 @@ int parse_kbinput(WINDOW *win, bool *meta_key, bool *func_key)
 		    /* One escape: wait for more input. */
 		case 2:
 		    /* Two escapes: wait for more input. */
+		case 3:
+		    /* Three escapes: wait for more input. */
 		    break;
 		default:
-		    /* More than two escapes: reset the escape counter
-		     * and wait for more input. */
-		    escapes = 0;
+		    /* More than three escapes: limit the escape counter
+		     * to no more than two, and wait for more input. */
+		    escapes %= 3;
 	    }
 	    break;
 	default:
@@ -466,6 +468,24 @@ int parse_kbinput(WINDOW *win, bool *meta_key, bool *func_key)
 				*kbinput);
 		    }
 		    break;
+		case 3:
+		    /* Reset the escape counter. */
+		    escapes = 0;
+		    if (get_key_buffer_len() == 0)
+			/* Three escapes followed by a non-escape, and
+			 * there aren't any other keystrokes waiting:
+			 * normal input mode.  Save the non-escape
+			 * character as the result. */
+			retval = *kbinput;
+		    else
+			/* Three escapes followed by a non-escape, and
+			 * there are other keystrokes waiting: combined
+			 * control character and escape sequence mode.
+			 * Interpret the escape sequence, and interpret
+			 * the result as a control sequence. */
+			retval = get_control_kbinput(
+				parse_escape_seq_kbinput(win,
+				*kbinput));
 	    }
     }
 
-- 
GitLab