]> git.wh0rd.org Git - nano.git/commitdiff
work around the need to put back the first non-escape character when
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Sat, 28 Aug 2004 15:51:07 +0000 (15:51 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Sat, 28 Aug 2004 15:51:07 +0000 (15:51 +0000)
reading an escape sequence

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

ChangeLog
src/nano.c
src/proto.h
src/winio.c

index dbcc8f85b2ae3eda06e6e22269ac4dff8963ff12..250679218217158fc329d36e5cf5bbf96c5a5450 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -36,6 +36,15 @@ CVS code -
 - winio.c:
   unget_kbinput()
        - New function used as a wrapper for ungetch(). (DLR)
+  get_kbinput()
+       - When reading an escape sequence, set get_verbatim_kbinput()'s
+         new first parameter to the first character of the sequence
+         instead of putting that character back and reading the entire
+         sequence afterwards. (DLR)
+  get_verbatim_kbinput()
+       - Add new parameter first.  If first isn't ERR, make it the
+         first character in the returned sequence instead of reading
+         the first character in via blocking input. (DLR)
   get_mouseinput()
        - Consolidate two if statements to increase efficiency. (DLR)
        - Check kbinput against metaval instead of (erroneously) ctrlval
index 15ee28219c98cd59efc458cc12b518ad84da516c..f458a37b526270e95944e4274a1fe213dda7c215 100644 (file)
@@ -946,7 +946,7 @@ void do_verbatim_input(void)
 
     statusbar(_("Verbatim input"));
 
-    v_kbinput = get_verbatim_kbinput(edit, v_kbinput, &v_len, TRUE);
+    v_kbinput = get_verbatim_kbinput(edit, ERR, v_kbinput, &v_len, TRUE);
 
     /* Turn on DISABLE_CURPOS while inserting character(s) and turn it
      * off afterwards, so that if constant cursor position display is
index 93c710b0ebe0ecdecd26d3daee8170a5e06fa8ed..5a6c5c0b7917875dc82e83b8355c28ca7b1d29c2 100644 (file)
@@ -508,8 +508,8 @@ int get_control_kbinput(int kbinput);
 int get_escape_seq_kbinput(int *escape_seq, size_t es_len, bool
        *ignore_seq);
 int get_escape_seq_abcd(int kbinput);
-int *get_verbatim_kbinput(WINDOW *win, int *v_kbinput, size_t *v_len,
-       bool allow_ascii);
+int *get_verbatim_kbinput(WINDOW *win, int first, int *v_kbinput, size_t
+       *v_len, bool allow_ascii);
 int get_untranslated_kbinput(int kbinput, size_t position, bool
        allow_ascii
 #ifndef NANO_SMALL
index 3411c17cba850824735dd759bd6fb8d0da766c43..ada4a4b6360efac8e6ab009cc5c83ea8b5d33100 100644 (file)
@@ -145,26 +145,22 @@ int get_kbinput(WINDOW *win, bool *meta_key)
            int *escape_seq = NULL;
            size_t es_len;
 
-           /* First, assume that we got a meta sequence.  Set meta_key
-            * to TRUE and save the character we got as the result.  We
-            * do this so that if the keyboard buffer is full when we
-            * send back the character we got below (in which case we'll
-            * lose that character), it'll still be properly interpreted
-            * as a meta sequence. */
-           *meta_key = TRUE;
-           retval = tolower(kbinput);
-
-           /* Next, send back the character we got and read in the
-            * complete escape sequence. */
-           unget_kbinput(kbinput, FALSE);
-           escape_seq = get_verbatim_kbinput(win, escape_seq, &es_len,
-               FALSE);
-
+           /* Read in the complete escape sequence, putting the initial
+            * non-escape at the beginning of it. */
+           escape_seq = get_verbatim_kbinput(win, kbinput, escape_seq,
+               &es_len, FALSE);
+
+           /* If the escape sequence is one character long, set
+            * meta_key to TRUE, make the non-escape character
+            * lowercase, and save that as the result. */
+           if (es_len == 1) {
+               *meta_key = TRUE;
+               retval = tolower(kbinput);
            /* 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) {
+           } else if (es_len > 1) {
                bool ignore_seq;
 
                *meta_key = FALSE;
@@ -1078,10 +1074,11 @@ int get_escape_seq_abcd(int kbinput)
 }
 
 /* Read in a string of input characters (e.g. an escape sequence)
- * verbatim.  Store the string in v_kbinput and return the length
- * of the string in v_len.  Assume nodelay(win) is FALSE. */
-int *get_verbatim_kbinput(WINDOW *win, int *v_kbinput, size_t *v_len,
-       bool allow_ascii)
+ * verbatim.  If first isn't ERR, make it the first character of the
+ * string.  Store the string in v_kbinput and return the length of the
+ * string in v_len.  Assume nodelay(win) is FALSE. */
+int *get_verbatim_kbinput(WINDOW *win, int first, int *v_kbinput, size_t
+       *v_len, bool allow_ascii)
 {
     int kbinput;
     size_t i = 0, v_newlen = 0;
@@ -1100,10 +1097,14 @@ int *get_verbatim_kbinput(WINDOW *win, int *v_kbinput, size_t *v_len,
        disable_flow_control();
     keypad(win, FALSE);
 
-    /* Read the first character using blocking input, since using
-     * non-blocking input will eat up all unused CPU.  Then increment
+    /* If first is ERR, read the first character using blocking input,
+     * since using non-blocking input will eat up all unused CPU.
+     * Otherwise, treat first as the first character.  Then increment
      * v_len and save the character in v_kbinput. */
-    kbinput = wgetch(win);
+    if (first == ERR)
+       kbinput = wgetch(win);
+    else
+       kbinput = first;
     (*v_len)++;
     v_kbinput[0] = kbinput;
 #ifdef DEBUG