diff --git a/docs/signals.txt b/docs/signals.txt index ff600cd3..1eefc7e0 100644 --- a/docs/signals.txt +++ b/docs/signals.txt @@ -246,7 +246,7 @@ FE common "gui print text", WINDOW_REC, int fg, int bg, int flags, char *text, TEXT_DEST_REC (Can be used to determine when all "gui print text"s are sent (not required)) - "gui print text finished", WINDOW_REC + "gui print text finished", WINDOW_REC, TEXT_DEST_REC * Provides signals: @@ -353,7 +353,7 @@ gui-readline.c: gui-printtext.c: "beep" - "gui print text after finished", WINDOW_REC, LINE_REC *line, LINE_REC *prev_line + "gui print text after finished", WINDOW_REC, LINE_REC *line, LINE_REC *prev_line, TEXT_DEST_REC textbuffer-view.c "gui textbuffer line removed", TEXTBUFFER_VIEW_REC *view, LINE_REC *line, LINE_REC *prev_line diff --git a/src/common.h b/src/common.h index c9c4e545..73de4b78 100644 --- a/src/common.h +++ b/src/common.h @@ -6,7 +6,7 @@ #define IRSSI_GLOBAL_CONFIG "irssi.conf" /* config file name in /etc/ */ #define IRSSI_HOME_CONFIG "config" /* config file name in ~/.irssi/ */ -#define IRSSI_ABI_VERSION 29 +#define IRSSI_ABI_VERSION 30 #define DEFAULT_SERVER_ADD_PORT 6667 #define DEFAULT_SERVER_ADD_TLS_PORT 6697 diff --git a/src/fe-common/core/printtext.c b/src/fe-common/core/printtext.c index 06c22a4c..6869fba3 100644 --- a/src/fe-common/core/printtext.c +++ b/src/fe-common/core/printtext.c @@ -442,7 +442,7 @@ static void sig_print_text(TEXT_DEST_REC *dest, const char *text) format_send_to_gui(dest, str); g_free(str); - signal_emit_id(signal_gui_print_text_finished, 1, dest->window); + signal_emit_id(signal_gui_print_text_finished, 2, dest->window, dest); } static void sig_print_format(THEME_REC *theme, const char *module, TEXT_DEST_REC *dest, diff --git a/src/fe-text/gui-printtext.c b/src/fe-text/gui-printtext.c index 872c73c4..a92c6f3b 100644 --- a/src/fe-text/gui-printtext.c +++ b/src/fe-text/gui-printtext.c @@ -158,7 +158,8 @@ void gui_printtext_after_time(TEXT_DEST_REC *dest, LINE_REC *prev, const char *s gui->insert_after_time = time; format_send_to_gui(dest, str); gui->use_insert_after = FALSE; - signal_emit("gui print text after finished", 3, dest->window, gui->insert_after, prev); + signal_emit("gui print text after finished", 4, dest->window, gui->insert_after, prev, + dest); } void gui_printtext_after(TEXT_DEST_REC *dest, LINE_REC *prev, const char *str) @@ -376,7 +377,7 @@ static void sig_gui_print_text(WINDOW_REC *window, void *fgcolor, gui->insert_after = insert_after; } -static void sig_gui_printtext_finished(WINDOW_REC *window) +static void sig_gui_printtext_finished(WINDOW_REC *window, TEXT_DEST_REC *dest) { TEXT_BUFFER_VIEW_REC *view; LINE_REC *insert_after; diff --git a/src/fe-text/textbuffer-formats.c b/src/fe-text/textbuffer-formats.c index 47f1735a..84aaebb9 100644 --- a/src/fe-text/textbuffer-formats.c +++ b/src/fe-text/textbuffer-formats.c @@ -42,6 +42,7 @@ void textbuffer_format_rec_free(TEXT_BUFFER_FORMAT_REC *rec) i_refstr_release(rec->server_tag); i_refstr_release(rec->target); i_refstr_release(rec->nick); + i_refstr_release(rec->address); if (rec->nargs >= 1) { i_refstr_release(rec->args[0]); } @@ -54,17 +55,13 @@ void textbuffer_format_rec_free(TEXT_BUFFER_FORMAT_REC *rec) g_slice_free(TEXT_BUFFER_FORMAT_REC, rec); } -static TEXT_BUFFER_FORMAT_REC *format_rec_new(const char *module, const char *format_tag, - const char *server_tag, const char *target, - const char *nick, int nargs, const char **args) +static TEXT_BUFFER_FORMAT_REC *format_rec_new(const char *module, const char *format_tag, int nargs, + const char **args) { int n; TEXT_BUFFER_FORMAT_REC *ret = g_slice_new0(TEXT_BUFFER_FORMAT_REC); ret->module = i_refstr_intern(module); ret->format = i_refstr_intern(format_tag); - ret->server_tag = i_refstr_intern(server_tag); - ret->target = i_refstr_intern(target); - ret->nick = i_refstr_intern(nick); ret->nargs = nargs; ret->args = g_new0(char *, nargs); if (nargs >= 1) { @@ -76,6 +73,19 @@ static TEXT_BUFFER_FORMAT_REC *format_rec_new(const char *module, const char *fo return ret; } +static void format_rec_set_dest(TEXT_BUFFER_FORMAT_REC *rec, const TEXT_DEST_REC *dest) +{ + i_refstr_release(rec->server_tag); + i_refstr_release(rec->target); + i_refstr_release(rec->nick); + i_refstr_release(rec->address); + rec->server_tag = i_refstr_intern(dest->server_tag); + rec->target = i_refstr_intern(dest->target); + rec->nick = i_refstr_intern(dest->nick); + rec->address = i_refstr_intern(dest->address); + rec->flags = dest->flags & ~PRINT_FLAG_FORMAT; +} + static LINE_INFO_REC *store_lineinfo_tmp(TEXT_DEST_REC *dest) { GUI_WINDOW_REC *gui; @@ -132,11 +142,10 @@ static void sig_print_format(THEME_REC *theme, const char *module, TEXT_DEST_REC formatnum = GPOINTER_TO_INT(formatnump); formats = g_hash_table_lookup(default_formats, module); - info->format = format_rec_new(module, formats[formatnum].tag, dest->server_tag, - dest->target, dest->nick, formats[formatnum].params, args); + info->format = + format_rec_new(module, formats[formatnum].tag, formats[formatnum].params, args); special_push_collector(&info->format->expando_cache); - info->format->flags = dest->flags; dest->flags |= PRINT_FLAG_FORMAT; signal_continue(5, theme, module, dest, formatnump, args); @@ -155,11 +164,9 @@ static void sig_print_noformat(TEXT_DEST_REC *dest, const char *text) special_push_collector(NULL); info = store_lineinfo_tmp(dest); - info->format = format_rec_new(NULL, NULL, dest->server_tag, dest->target, dest->nick, 2, - (const char *[]){ NULL, text }); + info->format = format_rec_new(NULL, NULL, 2, (const char *[]){ NULL, text }); special_push_collector(&info->format->expando_cache); - info->format->flags = dest->flags; dest->flags |= PRINT_FLAG_FORMAT; signal_continue(2, dest, text); @@ -182,7 +189,7 @@ static GSList *reverse_collector(GSList *a1) return c1; } -static void sig_gui_print_text_finished(WINDOW_REC *window) +static void sig_gui_print_text_finished(WINDOW_REC *window, TEXT_DEST_REC *dest) { GUI_WINDOW_REC *gui; LINE_REC *insert_after; @@ -202,6 +209,7 @@ static void sig_gui_print_text_finished(WINDOW_REC *window) return; info->format->expando_cache = reverse_collector(info->format->expando_cache); + format_rec_set_dest(info->format, dest); info->level |= MSGLEVEL_FORMAT; @@ -290,12 +298,16 @@ char *textbuffer_line_get_text(TEXT_BUFFER_REC *buffer, LINE_REC *line) curr = line; line = NULL; - format_rec = curr->info.format; - format_create_dest( + format_rec = curr->info.format; + format_create_dest_tag( &dest, format_rec->server_tag != NULL ? server_find_tag(format_rec->server_tag) : NULL, - format_rec->target, curr->info.level & ~MSGLEVEL_FORMAT, buffer->window); + format_rec->server_tag, format_rec->target, curr->info.level & ~MSGLEVEL_FORMAT, + buffer->window); + dest.nick = format_rec->nick; + dest.address = format_rec->address; + dest.flags = format_rec->flags; theme = window_get_theme(dest.window); diff --git a/src/fe-text/textbuffer-formats.h b/src/fe-text/textbuffer-formats.h index 45e4ce1b..b57f61c9 100644 --- a/src/fe-text/textbuffer-formats.h +++ b/src/fe-text/textbuffer-formats.h @@ -9,6 +9,7 @@ typedef struct _TEXT_BUFFER_FORMAT_REC { char *server_tag; char *target; char *nick; + char *address; char **args; int nargs; GSList *expando_cache;