Change noattr to be an explicit attribute in the style so that it works

correctly and does not delete attributes set in the style itself, GitHub
issue 4713.
This commit is contained in:
nicm
2025-12-01 08:14:29 +00:00
parent 04f32073c0
commit e4c552f5a5
4 changed files with 28 additions and 19 deletions

View File

@@ -31,7 +31,7 @@ attributes_tostring(int attr)
if (attr == 0) if (attr == 0)
return ("none"); return ("none");
len = xsnprintf(buf, sizeof buf, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s", len = xsnprintf(buf, sizeof buf, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
(attr & GRID_ATTR_CHARSET) ? "acs," : "", (attr & GRID_ATTR_CHARSET) ? "acs," : "",
(attr & GRID_ATTR_BRIGHT) ? "bright," : "", (attr & GRID_ATTR_BRIGHT) ? "bright," : "",
(attr & GRID_ATTR_DIM) ? "dim," : "", (attr & GRID_ATTR_DIM) ? "dim," : "",
@@ -45,7 +45,8 @@ attributes_tostring(int attr)
(attr & GRID_ATTR_UNDERSCORE_3) ? "curly-underscore," : "", (attr & GRID_ATTR_UNDERSCORE_3) ? "curly-underscore," : "",
(attr & GRID_ATTR_UNDERSCORE_4) ? "dotted-underscore," : "", (attr & GRID_ATTR_UNDERSCORE_4) ? "dotted-underscore," : "",
(attr & GRID_ATTR_UNDERSCORE_5) ? "dashed-underscore," : "", (attr & GRID_ATTR_UNDERSCORE_5) ? "dashed-underscore," : "",
(attr & GRID_ATTR_OVERLINE) ? "overline," : ""); (attr & GRID_ATTR_OVERLINE) ? "overline," : "",
(attr & GRID_ATTR_NOATTR) ? "noattr," : "");
if (len > 0) if (len > 0)
buf[len - 1] = '\0'; buf[len - 1] = '\0';

View File

@@ -577,8 +577,12 @@ screen_select_cell(struct screen *s, struct grid_cell *dst,
if (COLOUR_DEFAULT(dst->bg)) if (COLOUR_DEFAULT(dst->bg))
dst->bg = src->bg; dst->bg = src->bg;
utf8_copy(&dst->data, &src->data); utf8_copy(&dst->data, &src->data);
dst->attr = src->attr;
dst->flags = src->flags; dst->flags = src->flags;
if (dst->attr & GRID_ATTR_NOATTR)
dst->attr |= (src->attr & GRID_ATTR_CHARSET);
else
dst->attr |= src->attr;
} }
/* Reflow wrapped lines. */ /* Reflow wrapped lines. */

35
style.c
View File

@@ -218,20 +218,23 @@ style_parse(struct style *sy, const struct grid_cell *base, const char *in)
sy->gc.attr = 0; sy->gc.attr = 0;
else if (end > 2 && strncasecmp(tmp, "no", 2) == 0) { else if (end > 2 && strncasecmp(tmp, "no", 2) == 0) {
if (strcmp(tmp + 2, "attr") == 0) if (strcmp(tmp + 2, "attr") == 0)
value = 0xffff & ~GRID_ATTR_CHARSET; sy->gc.attr |= GRID_ATTR_NOATTR;
else if ((value = attributes_fromstring(tmp + 2)) == -1) else {
goto error; value = attributes_fromstring(tmp + 2);
sy->gc.attr &= ~value; if (value == -1)
goto error;
sy->gc.attr &= ~value;
}
} else if (end > 6 && strncasecmp(tmp, "width=", 6) == 0) { } else if (end > 6 && strncasecmp(tmp, "width=", 6) == 0) {
n = strtonum(tmp + 6, 0, UINT_MAX, &errstr); n = strtonum(tmp + 6, 0, UINT_MAX, &errstr);
if (errstr != NULL) if (errstr != NULL)
goto error; goto error;
sy->width = (int)n; sy->width = (int)n;
} else if (end > 4 && strncasecmp(tmp, "pad=", 4) == 0) { } else if (end > 4 && strncasecmp(tmp, "pad=", 4) == 0) {
n = strtonum(tmp + 4, 0, UINT_MAX, &errstr); n = strtonum(tmp + 4, 0, UINT_MAX, &errstr);
if (errstr != NULL) if (errstr != NULL)
goto error; goto error;
sy->pad = (int)n; sy->pad = (int)n;
} else { } else {
if ((value = attributes_fromstring(tmp)) == -1) if ((value = attributes_fromstring(tmp)) == -1)
goto error; goto error;
@@ -344,13 +347,13 @@ style_tostring(struct style *sy)
attributes_tostring(gc->attr)); attributes_tostring(gc->attr));
comma = ","; comma = ",";
} }
if (sy->width >= 0) { if (sy->width >= 0) {
xsnprintf(s + off, sizeof s - off, "%swidth=%u", comma, xsnprintf(s + off, sizeof s - off, "%swidth=%u", comma,
sy->width); sy->width);
comma = ","; comma = ",";
} }
if (sy->pad >= 0) { if (sy->pad >= 0) {
xsnprintf(s + off, sizeof s - off, "%spad=%u", comma, xsnprintf(s + off, sizeof s - off, "%spad=%u", comma,
sy->pad); sy->pad);
comma = ","; comma = ",";
} }

1
tmux.h
View File

@@ -718,6 +718,7 @@ struct colour_palette {
#define GRID_ATTR_UNDERSCORE_4 0x800 #define GRID_ATTR_UNDERSCORE_4 0x800
#define GRID_ATTR_UNDERSCORE_5 0x1000 #define GRID_ATTR_UNDERSCORE_5 0x1000
#define GRID_ATTR_OVERLINE 0x2000 #define GRID_ATTR_OVERLINE 0x2000
#define GRID_ATTR_NOATTR 0x4000
/* All underscore attributes. */ /* All underscore attributes. */
#define GRID_ATTR_ALL_UNDERSCORE \ #define GRID_ATTR_ALL_UNDERSCORE \