]> git.wh0rd.org Git - nano.git/commitdiff
properly handle newlines read in via verbatim input at the statusbar
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Sun, 2 Jan 2005 22:35:31 +0000 (22:35 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Sun, 2 Jan 2005 22:35:31 +0000 (22:35 +0000)
prompt

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

ChangeLog
src/proto.h
src/winio.c

index 2c191bc4c700703d4d9f9c01def8f3cc36985003..39a4f04fae6996e2f5fa2ab090ee9e0750106d56 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -84,7 +84,8 @@ CVS code -
          from a patch for Pico by Eduardo Chappa, suggested by Ryan
          Dlugosz and Paul Adams)
        - Implement verbatim input for the statusbar prompt.  Changes to
-         do_statusbar_input(); new function
+         do_statusbar_input() and do_statusbar_output(); new functions
+         keys_to_buffer(), unparse_kbinput(), and
          do_statusbar_verbatim_input(). (DLR)
 - cut.c:
   do_cut_text()
index c5d7eb603ebb95cd5998e0463a5f729f3559edd9..330685f1aedf9325451f3ef4512695cd9472e32e 100644 (file)
@@ -542,6 +542,7 @@ void reset_kbinput(void);
 void get_buffer(WINDOW *win);
 size_t get_buffer_len(void);
 int *buffer_to_keys(buffer *input, size_t input_len);
+buffer *keys_to_buffer(int *input, size_t input_len);
 void unget_input(buffer *input, size_t input_len);
 void unget_kbinput(int kbinput, bool meta_key, bool func_key);
 buffer *get_input(WINDOW *win, size_t input_len);
@@ -560,6 +561,7 @@ int get_word_kbinput(int kbinput
 #endif
        );
 int get_control_kbinput(int kbinput);
+void unparse_kbinput(size_t pos, int *kbinput, size_t kbinput_len);
 int *get_verbatim_kbinput(WINDOW *win, size_t *kbinput_len);
 int *parse_verbatim_kbinput(WINDOW *win, size_t *kbinput_len);
 #ifndef DISABLE_MOUSE
@@ -582,8 +584,9 @@ void do_statusbar_left(void);
 void do_statusbar_backspace(void);
 void do_statusbar_delete(void);
 void do_statusbar_cut_text(void);
-void do_statusbar_verbatim_input(void);
-void do_statusbar_output(int *kbinput, size_t kbinput_len);
+void do_statusbar_verbatim_input(bool *got_enter);
+void do_statusbar_output(int *kbinput, size_t kbinput_len, bool
+       *got_enter);
 size_t xplustabs(void);
 size_t actual_x(const char *str, size_t xplus);
 size_t strnlenpt(const char *buf, size_t size);
index 23f5fe3a4f25ebd8369ec1fbc4620cccd0f88eb3..619a4c7dab115f1db9ca9b539ee89d3742297c6e 100644 (file)
@@ -244,6 +244,21 @@ int *buffer_to_keys(buffer *input, size_t input_len)
     return sequence;
 }
 
+/* Return the buffer equivalent of the key values in input, adding
+ * key_code values of FALSE to all of them. */
+buffer *keys_to_buffer(int *input, size_t input_len)
+{
+    buffer *sequence = (buffer *)nmalloc(input_len * sizeof(buffer));
+    size_t i;
+
+    for (i = 0; i < input_len; i++) {
+       sequence[i].key = input[i];
+       sequence[i].key_code = FALSE;
+    }
+
+    return sequence;
+}
+
 /* Add the contents of the keystroke buffer input to the default
  * keystroke buffer. */
 void unget_input(buffer *input, size_t input_len)
@@ -1376,6 +1391,21 @@ int get_control_kbinput(int kbinput)
     return retval;
 }
 
+/* Put the output-formatted key values in the input buffer kbinput back
+ * into the default keystroke buffer, starting at position pos, so that
+ * they can be parsed again. */
+void unparse_kbinput(size_t pos, int *kbinput, size_t kbinput_len)
+{
+    if (pos < kbinput_len - 1) {
+       size_t seq_len = kbinput_len - (kbinput_len - pos);
+       buffer *sequence = keys_to_buffer(&kbinput[pos + 1],
+               seq_len);
+
+       unget_input(sequence, seq_len);
+       free(sequence);
+    }
+}
+
 /* Read in a string of characters verbatim, and return the length of the
  * string in kbinput_len.  Assume nodelay(win) is FALSE. */
 int *get_verbatim_kbinput(WINDOW *win, size_t *kbinput_len)
@@ -1676,9 +1706,12 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
         * characters in the input buffer if it isn't empty. */
         if (*s_or_t == TRUE || get_buffer_len() == 0) {
            if (kbinput != NULL) {
+               bool got_enter;
+                       /* Whether we got the Enter key. */
+
                /* Display all the characters in the input buffer at
                 * once. */
-               do_statusbar_output(kbinput, kbinput_len);
+               do_statusbar_output(kbinput, kbinput_len, &got_enter);
 
                /* Empty the input buffer. */
                kbinput_len = 0;
@@ -1735,8 +1768,17 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
                         * isn't blank, and we're at the "Write File"
                         * prompt, disable verbatim input. */
                        if (!ISSET(RESTRICTED) || filename[0] == '\0' ||
-                               currshortcut != writefile_list)
-                           do_statusbar_verbatim_input();
+                               currshortcut != writefile_list) {
+                           bool got_enter;
+                               /* Whether we got the Enter key. */
+
+                           do_statusbar_verbatim_input(&got_enter);
+
+                           /* If we got the Enter key, set finished to
+                            * TRUE to indicate that we're done. */
+                           if (got_enter)
+                               *finished = TRUE;
+                       }
                        break;
                    }
                /* Handle the normal statusbar prompt shortcuts, setting
@@ -1832,21 +1874,24 @@ void do_statusbar_cut_text(void)
     statusbar_xend = 0;
 }
 
-void do_statusbar_verbatim_input(void)
+void do_statusbar_verbatim_input(bool *got_enter)
 {
     int *kbinput;      /* Used to hold verbatim input. */
     size_t kbinput_len;        /* Length of verbatim input. */
 
+    *got_enter = FALSE;
+
     /* Read in all the verbatim characters. */
     kbinput = get_verbatim_kbinput(bottomwin, &kbinput_len);
 
     /* Display all the verbatim characters at once. */
-    do_statusbar_output(kbinput, kbinput_len);
+    do_statusbar_output(kbinput, kbinput_len, got_enter);
 
     free(kbinput);
 }
 
-void do_statusbar_output(int *kbinput, size_t kbinput_len)
+void do_statusbar_output(int *kbinput, size_t kbinput_len, bool
+       *got_enter)
 {
     size_t i;
 
@@ -1858,6 +1903,8 @@ void do_statusbar_output(int *kbinput, size_t kbinput_len)
 
     assert(answer != NULL);
 
+    *got_enter = FALSE;
+
     for (i = 0; i < kbinput_len; i++) {
        int key_len;
 
@@ -1865,10 +1912,14 @@ void do_statusbar_output(int *kbinput, size_t kbinput_len)
        if (kbinput[i] == '\0')
            kbinput[i] = '\n';
        /* Newline to Enter, if needed. */
-       else if (kbinput[i] == '\n')
-           /* FIXME: We need to indicate when this happens, so that we
-            * can break out of the statusbar prompt properly. */
+       else if (kbinput[i] == '\n') {
+           /* Set got_enter to TRUE to indicate that we got the Enter
+            * key, put back the rest of the keystrokes in kbinput so
+            * that they can be parsed again, and get out. */
+           *got_enter = TRUE;
+           unparse_kbinput(i, kbinput, kbinput_len);
            return;
+       }
 
 #ifdef NANO_WIDE
        /* Change the wide character to its multibyte value.  If it's