]> git.wh0rd.org Git - nano.git/commitdiff
in parse_kbinput(), if we get Escape followed by an escape sequence,
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Thu, 25 May 2006 21:39:25 +0000 (21:39 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Thu, 25 May 2006 21:39:25 +0000 (21:39 +0000)
interpret the escape sequence for consistency; also ignore unhandled
function keys for consistency

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@3565 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/nano.c
src/prompt.c
src/winio.c

index 91d6bff3efbcb1414eba3ce0f0f9c64166a36b9f..3295fd04a30728ec1e6cda1f3ab674f0b1f0f7de 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -97,14 +97,14 @@ CVS code -
          do_page_down(), do_up(), do_scroll_up(), do_down(),
          do_scroll_down(), do_input(), do_search(), do_research(), and
          do_delete(). (DLR)
-       - Ignore unhandled meta key sequences and escape sequences, and
-         indicate it on the statusbar when we get an unhandled shortcut
-         or toggle, as Pico does.  To get this to work properly, add a
-         shortcut for moving to the next search/replace string.  New
-         function is_ascii_cntrl_char(); changes to shortcut_init(),
-         do_input(), do_statusbar_input(), get_prompt_string(), and
-         parse_kbinput(). (DLR, suggested by Nick Warne and Benno
-         Schulenberg)
+       - Ignore unhandled meta key sequences, function keys, and escape
+         sequences, and indicate it on the statusbar when we get an
+         unhandled shortcut or toggle, as Pico does.  To get this to
+         work properly, add a shortcut for moving to the next
+         search/replace string.  New function is_ascii_cntrl_char();
+         changes to shortcut_init(), do_input(), do_statusbar_input(),
+         get_prompt_string(), and parse_kbinput(). (DLR, suggested by
+         Nick Warne and Benno Schulenberg)
        - Explain the mouse support in more detail, and sync the text of
          its description across all documentation.  Changes to nano.1,
          nanorc.5, nanorc.sample, and nano.texi. (Benno Schulenberg and
@@ -283,6 +283,8 @@ CVS code -
   parse_kbinput()
        - If we get NANO_CONTROL_8, properly handle it in all cases.
          (DLR)
+       - If we get Escape followed by an escape sequence, interpret the
+         escape sequence for consistency. (DLR)
   get_control_kbinput()
        - Add Ctrl-/ as an alias for Ctrl-_. (DLR, found by Benno
          Schulenberg)
index c4dd937759d530b329572e981fb5ffd19062b5f8..afca8c67cbcf79fa5371bf38520ac29722af02a4 100644 (file)
@@ -1297,10 +1297,11 @@ int do_input(bool *meta_key, bool *func_key, bool *s_or_t, bool
 #endif
        );
 
-    /* If we got a non-high-bit control key or a meta key sequence, and
-     * it's not a shortcut or toggle, throw it out. */
+    /* If we got a non-high-bit control key, a meta key sequence, or a
+     * function key, and it's not a shortcut or toggle, throw it out. */
     if (*s_or_t == FALSE) {
-       if (is_ascii_cntrl_char(input) || *meta_key == TRUE) {
+       if (is_ascii_cntrl_char(input) || *meta_key == TRUE ||
+               *func_key == TRUE) {
            statusbar(_("Unknown Command"));
            if (*meta_key == TRUE)
                *meta_key = FALSE;
index 7e60f2e182b6f235d0582766bf011bf67f7f1bf7..6d4b5a83344d1404426ab8869aa21aa5728e71a6 100644 (file)
@@ -100,10 +100,11 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
     /* Set s_or_t to TRUE if we got a shortcut. */
     *s_or_t = have_shortcut;
 
-    /* If we got a non-high-bit control key or a meta key sequence, and
-     * it's not a shortcut or toggle, throw it out. */
+    /* If we got a non-high-bit control key, a meta key sequence, or a
+     * function key, and it's not a shortcut or toggle, throw it out. */
     if (*s_or_t == FALSE) {
-       if (is_ascii_cntrl_char(input) || *meta_key == TRUE) {
+       if (is_ascii_cntrl_char(input) || *meta_key == TRUE ||
+               *func_key == TRUE) {
            if (*meta_key == TRUE)
                *meta_key = FALSE;
            input = ERR;
index 36b9681275a7a63c3b9b2e3e39047e3102deb426..f31f823b8079a1cda6d15c76b2f4fe6786cf49b4 100644 (file)
@@ -589,7 +589,16 @@ int parse_kbinput(WINDOW *win, bool *meta_key, bool *func_key)
                            free(byte_mb);
                            free(seq);
                        }
-                   } else {
+                   /* Two escapes followed by one or more non-decimal
+                    * digits: control character sequence mode,
+                    * interrupted byte sequence mode, or escape
+                    * sequence mode.  If there aren't any other keys
+                    * waiting, we have either a control character
+                    * sequence or an interrupted byte sequence.  If
+                    * there are other keys waiting, we have a true
+                    * escape sequence preceded by an extra escape, so
+                    * interpret it. */
+                   } else if (get_key_buffer_len() == 0) {
                        /* Reset the escape counter. */
                        escapes = 0;
                        if (byte_digits == 0)
@@ -610,6 +619,28 @@ int parse_kbinput(WINDOW *win, bool *meta_key, bool *func_key)
                            byte_digits = 0;
                            retval = *kbinput;
                        }
+                   } else {
+                       int *seq;
+                       size_t seq_len;
+                       bool ignore_seq;
+
+                       /* Put back the non-escape character, get the
+                        * complete escape sequence, translate the
+                        * sequence into its corresponding key value,
+                        * and save that as the result. */
+                       unget_input(kbinput, 1);
+                       seq_len = get_key_buffer_len();
+                       seq = get_input(NULL, seq_len);
+                       retval = get_escape_seq_kbinput(seq, seq_len,
+                               &ignore_seq);
+
+                       /* If the escape sequence is unrecognized and
+                        * not ignored, throw it out, and indicate this
+                        * on the statusbar. */
+                       if (retval == ERR && !ignore_seq)
+                           statusbar(_("Unknown Command"));
+
+                       free(seq);
                    }
                    break;
            }