]> git.wh0rd.org Git - nano.git/commitdiff
in parse_kbinput(), properly handle combined control character and
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 24 Jul 2006 18:53:54 +0000 (18:53 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 24 Jul 2006 18:53:54 +0000 (18:53 +0000)
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
src/winio.c

index c319585b0f8a78921f9e55f9325cd069a0054f11..92ba4a21a58a6f4fdcd3f141317de1a944ae3595 100644 (file)
--- 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)
index 6e0b6c47a7d6c4044cc1bff337d32e4d154bb03f..78fa0bacab8ac8b73e152901393a53712a06fae5 100644 (file)
@@ -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));
            }
     }