degesch: detect highlights and display differently
This commit is contained in:
parent
87c1775129
commit
cdb1d81982
73
degesch.c
73
degesch.c
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
#define ATTR_EXTERNAL "attr_external"
|
#define ATTR_EXTERNAL "attr_external"
|
||||||
#define ATTR_TIMESTAMP "attr_timestamp"
|
#define ATTR_TIMESTAMP "attr_timestamp"
|
||||||
|
#define ATTR_HIGHLIGHT "attr_highlight"
|
||||||
#define ATTR_ACTION "attr_action"
|
#define ATTR_ACTION "attr_action"
|
||||||
#define ATTR_JOIN "attr_join"
|
#define ATTR_JOIN "attr_join"
|
||||||
#define ATTR_PART "attr_part"
|
#define ATTR_PART "attr_part"
|
||||||
|
@ -95,6 +96,7 @@ static struct config_item g_config_table[] =
|
||||||
|
|
||||||
{ ATTR_EXTERNAL, NULL, "Terminal attributes for external lines" },
|
{ ATTR_EXTERNAL, NULL, "Terminal attributes for external lines" },
|
||||||
{ ATTR_TIMESTAMP, NULL, "Terminal attributes for timestamps" },
|
{ ATTR_TIMESTAMP, NULL, "Terminal attributes for timestamps" },
|
||||||
|
{ ATTR_HIGHLIGHT, NULL, "Terminal attributes for highlights" },
|
||||||
{ ATTR_ACTION, NULL, "Terminal attributes for user actions" },
|
{ ATTR_ACTION, NULL, "Terminal attributes for user actions" },
|
||||||
{ ATTR_JOIN, NULL, "Terminal attributes for joins" },
|
{ ATTR_JOIN, NULL, "Terminal attributes for joins" },
|
||||||
{ ATTR_PART, NULL, "Terminal attributes for parts" },
|
{ ATTR_PART, NULL, "Terminal attributes for parts" },
|
||||||
|
@ -789,6 +791,13 @@ init_colors (struct app_context *ctx)
|
||||||
INIT_ATTR (ATTR_JOIN, g_terminal.color_set_fg[2], "\x1b[32m");
|
INIT_ATTR (ATTR_JOIN, g_terminal.color_set_fg[2], "\x1b[32m");
|
||||||
INIT_ATTR (ATTR_PART, g_terminal.color_set_fg[1], "\x1b[31m");
|
INIT_ATTR (ATTR_PART, g_terminal.color_set_fg[1], "\x1b[31m");
|
||||||
|
|
||||||
|
char *highlight = xstrdup_printf ("%s%s%s",
|
||||||
|
g_terminal.color_set_fg[3],
|
||||||
|
g_terminal.color_set_bg[5],
|
||||||
|
enter_bold_mode);
|
||||||
|
INIT_ATTR (ATTR_HIGHLIGHT, highlight, "\x1b[33;37;1m");
|
||||||
|
free (highlight);
|
||||||
|
|
||||||
#undef INIT_ATTR
|
#undef INIT_ATTR
|
||||||
|
|
||||||
switch (ctx->color_mode)
|
switch (ctx->color_mode)
|
||||||
|
@ -1231,16 +1240,26 @@ buffer_line_display (struct app_context *ctx,
|
||||||
switch (line->type)
|
switch (line->type)
|
||||||
{
|
{
|
||||||
case BUFFER_LINE_PRIVMSG:
|
case BUFFER_LINE_PRIVMSG:
|
||||||
formatter_add (&f, "<#c#s#r> #s", nick_color, nick, a->text);
|
if (line->flags & BUFFER_LINE_HIGHLIGHT)
|
||||||
|
formatter_add (&f, "#a<#s>#r #s", ATTR_HIGHLIGHT, nick, a->text);
|
||||||
|
else
|
||||||
|
formatter_add (&f, "<#c#s#r> #s", nick_color, nick, a->text);
|
||||||
break;
|
break;
|
||||||
case BUFFER_LINE_ACTION:
|
case BUFFER_LINE_ACTION:
|
||||||
formatter_add (&f, " #a*#r ", ATTR_ACTION);
|
if (line->flags & BUFFER_LINE_HIGHLIGHT)
|
||||||
|
formatter_add (&f, " #a*#r ", ATTR_HIGHLIGHT);
|
||||||
|
else
|
||||||
|
formatter_add (&f, " #a*#r ", ATTR_ACTION);
|
||||||
formatter_add (&f, "#c#s#r #s", nick_color, nick, a->text);
|
formatter_add (&f, "#c#s#r #s", nick_color, nick, a->text);
|
||||||
break;
|
break;
|
||||||
case BUFFER_LINE_NOTICE:
|
case BUFFER_LINE_NOTICE:
|
||||||
formatter_add (&f, " - ");
|
formatter_add (&f, " - ");
|
||||||
formatter_add (&f, "#s(#c#s#r): #s",
|
if (line->flags & BUFFER_LINE_HIGHLIGHT)
|
||||||
"Notice", nick_color, nick, a->text);
|
formatter_add (&f, "#a#s(#s)#r: #s",
|
||||||
|
ATTR_HIGHLIGHT, "Notice", nick, a->text);
|
||||||
|
else
|
||||||
|
formatter_add (&f, "#s(#c#s#r): #s",
|
||||||
|
"Notice", nick_color, nick, a->text);
|
||||||
break;
|
break;
|
||||||
case BUFFER_LINE_JOIN:
|
case BUFFER_LINE_JOIN:
|
||||||
formatter_add (&f, "#a-->#r ", ATTR_JOIN);
|
formatter_add (&f, "#a-->#r ", ATTR_JOIN);
|
||||||
|
@ -2441,6 +2460,38 @@ irc_get_buffer_for_message (struct app_context *ctx,
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
irc_is_highlight (struct app_context *ctx, const char *message)
|
||||||
|
{
|
||||||
|
// Well, this is rather crude but it should make most users happy.
|
||||||
|
// Ideally we could do this at least in proper Unicode.
|
||||||
|
char *copy = xstrdup (message);
|
||||||
|
for (char *p = copy; *p; p++)
|
||||||
|
*p = irc_tolower (*p);
|
||||||
|
|
||||||
|
char *nick = xstrdup (ctx->irc_user->nickname);
|
||||||
|
for (char *p = nick; *p; p++)
|
||||||
|
*p = irc_tolower (*p);
|
||||||
|
|
||||||
|
// Special characters allowed in nicknames by RFC 2812: []\`_^{|} and -
|
||||||
|
// Also excluded from the ASCII: common user channel prefixes: +%@&~
|
||||||
|
const char *delimiters = ",.;:!?()<>/=#$* \t\r\n\v\f\"'";
|
||||||
|
|
||||||
|
bool result = false;
|
||||||
|
char *save = NULL;
|
||||||
|
for (char *token = strtok_r (copy, delimiters, &save);
|
||||||
|
token; token = strtok_r (NULL, delimiters, &save))
|
||||||
|
if (!strcmp (token, nick))
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
free (copy);
|
||||||
|
free (nick);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2651,8 +2702,11 @@ irc_handle_notice_text (struct app_context *ctx,
|
||||||
|
|
||||||
if (buffer)
|
if (buffer)
|
||||||
{
|
{
|
||||||
// TODO: highlights
|
// TODO: some more obvious indication of highlights
|
||||||
buffer_send (ctx, buffer, BUFFER_LINE_NOTICE, 0,
|
int flags = irc_is_highlight (ctx, text->str)
|
||||||
|
? BUFFER_LINE_HIGHLIGHT
|
||||||
|
: 0;
|
||||||
|
buffer_send (ctx, buffer, BUFFER_LINE_NOTICE, flags,
|
||||||
.who = irc_to_utf8 (ctx, msg->prefix),
|
.who = irc_to_utf8 (ctx, msg->prefix),
|
||||||
.text = irc_to_utf8 (ctx, text->str));
|
.text = irc_to_utf8 (ctx, text->str));
|
||||||
}
|
}
|
||||||
|
@ -2812,11 +2866,14 @@ irc_handle_privmsg_text (struct app_context *ctx,
|
||||||
|
|
||||||
if (buffer)
|
if (buffer)
|
||||||
{
|
{
|
||||||
// TODO: highlights
|
// TODO: some more obvious indication of highlights
|
||||||
|
int flags = irc_is_highlight (ctx, text->str)
|
||||||
|
? BUFFER_LINE_HIGHLIGHT
|
||||||
|
: 0;
|
||||||
enum buffer_line_type type = is_action
|
enum buffer_line_type type = is_action
|
||||||
? BUFFER_LINE_ACTION
|
? BUFFER_LINE_ACTION
|
||||||
: BUFFER_LINE_PRIVMSG;
|
: BUFFER_LINE_PRIVMSG;
|
||||||
buffer_send (ctx, buffer, type, 0,
|
buffer_send (ctx, buffer, type, flags,
|
||||||
.who = irc_to_utf8 (ctx, msg->prefix),
|
.who = irc_to_utf8 (ctx, msg->prefix),
|
||||||
.text = irc_to_utf8 (ctx, text->str));
|
.text = irc_to_utf8 (ctx, text->str));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue