mirror of
https://github.com/irssi/irssi.git
synced 2026-08-21 01:22:26 +02:00
Merge pull request #426 from Manishearth/paste-split
Make pasting warning appear when long pastes are going to be split into many lines
This commit is contained in:
commit
8f1f1d879f
1 changed files with 27 additions and 6 deletions
|
|
@ -40,6 +40,9 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
|
/* After LINE_SPLIT_LIMIT characters, the message will be split into multiple lines */
|
||||||
|
#define LINE_SPLIT_LIMIT 400
|
||||||
|
|
||||||
typedef void (*ENTRY_REDIRECT_KEY_FUNC) (int key, void *data, SERVER_REC *server, WI_ITEM_REC *item);
|
typedef void (*ENTRY_REDIRECT_KEY_FUNC) (int key, void *data, SERVER_REC *server, WI_ITEM_REC *item);
|
||||||
typedef void (*ENTRY_REDIRECT_ENTRY_FUNC) (const char *line, void *data, SERVER_REC *server, WI_ITEM_REC *item);
|
typedef void (*ENTRY_REDIRECT_ENTRY_FUNC) (const char *line, void *data, SERVER_REC *server, WI_ITEM_REC *item);
|
||||||
|
|
||||||
|
|
@ -227,7 +230,7 @@ static void paste_buffer_join_lines(GArray *buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* all looks fine - now remove the whitespace, but don't let lines
|
/* all looks fine - now remove the whitespace, but don't let lines
|
||||||
get longer than 400 chars */
|
get longer than LINE_SPLIT_LIMIT chars */
|
||||||
dest = arr; last_lf = TRUE; last_lf_pos = NULL; line_len = 0;
|
dest = arr; last_lf = TRUE; last_lf_pos = NULL; line_len = 0;
|
||||||
for (i = 0; i < buf->len; i++) {
|
for (i = 0; i < buf->len; i++) {
|
||||||
if (last_lf && isblank(arr[i])) {
|
if (last_lf && isblank(arr[i])) {
|
||||||
|
|
@ -245,7 +248,7 @@ static void paste_buffer_join_lines(GArray *buf)
|
||||||
last_lf = TRUE;
|
last_lf = TRUE;
|
||||||
} else {
|
} else {
|
||||||
last_lf = FALSE;
|
last_lf = FALSE;
|
||||||
if (++line_len >= 400 && last_lf_pos != NULL) {
|
if (++line_len >= LINE_SPLIT_LIMIT && last_lf_pos != NULL) {
|
||||||
memmove(last_lf_pos+1, last_lf_pos,
|
memmove(last_lf_pos+1, last_lf_pos,
|
||||||
(dest - last_lf_pos) * sizeof(unichar));
|
(dest - last_lf_pos) * sizeof(unichar));
|
||||||
*last_lf_pos = '\n'; last_lf_pos = NULL;
|
*last_lf_pos = '\n'; last_lf_pos = NULL;
|
||||||
|
|
@ -357,11 +360,24 @@ static void insert_paste_prompt(void)
|
||||||
{
|
{
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
|
/* The actual number of lines that will show up post-line-split */
|
||||||
|
int actual_line_count = paste_line_count;
|
||||||
|
int split_lines = paste_buffer->len / LINE_SPLIT_LIMIT;
|
||||||
|
|
||||||
|
/* in case this prompt is happening due to line-splitting, calculate the
|
||||||
|
number of lines obtained from this. The number isn't entirely accurate;
|
||||||
|
we just choose the greater of the two since the exact value isn't
|
||||||
|
important */
|
||||||
|
if (split_lines > paste_verify_line_count &&
|
||||||
|
split_lines > paste_line_count) {
|
||||||
|
actual_line_count = split_lines;
|
||||||
|
}
|
||||||
|
|
||||||
paste_prompt = TRUE;
|
paste_prompt = TRUE;
|
||||||
paste_old_prompt = g_strdup(active_entry->prompt);
|
paste_old_prompt = g_strdup(active_entry->prompt);
|
||||||
printformat_window(active_win, MSGLEVEL_CLIENTNOTICE,
|
printformat_window(active_win, MSGLEVEL_CLIENTNOTICE,
|
||||||
TXT_PASTE_WARNING,
|
TXT_PASTE_WARNING,
|
||||||
paste_line_count,
|
actual_line_count,
|
||||||
active_win->active == NULL ? "window" :
|
active_win->active == NULL ? "window" :
|
||||||
active_win->active->visible_name);
|
active_win->active->visible_name);
|
||||||
|
|
||||||
|
|
@ -638,7 +654,11 @@ static gboolean paste_timeout(gpointer data)
|
||||||
{
|
{
|
||||||
paste_was_bracketed_mode = paste_bracketed_mode;
|
paste_was_bracketed_mode = paste_bracketed_mode;
|
||||||
|
|
||||||
if (paste_line_count == 0) {
|
/* number of lines after splitting extra-long messages */
|
||||||
|
int split_lines = paste_buffer->len / LINE_SPLIT_LIMIT;
|
||||||
|
|
||||||
|
/* Take into account the fact that a line may be split every LINE_SPLIT_LIMIT characters */
|
||||||
|
if (paste_line_count == 0 && split_lines <= paste_verify_line_count) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < paste_buffer->len; i++) {
|
for (i = 0; i < paste_buffer->len; i++) {
|
||||||
|
|
@ -647,7 +667,8 @@ static gboolean paste_timeout(gpointer data)
|
||||||
}
|
}
|
||||||
g_array_set_size(paste_buffer, 0);
|
g_array_set_size(paste_buffer, 0);
|
||||||
} else if (paste_verify_line_count > 0 &&
|
} else if (paste_verify_line_count > 0 &&
|
||||||
paste_line_count >= paste_verify_line_count &&
|
(paste_line_count >= paste_verify_line_count ||
|
||||||
|
split_lines > paste_verify_line_count) &&
|
||||||
active_win->active != NULL)
|
active_win->active != NULL)
|
||||||
insert_paste_prompt();
|
insert_paste_prompt();
|
||||||
else
|
else
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue