]> git.wh0rd.org Git - nano.git/commitdiff
remove malfunctioning wide character support, and add a few
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 29 Nov 2004 00:30:07 +0000 (00:30 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 29 Nov 2004 00:30:07 +0000 (00:30 +0000)
miscellaneous fixes

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

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

index 10d13730e03c5c0d4c3f18ab68883f66e71eda3e..081efd78fdf230533f25a5156fa4f6fc0a58c96a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -58,17 +58,38 @@ CVS code -
          instead of setting it to 0. (DLR)
 - winio.c:
   unget_kbinput()
-       - Free s after the wctomb() call, since we don't need it after
-         that. (DLR)
+       - Remove the wide character handling, as it didn't work properly
+         with respect to function keys. (DLR)
   get_kbinput(), get_translated_kbinput(), get_ascii_kbinput(),
   get_untranslated_kbinput()
        - Make the ascii_digits variables ints instead of size_t's,
          since they will only hold very small values. (DLR)
+  get_kbinput()
+       - Remove the wide character handling, as it didn't work properly
+         with respect to adding multiple wide characters at once, and
+         ungetting them just caused other problems elsewhere. (DLR)
+  get_translated_kbinput()
+       - Remove the wide character handling, as it didn't work properly
+         with respect to adding multiple wide characters at once, and
+         ungetting them just caused other problems elsewhere. (DLR)
+       - Use if statements instead of switch/case statements to handle
+         ASCII character sequence mode, as they take up less room.
+  get_ascii_kbinput()
+       - Use if statements instead of switch/case statements to handle
+         ASCII character sequence mode, as they take up less room.
   get_verbatim_kbinput()
        - Don't pass v_kbinput in as a parameter, since we're
          dynamically allocating it and then returning it. (DLR)
-  get_shortcut(), get_toggle()
-       - Add debug messages. (DLR)
+       - Remove v_first parameter, and go back to the old behavior of
+         putting back the first character of the escape sequence, as it
+         worked just as well and was less complicated. (DLR)
+  get_shortcut()
+       - Add debug message. (DLR)
+       - Take kbinput as a reference instead of a value, so that it's
+         translated when the key is translated to its equivalent
+         control key or meta key shortcut. (DLR)
+  get_toggle()
+       - Add debug message. (DLR)
 - configure.ac:
        - Remove specific references to control key shortcuts. (DLR)
 
index 7e054ec51a7238e4666a72ce705b719f1fe5bc77..29c6b52f7e3c50a7505c39e831c569d6f23b1dec 100644 (file)
@@ -2583,7 +2583,7 @@ char *do_browser(const char *inpath)
                    selected = numents - 1;
                else if (selectedbackup == selected)
                    /* Put back the 'select' key */
-                   unget_kbinput('s', FALSE, FALSE);
+                   unget_kbinput('s', FALSE);
            } else {
                /* Must be clicking a shortcut */
                int mouse_x, mouse_y;
index 2952405a59a99fe38952b99c41ec85c107b78d29..0b386c21bfdb7f1881923f87db26dd6424447aa8 100644 (file)
@@ -1225,7 +1225,7 @@ void do_verbatim_input(void)
 
     statusbar(_("Verbatim input"));
 
-    v_kbinput = get_verbatim_kbinput(edit, ERR, &v_len, TRUE);
+    v_kbinput = get_verbatim_kbinput(edit, &v_len, TRUE);
 
     /* Turn on DISABLE_CURPOS while inserting character(s) and turn it
      * off afterwards, so that if constant cursor position display is
@@ -3082,7 +3082,7 @@ void do_justify(bool full_justify)
            edit_refresh();
        }
     } else {
-       unget_kbinput(kbinput, meta_key, func_key);
+       unget_kbinput(kbinput, meta_key);
 
        /* Blow away the text in the justify buffer. */
        free_filestruct(jusbuffer);
index 0289605b86fa982567a8a2fcdc79bf7d5b0f779a..c8e0d12aacc7c1016ac12703a6c2450b51253743 100644 (file)
@@ -157,10 +157,6 @@ typedef enum {
     TOP, CENTER, NONE
 } topmidnone;
 
-typedef enum {
-    NO_SEQ, ESCAPE_SEQ, UTF8_SEQ
-} seq_type;
-
 /* Structure types. */
 typedef struct filestruct {
     char *data;
index d255948044834baa0f733c9bfaa06ddf4a2a5535..18ea60dd8cd002de8bd5f2498a8509c2288698a2 100644 (file)
@@ -524,9 +524,9 @@ int check_wildcard_match(const char *text, const char *pattern);
 #ifndef NANO_SMALL
 void reset_kbinput(void);
 #endif
-void unget_kbinput(int kbinput, bool meta_key, bool func_key);
+void unget_kbinput(int kbinput, bool meta_key);
 int get_kbinput(WINDOW *win, bool *meta_key, bool *func_key);
-int get_translated_kbinput(int kbinput, seq_type *seq
+int get_translated_kbinput(int kbinput, bool *escape_seq
 #ifndef NANO_SMALL
        , bool reset
 #endif
@@ -540,8 +540,7 @@ int get_control_kbinput(int kbinput);
 int get_escape_seq_kbinput(const 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_first, size_t *v_len, bool
-       allow_ascii);
+int *get_verbatim_kbinput(WINDOW *win, size_t *v_len, bool allow_ascii);
 int get_untranslated_kbinput(int kbinput, size_t position, bool
        allow_ascii
 #ifndef NANO_SMALL
@@ -551,7 +550,7 @@ int get_untranslated_kbinput(int kbinput, size_t position, bool
 #ifndef DISABLE_MOUSE
 bool get_mouseinput(int *mouse_x, int *mouse_y, bool allow_shortcuts);
 #endif
-const shortcut *get_shortcut(const shortcut *s_list, int kbinput, bool
+const shortcut *get_shortcut(const shortcut *s_list, int *kbinput, bool
        *meta_key, bool *func_key);
 #ifndef NANO_SMALL
 const toggle *get_toggle(int kbinput, bool meta_key);
index 92431ad5594abac1adb1c4ff73c4675e77175558..60866bb7619be8fff90e4f5237ce6af4badb8583 100644 (file)
@@ -113,29 +113,9 @@ void reset_kbinput(void)
 
 /* Put back the input character stored in kbinput.  If meta_key is TRUE,
  * put back the Escape character after putting back kbinput. */
-void unget_kbinput(int kbinput, bool meta_key, bool func_key)
+void unget_kbinput(int kbinput, bool meta_key)
 {
-    /* If this character is outside the ASCII range and func_key is
-     * FALSE, treat it as a wide character and put back its equivalent
-     * UTF-8 sequence. */
-    if (kbinput > 255 && !func_key)
-    {
-       int i;
-       char *s = charalloc(MB_CUR_MAX + 1);
-       wchar_t wc = (wchar_t)kbinput;
-
-       i = wctomb(s, wc);
-       free(s);
-
-       if (i == -1)
-           /* This wide character is unrecognized.  Send it back. */
-           ungetch(kbinput);
-       else {
-           for (; i > 0; i--)
-               ungetch(s[i - 1]);
-       }
-    } else
-       ungetch(kbinput);
+    ungetch(kbinput);
     if (meta_key)
        ungetch(NANO_CONTROL_3);
 }
@@ -152,7 +132,7 @@ void unget_kbinput(int kbinput, bool meta_key, bool func_key)
 int get_kbinput(WINDOW *win, bool *meta_key, bool *func_key)
 {
     int kbinput, retval = ERR;
-    seq_type seq;
+    bool escape_seq;
 
 #ifndef NANO_SMALL
     allow_pending_sigwinch(TRUE);
@@ -167,83 +147,55 @@ int get_kbinput(WINDOW *win, bool *meta_key, bool *func_key)
         * to get_translated_kbinput().  Continue until we get a
         * complete sequence. */
        kbinput = wgetch(win);
-       retval = get_translated_kbinput(kbinput, &seq
+       retval = get_translated_kbinput(kbinput, &escape_seq
 #ifndef NANO_SMALL
                , FALSE
 #endif
                );
 
-       /* If we have a complete sequence now, we should interpret its
+       /* If we got a complete non-escape sequence, interpret the
         * translated value instead of the value of the last character
-        * we got. */
-       if (retval != ERR)
+        * we got.  Set func_key to TRUE if the translated value is
+        * outside byte range. */
+       if (retval != ERR) {
+           *func_key = (retval > 255);
            kbinput = retval;
+       }
 
-       /* If we got a one-character sequence and it's outside the ASCII
-        * range, set func_key to TRUE. */
-       if (seq == NO_SEQ) {
-           if (kbinput > 255)
-               *func_key = TRUE;
-       /* If we got a multi-character sequence, read it in, including
-        * the initial character, as verbatim input. */
-       } else {
-           int *sequence = NULL;
+       /* If we got an incomplete escape sequence, put back the initial
+        * non-escape and then read the entire sequence in as verbatim
+        * input. */
+       if (escape_seq) {
+           int *sequence;
            size_t seq_len;
 
-           sequence = get_verbatim_kbinput(win, kbinput, &seq_len,
-               FALSE);
-
-           /* Handle escape sequences. */
-           if (seq == ESCAPE_SEQ) {
-               /* If the escape sequence is one character long, set
-                * meta_key to TRUE, make the sequence character
-                * lowercase, and save that as the result. */
-               if (seq_len == 1) {
-                   *meta_key = TRUE;
-                   retval = tolower(kbinput);
-               /* If the escape sequence is more than one character
-                * long, set func_key to TRUE, translate the escape
-                * sequence into the corresponding key value, and save
-                * that as the result. */
-               } else if (seq_len > 1) {
-                   bool ignore_seq;
-
-                   *func_key = TRUE;
-                   retval = get_escape_seq_kbinput(sequence, seq_len,
+           unget_kbinput(kbinput, FALSE);
+           sequence = get_verbatim_kbinput(win, &seq_len, FALSE);
+
+           /* If the escape sequence is one character long, set
+            * meta_key to TRUE, make the sequence character lowercase,
+            * and save that as the result. */
+           if (seq_len == 1) {
+               *meta_key = TRUE;
+               retval = tolower(kbinput);
+           /* If the escape sequence is more than one character long,
+            * set func_key to TRUE, translate the escape sequence into
+            * the corresponding key value, and save that as the
+            * result. */
+           } else if (seq_len > 1) {
+               bool ignore_seq;
+
+               *func_key = TRUE;
+               retval = get_escape_seq_kbinput(sequence, seq_len,
                        &ignore_seq);
 
-                   if (retval == ERR && !ignore_seq) {
-                       /* This escape sequence is unrecognized.  Send
-                        * it back. */
-                       for (; seq_len > 1; seq_len--)
-                           unget_kbinput(sequence[seq_len - 1], FALSE,
-                               FALSE);
-                       retval = sequence[0];
-                   }
-               }
-           /* Handle UTF-8 sequences. */
-           } else if (seq == UTF8_SEQ) {
-               /* If we have a UTF-8 sequence, translate the UTF-8
-                * sequence into the corresponding wide character value,
-                * and save that as the result. */
-               int i = 0;
-               char *s = charalloc(seq_len + 1);
-               wchar_t wc;
-
-               for (; i < seq_len; i++)
-                   s[i] = (char)sequence[i];
-               s[seq_len] = '\0';
-
-               if (mbtowc(&wc, s, MB_CUR_MAX) == -1) {
-                   /* This UTF-8 sequence is unrecognized.  Send it
+               if (retval == ERR && !ignore_seq) {
+                   /* This escape sequence is unrecognized.  Send it
                     * back. */
                    for (; seq_len > 1; seq_len--)
-                       unget_kbinput(sequence[seq_len - 1], FALSE,
-                               FALSE);
+                       unget_kbinput(sequence[seq_len - 1], FALSE);
                    retval = sequence[0];
-               } else
-                   retval = wc;
-               free(s);
+               }
            }
            free(sequence);
        }
@@ -260,11 +212,11 @@ int get_kbinput(WINDOW *win, bool *meta_key, bool *func_key)
     return retval;
 }
 
-/* Translate acceptable ASCII, extended keypad values, and escape and
- * UTF-8 sequences into their corresponding key values.  Set seq to
- * ESCAPE_SEQ when we get an escape sequence, or UTF8_SEQ when we get a
- * UTF-8 sequence.  Assume nodelay(win) is FALSE. */
-int get_translated_kbinput(int kbinput, seq_type *seq
+/* Translate acceptable ASCII, extended keypad values, and escape
+ * sequences into their corresponding key values.  Set escape_seq to
+ * TRUE when we get an incomplete escape sequence.  Assume nodelay(win)
+ * is FALSE. */
+int get_translated_kbinput(int kbinput, bool *escape_seq
 #ifndef NANO_SMALL
        , bool reset
 #endif
@@ -282,7 +234,7 @@ int get_translated_kbinput(int kbinput, seq_type *seq
     }
 #endif
 
-    *seq = NO_SEQ;
+    *escape_seq = FALSE;
 
     switch (kbinput) {
        case ERR:
@@ -420,86 +372,70 @@ int get_translated_kbinput(int kbinput, seq_type *seq
                case 1:
                    /* One escape followed by a non-escape: escape
                     * sequence mode.  Reset the escape counter and set
-                    * seq to ESCAPE_SEQ. */
+                    * escape_seq to TRUE. */
                    escapes = 0;
-                   *seq = ESCAPE_SEQ;
+                   *escape_seq = TRUE;
                    break;
                case 2:
-                   switch (kbinput) {
-                       case '0':
-                       case '1':
-                       case '2':
-                       case '3':
-                       case '4':
-                       case '5':
-                       case '6':
-                       case '7':
-                       case '8':
-                       case '9':
-                           /* Two escapes followed by one or more
-                            * digits: ASCII character sequence mode.
-                            * If the digit sequence's range is limited
-                            * to 2XX (the first digit is in the '0' to
-                            * '2' range and it's the first digit, or if
-                            * it's in the full digit range and it's not
-                            * the first digit), increment the ASCII
-                            * digit counter and interpret the digit.
-                            * If the digit sequence's range is not
-                            * limited to 2XX, fall through. */
-                           if (kbinput <= '2' || ascii_digits > 0) {
-                               ascii_digits++;
-                               kbinput = get_ascii_kbinput(kbinput,
-                                       ascii_digits
+                   if (kbinput >= '0' && kbinput <= '9') {
+                       /* Two escapes followed by one or more decimal
+                        * digits: ASCII character sequence mode.  If
+                        * the digit sequence's range is limited to 2XX
+                        * (the first digit is in the '0' to '2' range
+                        * and it's the first digit, or if it's in the
+                        * full digit range and it's not the first
+                        * digit), increment the ASCII digit counter and
+                        * interpret the digit.  If the digit sequence's
+                        * range is not limited to 2XX, fall through. */
+                       if (kbinput <= '2' || ascii_digits > 0) {
+                           ascii_digits++;
+                           kbinput = get_ascii_kbinput(kbinput,
+                               ascii_digits
 #ifndef NANO_SMALL
-                                       , FALSE
-#endif
-                                       );
-
-                               if (kbinput != ERR) {
-                                   /* If we've read in a complete ASCII
-                                    * digit sequence, reset the ASCII
-                                    * digit counter and the escape
-                                    * counter and save the corresponding
-                                    * ASCII character as the result. */
-                                   ascii_digits = 0;
-                                   escapes = 0;
-                                   retval = kbinput;
-                               }
-                           }
-                           break;
-                       default:
-                           /* Reset the escape counter. */
-                           escapes = 0;
-                           if (ascii_digits == 0)
-                               /* Two escapes followed by a non-decimal
-                                * digit or a decimal digit that would
-                                * create an ASCII digit sequence
-                                * greater than 2XX, and we're not in
-                                * the middle of an ASCII character
-                                * sequence: control character sequence
-                                * mode.  Interpret the control sequence
-                                * and save the corresponding control
+                               , FALSE
+#endif
+                               );
+
+                           if (kbinput != ERR) {
+                               /* If we've read in a complete ASCII
+                                * digit sequence, reset the ASCII digit
+                                * counter and the escape counter and
+                                * save the corresponding ASCII
                                 * character as the result. */
-                               retval = get_control_kbinput(kbinput);
-                           else {
-                               /* If we were in the middle of an ASCII
-                                * character sequence, reset the ASCII
-                                * digit counter and save the character
-                                * we got as the result. */
                                ascii_digits = 0;
+                               escapes = 0;
                                retval = kbinput;
                            }
+                       }
+                   } else {
+                       /* Reset the escape counter. */
+                       escapes = 0;
+                       if (ascii_digits == 0)
+                           /* Two escapes followed by a non-decimal
+                            * digit or a decimal digit that would
+                            * create an ASCII digit sequence greater
+                            * than 2XX, and we're not in the middle of
+                            * an ASCII character sequence: control
+                            * character sequence mode.  Interpret the
+                            * control sequence and save the
+                            * corresponding control character as the
+                            * result. */
+                           retval = get_control_kbinput(kbinput);
+                       else {
+                           /* If we were in the middle of an ASCII
+                            * character sequence, reset the ASCII digit
+                            * counter and save the character we got as
+                            * the result. */
+                           ascii_digits = 0;
+                           retval = kbinput;
+                       }
                    }
+                   break;
            }
     }
 
-    /* A character other than ERR with its high bit set: UTF-8 sequence
-     * mode.  Set seq to UTF8_SEQ. */
-    if (retval != ERR && 127 < retval && retval <= 255)
-       *seq = UTF8_SEQ;
-
 #ifdef DEBUG
-    fprintf(stderr, "get_translated_kbinput(): kbinput = %d, seq = %d, escapes = %d, ascii_digits = %d, retval = %d\n", kbinput, (int)*seq, escapes, ascii_digits, retval);
+    fprintf(stderr, "get_translated_kbinput(): kbinput = %d, escape_seq = %d, escapes = %d, ascii_digits = %d, retval = %d\n", kbinput, (int)*escape_seq, escapes, ascii_digits, retval);
 #endif
 
     /* Return the result. */
@@ -527,70 +463,42 @@ int get_ascii_kbinput(int kbinput, int ascii_digits
     switch (ascii_digits) {
        case 1:
            /* Read in the first of the three ASCII digits. */
-           switch (kbinput) {
-               /* Add the digit we got to the 100's position of the
-                * ASCII character sequence holder. */
-               case '0':
-               case '1':
-               case '2':
-                   ascii_kbinput += (kbinput - '0') * 100;
-                   break;
-               default:
-                   retval = kbinput;
-           }
+
+           /* Add the digit we got to the 100's position of the ASCII
+            * character sequence holder. */
+           if ('0' <= kbinput && kbinput <= '2')
+               ascii_kbinput += (kbinput - '0') * 100;
+           else
+               retval = kbinput;
            break;
        case 2:
            /* Read in the second of the three ASCII digits. */
-           switch (kbinput) {
-               /* Add the digit we got to the 10's position of the
-                * ASCII character sequence holder. */
-               case '0':
-               case '1':
-               case '2':
-               case '3':
-               case '4':
-               case '5':
-                   ascii_kbinput += (kbinput - '0') * 10;
-                   break;
-               case '6':
-               case '7':
-               case '8':
-               case '9':
-                   if (ascii_kbinput < 200) {
-                       ascii_kbinput += (kbinput - '0') * 10;
-                       break;
-                   }
-               default:
-                   retval = kbinput;
-           }
+
+           /* Add the digit we got to the 10's position of the ASCII
+            * character sequence holder. */
+           if (('0' <= kbinput && kbinput <= '5') ||
+               (ascii_kbinput < 200 && '6' <= kbinput &&
+               kbinput <= '9'))
+               ascii_kbinput += (kbinput - '0') * 10;
+           else
+               retval = kbinput;
            break;
        case 3:
            /* Read in the third of the three ASCII digits. */
-           switch (kbinput) {
-               /* Add the digit we got to the 1's position of the ASCII
-                * character sequence holder, and save the corresponding
-                * ASCII character as the result. */
-               case '0':
-               case '1':
-               case '2':
-               case '3':
-               case '4':
-               case '5':
-                   ascii_kbinput += (kbinput - '0');
-                   retval = ascii_kbinput;
-                   break;
-               case '6':
-               case '7':
-               case '8':
-               case '9':
-                   if (ascii_kbinput < 250) {
-                       ascii_kbinput += (kbinput - '0');
-                       retval = ascii_kbinput;
-                       break;
-                   }
-               default:
-                   retval = kbinput;
-           }
+
+           /* Add the digit we got to the 1's position of the ASCII
+            * character sequence holder, and save the corresponding
+            * ASCII character as the result. */
+           if (('0' <= kbinput && kbinput <= '5') ||
+               (ascii_kbinput < 250 && '6' <= kbinput &&
+               kbinput <= '9')) {
+               ascii_kbinput += (kbinput - '0');
+               retval = ascii_kbinput;
+           } else
+               retval = kbinput;
+           break;
+       default:
+           retval = kbinput;
            break;
     }
 
@@ -1169,11 +1077,9 @@ int get_escape_seq_abcd(int kbinput)
 }
 
 /* Read in a string of input characters (e.g. an escape sequence)
- * verbatim.  If v_first isn't ERR, make it the first character of the
- * string.  Return the length of the string in v_len.  Assume
+ * verbatim.  Return the length of the string in v_len.  Assume
  * nodelay(win) is FALSE. */
-int *get_verbatim_kbinput(WINDOW *win, int v_first, size_t *v_len, bool
-       allow_ascii)
+int *get_verbatim_kbinput(WINDOW *win, size_t *v_len, bool allow_ascii)
 {
     int kbinput, *v_kbinput;
     size_t i = 0, v_newlen = 0;
@@ -1193,15 +1099,12 @@ int *get_verbatim_kbinput(WINDOW *win, int v_first, size_t *v_len, bool
     keypad(win, FALSE);
 
     /* If first is ERR, read the first character using blocking input,
-     * since using non-blocking input will eat up all unused CPU.
-     * Otherwise, treat v_first as the first character.  Then increment
-     * v_len and save the character in v_kbinput. */
-    if (v_first == ERR)
-       kbinput = wgetch(win);
-    else
-       kbinput = v_first;
+     * since using non-blocking input will eat up all unused CPU.  Then
+     * increment v_len and save the character in v_kbinput. */
+    kbinput = wgetch(win);
     (*v_len)++;
     v_kbinput[0] = kbinput;
+
 #ifdef DEBUG
     fprintf(stderr, "get_verbatim_kbinput(): kbinput = %d, v_len = %lu\n", kbinput, (unsigned long)*v_len);
 #endif
@@ -1422,9 +1325,9 @@ bool get_mouseinput(int *mouse_x, int *mouse_y, bool allow_shortcuts)
         * has, at the very least, an equivalent control key, an
         * equivalent primary meta key sequence, or both. */
        if (s->ctrlval != NANO_NO_KEY)
-           unget_kbinput(s->ctrlval, FALSE, FALSE);
+           unget_kbinput(s->ctrlval, FALSE);
        else if (s->metaval != NANO_NO_KEY)
-           unget_kbinput(s->metaval, TRUE, FALSE);
+           unget_kbinput(s->metaval, TRUE);
 
        return TRUE;
     }
@@ -1432,14 +1335,14 @@ bool get_mouseinput(int *mouse_x, int *mouse_y, bool allow_shortcuts)
 }
 #endif /* !DISABLE_MOUSE */
 
-const shortcut *get_shortcut(const shortcut *s_list, int kbinput, bool
+const shortcut *get_shortcut(const shortcut *s_list, int *kbinput, bool
        *meta_key, bool *func_key)
 {
     const shortcut *s = s_list;
     size_t slen = length_of_list(s_list);
 
 #ifdef DEBUG
-    fprintf(stderr, "get_shortcut(): kbinput = %d, meta_key = %d, func_key = %d\n", kbinput, (int)*meta_key, (int)*func_key);
+    fprintf(stderr, "get_shortcut(): kbinput = %d, meta_key = %d, func_key = %d\n", *kbinput, (int)*meta_key, (int)*func_key);
 #endif
 
     /* Check for shortcuts. */
@@ -1453,10 +1356,10 @@ const shortcut *get_shortcut(const shortcut *s_list, int kbinput, bool
         * 4. func_key is TRUE and the key is a function key in the
         *    shortcut list. */
 
-       if (kbinput != NANO_NO_KEY && (kbinput == s->ctrlval ||
-               (*meta_key == TRUE && (kbinput == s->metaval ||
-               kbinput == s->miscval)) || (*func_key == TRUE &&
-               kbinput == s->funcval))) {
+       if (*kbinput != NANO_NO_KEY && (*kbinput == s->ctrlval ||
+               (*meta_key == TRUE && (*kbinput == s->metaval ||
+               *kbinput == s->miscval)) || (*func_key == TRUE &&
+               *kbinput == s->funcval))) {
            break;
        }
 
@@ -1469,10 +1372,10 @@ const shortcut *get_shortcut(const shortcut *s_list, int kbinput, bool
     if (slen > 0) {
        if (s->ctrlval != NANO_NO_KEY) {
            *meta_key = FALSE;
-           kbinput = s->ctrlval;
+           *kbinput = s->ctrlval;
        } else if (s->metaval != NANO_NO_KEY) {
            *meta_key = TRUE;
-           kbinput = s->metaval;
+           *kbinput = s->metaval;
        }
        return s;
     }
@@ -1538,7 +1441,7 @@ int get_edit_input(bool *meta_key, bool *func_key, bool allow_funcs)
     }
 
     /* Check for a shortcut in the main list. */
-    s = get_shortcut(main_list, kbinput, meta_key, func_key);
+    s = get_shortcut(main_list, &kbinput, meta_key, func_key);
 
     if (s != NULL) {
        /* We got a shortcut.  Run the shortcut's corresponding function