diff options
author | dequis <dx@dxzone.com.ar> | 2015-09-17 00:54:13 -0300 |
---|---|---|
committer | dequis <dx@dxzone.com.ar> | 2015-09-27 16:08:07 -0300 |
commit | 52729ca3da6ca594d710f58f252ac6cd6952fab0 (patch) | |
tree | 6bdd8161a1d43202295aae782af81e5defc9ed90 /src/fe-text/gui-readline.c | |
parent | 9a6b2dedcce165211892b39cf7455314dfde57fb (diff) | |
download | irssi-52729ca3da6ca594d710f58f252ac6cd6952fab0.zip |
Save the part of the paste buffer after the bp_end marker for later
Also move relevant code to a paste_bracketed_end() function
Diffstat (limited to 'src/fe-text/gui-readline.c')
-rw-r--r-- | src/fe-text/gui-readline.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/src/fe-text/gui-readline.c b/src/fe-text/gui-readline.c index 51b9f758..61cdad1a 100644 --- a/src/fe-text/gui-readline.c +++ b/src/fe-text/gui-readline.c @@ -61,6 +61,7 @@ static int paste_detect_time, paste_verify_line_count; static char *paste_entry; static int paste_entry_pos; static GArray *paste_buffer; +static GArray *paste_buffer_rest; static char *paste_old_prompt; static int paste_prompt, paste_line_count; @@ -331,6 +332,12 @@ static void paste_flush(int send) paste_send(); g_array_set_size(paste_buffer, 0); + /* re-add anything that may have been after the bracketed paste end */ + if (paste_buffer_rest->len) { + g_array_append_vals(paste_buffer, paste_buffer_rest->data, paste_buffer_rest->len); + g_array_set_size(paste_buffer_rest, 0); + } + gui_entry_set_prompt(active_entry, paste_old_prompt == NULL ? "" : paste_old_prompt); g_free(paste_old_prompt); paste_old_prompt = NULL; @@ -643,6 +650,26 @@ static gboolean paste_timeout(gpointer data) return FALSE; } +static void paste_bracketed_end(int i, gboolean rest) +{ + /* if there's stuff after the end bracket, save it for later */ + if (rest) { + unichar *start = ((unichar *) paste_buffer->data) + i + G_N_ELEMENTS(bp_end); + int len = paste_buffer->len - G_N_ELEMENTS(bp_end); + + g_array_set_size(paste_buffer_rest, 0); + g_array_append_vals(paste_buffer_rest, start, len); + } + + /* remove the rest, including the trailing sequence chars */ + g_array_set_size(paste_buffer, i); + + /* decide what to do with the buffer */ + paste_timeout(NULL); + + paste_bracketed_mode = FALSE; +} + static void sig_input(void) { if (!active_entry) { @@ -676,13 +703,7 @@ static void sig_input(void) for (i = 0; i <= len; i++, ptr++) { if (ptr[0] == bp_end[0] && !memcmp(ptr, bp_end, sizeof(bp_end))) { - /* remove the trailing sequence chars */ - g_array_set_size(paste_buffer, i); - - /* decide what to do with the buffer */ - paste_timeout(NULL); - - paste_bracketed_mode = FALSE; + paste_bracketed_end(i, i != len); break; } } @@ -993,6 +1014,7 @@ void gui_readline_init(void) paste_entry = NULL; paste_entry_pos = 0; paste_buffer = g_array_new(FALSE, FALSE, sizeof(unichar)); + paste_buffer_rest = g_array_new(FALSE, FALSE, sizeof(unichar)); paste_old_prompt = NULL; paste_timeout_id = -1; paste_bracketed_mode = FALSE; @@ -1228,6 +1250,7 @@ void gui_readline_deinit(void) key_unbind("stop_irc", (SIGNAL_FUNC) key_sig_stop); keyboard_destroy(keyboard); g_array_free(paste_buffer, TRUE); + g_array_free(paste_buffer_rest, TRUE); key_configure_thaw(); |