improve hilight colour bleed

This commit is contained in:
Ailin Nemui 2026-01-03 17:46:30 +01:00
commit a22e34e469
2 changed files with 63 additions and 25 deletions

View file

@ -1457,7 +1457,8 @@ int strip_real_length(const char *str, int len,
*last_color_len = -1; *last_color_len = -1;
while (*str != '\0') { while (*str != '\0') {
if (*str == 3) { /* mIRC color */ switch (str[0]) {
case 3: { /* mIRC color */
const char *mircstart = str; const char *mircstart = str;
if (last_color_pos != NULL) if (last_color_pos != NULL)
@ -1466,45 +1467,84 @@ int strip_real_length(const char *str, int len,
get_mirc_color(&str, NULL, NULL, NULL); get_mirc_color(&str, NULL, NULL, NULL);
if (last_color_len != NULL) if (last_color_len != NULL)
*last_color_len = (int) (str-mircstart); *last_color_len = (int) (str-mircstart);
} break;
} else if (*str == 4 && str[1] != '\0') { case 4:
/* We expect 4 to indicate an internal Irssi color code. However 4 /* We expect 4 to indicate an internal Irssi color code. However 4
* also means hex color, an alternative to mIRC color codes. We * also means hex color, an alternative to mIRC color codes. We
* don't support those. */ * don't support those. */
if (str[1] == FORMAT_COLOR_24 && str[2] != '\0') { switch (str[1]) {
if (str[3] == '\0') str++; case '\0':
else if (str[4] == '\0') str += 2; str++;
else if (str[5] == '\0') str += 3; break;
case FORMAT_COLOR_24:
if (str[2] == '\0')
str += 2;
else if (str[3] == '\0')
str += 3;
else if (str[4] == '\0')
str += 4;
else if (str[5] == '\0')
str += 5;
else { else {
if (last_color_pos != NULL) if (last_color_pos != NULL)
*last_color_pos = (int) (str-start); *last_color_pos = (int) (str-start);
if (last_color_len != NULL) if (last_color_len != NULL)
*last_color_len = 6; *last_color_len = 6;
str+=4; str += 6;
} }
} else if (str[1] < FORMAT_STYLE_SPECIAL && str[2] != '\0') { break;
if (last_color_pos != NULL) case FORMAT_STYLE_DEFAULTS:
*last_color_pos = (int) (str-start); case FORMAT_STYLE_THEME_DEFAULTS:
if (last_color_len != NULL)
*last_color_len = 3;
str++;
} else if (str[1] == FORMAT_STYLE_DEFAULTS ||
str[1] == FORMAT_STYLE_THEME_DEFAULTS) {
if (last_color_pos != NULL) if (last_color_pos != NULL)
*last_color_pos = (int) (str-start); *last_color_pos = (int) (str-start);
if (last_color_len != NULL) if (last_color_len != NULL)
*last_color_len = 2; *last_color_len = 2;
str += 2;
break;
default:
if (str[1] < FORMAT_STYLE_SPECIAL && str[2] != '\0') {
if (last_color_pos != NULL)
*last_color_pos = (int) (str - start);
if (last_color_len != NULL)
*last_color_len = 3;
str += 3;
} else {
str += 2;
}
break;
} }
str += 2; break;
} else { case 15:
/* remove all styling */
if (last_color_pos != NULL)
*last_color_pos = -1;
if (last_color_len != NULL)
*last_color_len = -1;
str++;
break;
case 27: {
const char *ansistart;
int unchanged = 0x7fffffff, fg = unchanged, bg = unchanged;
ansistart = str;
str++;
str = get_ansi_color(NULL, str, &fg, &bg, NULL, NULL);
if (fg < unchanged || bg < unchanged) {
if (last_color_pos != NULL)
*last_color_pos = (int) (ansistart - start);
if (last_color_len != NULL)
*last_color_len = (int) (str - ansistart);
}
} break;
default:
if (!IS_COLOR_CODE(*str)) { if (!IS_COLOR_CODE(*str)) {
if (len-- == 0) if (len-- == 0)
break; goto out;
} }
str++; str++;
break;
} }
} }
out:
return (int) (str-start); return (int) (str-start);
} }

View file

@ -375,13 +375,11 @@ static void sig_render_line_text(TEXT_DEST_REC *dest, GString *str, LINE_INFO_ME
/* end of the line */ /* end of the line */
pos = strip_real_length(str->str, hilight_end, &color_pos, &color_len); pos = strip_real_length(str->str, hilight_end, &color_pos, &color_len);
if (color_pos > 0) { g_string_append_c(str2, 4);
g_string_append_c(str2, (char) -1);
g_string_append_c(str2, (char) -1);
if (color_pos > 0)
g_string_append_len(str2, str->str + color_pos, color_len); g_string_append_len(str2, str->str + color_pos, color_len);
} else {
/* no colors in line, change back to default */
g_string_append_c(str2, 4);
g_string_append_c(str2, FORMAT_STYLE_DEFAULTS);
}
g_string_append(str2, str->str + pos); g_string_append(str2, str->str + pos);
g_string_assign(str, g_string_free(str2, FALSE)); g_string_assign(str, g_string_free(str2, FALSE));