From d9ad76ba3c84896394ae8de15d6f9ef9633f775d Mon Sep 17 00:00:00 2001 From: David Lawrence Ramsey Date: Sun, 2 Jan 2005 22:35:31 +0000 Subject: [PATCH] properly handle newlines read in via verbatim input at the statusbar prompt git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2216 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- ChangeLog | 3 ++- src/proto.h | 7 ++++-- src/winio.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 67 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2c191bc4..39a4f04f 100644 --- 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() diff --git a/src/proto.h b/src/proto.h index c5d7eb60..330685f1 100644 --- a/src/proto.h +++ b/src/proto.h @@ -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); diff --git a/src/winio.c b/src/winio.c index 23f5fe3a..619a4c7d 100644 --- a/src/winio.c +++ b/src/winio.c @@ -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 -- 2.39.5