summaryrefslogtreecommitdiffstats
path: root/Src/Zle
diff options
context:
space:
mode:
authorOliver Kiddle <opk@zsh.org>2025-11-17 04:32:14 +0100
committerOliver Kiddle <opk@zsh.org>2025-11-17 04:32:14 +0100
commit5411128bf3c83516da8fdc4cb3d6187f243b6954 (patch)
treebbc22904c21ac4ec3f71cc72ffcb2f1e7bfdb697 /Src/Zle
parent54083: fix for cursor shape in viopp mode (diff)
downloadzsh-5411128bf3c83516da8fdc4cb3d6187f243b6954.tar
zsh-5411128bf3c83516da8fdc4cb3d6187f243b6954.tar.gz
zsh-5411128bf3c83516da8fdc4cb3d6187f243b6954.tar.bz2
zsh-5411128bf3c83516da8fdc4cb3d6187f243b6954.tar.lz
zsh-5411128bf3c83516da8fdc4cb3d6187f243b6954.tar.xz
zsh-5411128bf3c83516da8fdc4cb3d6187f243b6954.tar.zst
zsh-5411128bf3c83516da8fdc4cb3d6187f243b6954.zip
54074, 54082: add an opaque key for use in zle_highlight/region_highlight to allow mixing of colours
Diffstat (limited to 'Src/Zle')
-rw-r--r--Src/Zle/termquery.c26
-rw-r--r--Src/Zle/zle_main.c4
-rw-r--r--Src/Zle/zle_refresh.c12
3 files changed, 26 insertions, 16 deletions
diff --git a/Src/Zle/termquery.c b/Src/Zle/termquery.c
index c6f83044d..ea8945895 100644
--- a/Src/Zle/termquery.c
+++ b/Src/Zle/termquery.c
@@ -439,16 +439,26 @@ handle_color(int bg, int red, int green, int blue)
{
char *colour;
- if (bg == 1) { /* background color */
- /* scale by Rec.709 coefficients for lightness */
- setsparam(MODEVAR, ztrdup(
- 0.2126f * red + 0.7152f * green + 0.0722f * blue <= 127 ?
- "dark" : "light"));
+ switch (bg) {
+ case 0: /* foreground color */
+ memo_term_color &= ~TXT_ATTR_FG_MASK;
+ memo_term_color |= TXT_ATTR_FG_24BIT | (zattr) ((((red << 8)
+ + green) << 8) + blue) << TXT_ATTR_FG_COL_SHIFT;
+ break;
+ case 1: /* background color */
+ memo_term_color &= ~TXT_ATTR_BG_MASK;
+ memo_term_color |= TXT_ATTR_BG_24BIT | (zattr) ((((red << 8)
+ + green) << 8) + blue) << TXT_ATTR_BG_COL_SHIFT;
+ /* scale by Rec.709 coefficients for lightness */
+ setsparam(MODEVAR, ztrdup(
+ 0.2126f * red + 0.7152f * green + 0.0722f * blue <= 127 ?
+ "dark" : "light"));
+ break;
+ case 2: /* cursor color */
+ memo_cursor = (red << 24) | (green << 16) | (blue << 8);
+ break;
}
- if (bg == 2) /* cursor color */
- memo_cursor = (red << 24) | (green << 16) | (blue << 8);
-
colour = zalloc(8);
sprintf(colour, "#%02x%02x%02x", red, green, blue);
setsparam(COLORVAR[bg], colour);
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index 46d0e07d2..9ad917d86 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -1277,7 +1277,7 @@ zleread(char **lp, char **rp, int flags, int context, char *init, char *finish)
raw_rp = rp;
rpromptbuf = promptexpand(rp ? *rp : NULL, 1, markers[2], NULL, NULL);
rpmpt_attr = txtcurrentattrs;
- prompt_attr = mixattrs(pmpt_attr, pmpt_attr, rpmpt_attr);
+ prompt_attr = mixattrs(pmpt_attr, pmpt_attr & TXT_ATTR_ALL, rpmpt_attr);
free_prepostdisplay();
zlereadflags = flags;
@@ -2032,7 +2032,7 @@ reexpandprompt(void)
new_rprompt = promptexpand(raw_rp ? *raw_rp : NULL, 1, markers[2], NULL, NULL);
rpmpt_attr = txtcurrentattrs;
- prompt_attr = mixattrs(pmpt_attr, pmpt_attr, rpmpt_attr);
+ prompt_attr = mixattrs(pmpt_attr, pmpt_attr & TXT_ATTR_ALL, rpmpt_attr);
free(rpromptbuf);
rpromptbuf = new_rprompt;
} while (looping != reexpanding);
diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c
index 8a89be333..255c701f2 100644
--- a/Src/Zle/zle_refresh.c
+++ b/Src/Zle/zle_refresh.c
@@ -208,7 +208,7 @@ int predisplaylen, postdisplaylen;
* and for ellipsis continuation markers.
*/
-static zattr default_attr, special_attr, special_mask, ellipsis_attr;
+static zattr default_attr, default_mask, special_attr, special_mask, ellipsis_attr;
/*
* Layer applied to highlighting for special characters
@@ -330,7 +330,7 @@ zle_set_highlight(void)
int ellipsis_attr_set = 0;
struct region_highlight *rhp;
- special_attr = default_attr = 0;
+ special_attr = default_attr = special_mask = default_mask = 0;
if (!region_highlights) {
region_highlights = (struct region_highlight *)
zshcalloc(N_SPECIAL_HIGHLIGHTS*sizeof(struct region_highlight));
@@ -354,12 +354,12 @@ zle_set_highlight(void)
for (; *atrs; atrs++) {
if (!strcmp(*atrs, "none")) {
/* reset attributes for consistency... usually unnecessary */
- special_attr = default_attr = 0;
+ special_attr = default_attr = special_mask = default_mask = 0;
special_attr_set = 1;
paste_attr_set = region_attr_set =
isearch_attr_set = suffix_attr_set = 1;
} else if (strpfx("default:", *atrs)) {
- match_highlight(*atrs + 8, &default_attr, NULL, NULL);
+ match_highlight(*atrs + 8, &default_attr, &default_mask, NULL);
} else if (strpfx("special:", *atrs)) {
match_highlight(*atrs + 8, &special_attr, &special_mask,
&special_layer);
@@ -1206,7 +1206,7 @@ zrefresh(void)
rpms.s = nbuf[rpms.ln = 0] + lpromptw;
rpms.sen = *nbuf + winw;
for (t = tmpline, tmppos = 0; tmppos < tmpll; t++, tmppos++) {
- zattr base_attr = mixattrs(default_attr, default_attr, prompt_attr);
+ zattr base_attr = mixattrs(default_attr, default_mask, prompt_attr);
zattr all_attr = 0;
struct region_highlight *rhp;
int layer, nextlayer = 0;
@@ -2452,7 +2452,7 @@ singlerefresh(ZLE_STRING_T tmpline, int tmpll, int tmpcs)
for (t0 = 0; t0 < tmpll; t0++) {
unsigned ireg;
- zattr base_attr = 0;
+ zattr base_attr = mixattrs(default_attr, default_attr, prompt_attr);
zattr all_attr;
struct region_highlight *rhp;
/*