From deb6ca1b1a676fae094253fc55519e2a60c206d1 Mon Sep 17 00:00:00 2001 From: Jari Matilainen Date: Thu, 24 Sep 2015 13:03:02 +0200 Subject: [PATCH] Applied patch from fs#275 to make /hilight -mask -line work properly --- src/fe-common/core/fe-messages.c | 16 ++++++++++------ src/fe-common/core/formats.c | 2 ++ src/fe-common/core/formats.h | 6 ++++++ src/fe-common/core/hilight-text.c | 9 ++++----- src/fe-common/core/hilight-text.h | 2 +- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/fe-common/core/fe-messages.c b/src/fe-common/core/fe-messages.c index d09c1b0b..e06a4571 100644 --- a/src/fe-common/core/fe-messages.c +++ b/src/fe-common/core/fe-messages.c @@ -175,6 +175,7 @@ static void sig_message_public(SERVER_REC *server, const char *msg, int for_me, print_channel, level; char *nickmode, *color, *freemsg = NULL; HILIGHT_REC *hilight; + int match_beg = 0, match_end = 0; /* NOTE: this may return NULL if some channel is just closed with /WINDOW CLOSE and server still sends the few last messages */ @@ -187,8 +188,8 @@ static void sig_message_public(SERVER_REC *server, const char *msg, nick_match_msg(chanrec, msg, server->nick) : nick_match_msg_everywhere(chanrec, msg, server->nick); hilight = for_me ? NULL : - hilight_match_nick(server, target, nick, address, MSGLEVEL_PUBLIC, msg); - color = (hilight == NULL) ? NULL : hilight_get_color(hilight); + hilight_match(server, target, nick, address, MSGLEVEL_PUBLIC, msg, &match_beg, &match_end); + color = (hilight == NULL || !hilight->nick) ? NULL : hilight_get_color(hilight); print_channel = chanrec == NULL || !window_item_is_active((WI_ITEM_REC *) chanrec); @@ -214,10 +215,13 @@ static void sig_message_public(SERVER_REC *server, const char *msg, if (printnick == NULL) printnick = nick; + TEXT_DEST_REC dest; + format_create_dest(&dest, server, target, level, NULL); + dest.hilight = hilight; + dest.match_beg = match_beg; + dest.match_end = match_end; if (color != NULL) { /* highlighted nick */ - TEXT_DEST_REC dest; - format_create_dest(&dest, server, target, level, NULL); hilight_update_text_dest(&dest,hilight); if (!print_channel) /* message to active channel in window */ printformat_dest(&dest, TXT_PUBMSG_HILIGHT, color, @@ -228,11 +232,11 @@ static void sig_message_public(SERVER_REC *server, const char *msg, nickmode); } else { if (!print_channel) - printformat(server, target, level, + printformat_dest(&dest, for_me ? TXT_PUBMSG_ME : TXT_PUBMSG, printnick, msg, nickmode); else - printformat(server, target, level, + printformat_dest(&dest, for_me ? TXT_PUBMSG_ME_CHANNEL : TXT_PUBMSG_CHANNEL, printnick, target, msg, nickmode); diff --git a/src/fe-common/core/formats.c b/src/fe-common/core/formats.c index ccf48394..b95b3966 100644 --- a/src/fe-common/core/formats.c +++ b/src/fe-common/core/formats.c @@ -416,6 +416,8 @@ void format_create_dest_tag(TEXT_DEST_REC *dest, void *server, dest->server_tag = server != NULL ? SERVER(server)->tag : server_tag; dest->target = target; dest->level = level; + dest->match_beg = 0; + dest->match_end = 0; dest->window = window != NULL ? window : window_find_closest(server, target, level); } diff --git a/src/fe-common/core/formats.h b/src/fe-common/core/formats.h index 07e1832c..484105f9 100644 --- a/src/fe-common/core/formats.h +++ b/src/fe-common/core/formats.h @@ -45,6 +45,9 @@ struct _FORMAT_REC { #define PRINT_FLAG_SET_SERVERTAG 0x0010 #define PRINT_FLAG_UNSET_SERVERTAG 0x0020 +// FIXME: sould use better +typedef struct _HILIGHT_REC HILIGHT_REC; + typedef struct _TEXT_DEST_REC { WINDOW_REC *window; SERVER_REC *server; @@ -52,6 +55,9 @@ typedef struct _TEXT_DEST_REC { const char *target; int level; + HILIGHT_REC *hilight; + int match_beg; + int match_end; int hilight_priority; char *hilight_color; int flags; diff --git a/src/fe-common/core/hilight-text.c b/src/fe-common/core/hilight-text.c index 87c5d467..c6017d2a 100644 --- a/src/fe-common/core/hilight-text.c +++ b/src/fe-common/core/hilight-text.c @@ -325,11 +325,10 @@ static void sig_print_text(TEXT_DEST_REC *dest, const char *text, if (dest->level & MSGLEVEL_NOHILIGHT) return; - hilight_start = hilight_end = 0; - hilight = hilight_match(dest->server, dest->target, - NULL, NULL, dest->level, stripped, - &hilight_start, - &hilight_end); + hilight_start = dest->match_beg; + hilight_end = dest->match_end; + hilight = dest->hilight; + if (hilight == NULL) return; diff --git a/src/fe-common/core/hilight-text.h b/src/fe-common/core/hilight-text.h index 1692b8ab..fa083882 100644 --- a/src/fe-common/core/hilight-text.h +++ b/src/fe-common/core/hilight-text.h @@ -7,7 +7,7 @@ #include "formats.h" -typedef struct _HILIGHT_REC HILIGHT_REC; +//typedef struct _HILIGHT_REC HILIGHT_REC; struct _HILIGHT_REC { char *text;