summaryrefslogtreecommitdiffstats
path: root/Src/Modules
diff options
context:
space:
mode:
authorMikael Magnusson <mikachu@gmail.com>2026-05-12 02:04:01 +0200
committerMikael Magnusson <mikachu@gmail.com>2026-05-16 18:28:30 +0200
commitab4d5a3d26ab51fc0f30d113ada4f9c2a47d8b3a (patch)
treed1ad4fbacf711d8815abca92d9a7a2b6c2f55056 /Src/Modules
parent54553: curses: free subwindows before parents or they don't get freed at all (diff)
downloadzsh-ab4d5a3d26ab51fc0f30d113ada4f9c2a47d8b3a.tar
zsh-ab4d5a3d26ab51fc0f30d113ada4f9c2a47d8b3a.tar.gz
zsh-ab4d5a3d26ab51fc0f30d113ada4f9c2a47d8b3a.tar.bz2
zsh-ab4d5a3d26ab51fc0f30d113ada4f9c2a47d8b3a.tar.lz
zsh-ab4d5a3d26ab51fc0f30d113ada4f9c2a47d8b3a.tar.xz
zsh-ab4d5a3d26ab51fc0f30d113ada4f9c2a47d8b3a.tar.zst
zsh-ab4d5a3d26ab51fc0f30d113ada4f9c2a47d8b3a.zip
54554: curses: use setcchar in zccmd_bg if available
This allows using more than 256 color pairs.
Diffstat (limited to 'Src/Modules')
-rw-r--r--Src/Modules/curses.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/Src/Modules/curses.c b/Src/Modules/curses.c
index a6d6cecf3..5cb03046d 100644
--- a/Src/Modules/curses.c
+++ b/Src/Modules/curses.c
@@ -932,7 +932,14 @@ zccmd_bg(const char *nam, char **args)
ZCWin w;
char **attrs;
int ret = 0;
+#ifdef HAVE_SETCCHAR
+ cchar_t cc;
+ wchar_t wch = L' ';
+ attr_t bg_attrs = A_NORMAL;
+ short bg_cp = 0;
+#else
chtype ch = 0;
+#endif
if (!args[0])
return 1;
@@ -945,12 +952,20 @@ zccmd_bg(const char *nam, char **args)
w = (ZCWin)getdata(node);
- for(attrs = args+1; *attrs; attrs++) {
+ for (attrs = args+1; *attrs; attrs++) {
if (strchr(*attrs, '/')) {
Colorpairnode cpn;
if ((cpn = zcurses_colorget(nam, *attrs)) == NULL)
ret = 1;
- else if (cpn->colorpair >= 256) {
+ else
+#ifdef HAVE_SETCCHAR
+ bg_cp = (short)cpn->colorpair;
+ } else if (**attrs == '@') {
+ wch = (wchar_t)(unsigned char)((*attrs)[1] == Meta
+ ? (*attrs)[2] ^ 32
+ : (*attrs)[1]);
+#else
+ if (cpn->colorpair >= 256) {
/* pretty unlikely, but... */
zwarnnam(nam, "bg color pair %s has index (%d) too large (max 255)",
cpn->node.nam, cpn->colorpair);
@@ -960,6 +975,7 @@ zccmd_bg(const char *nam, char **args)
}
} else if (**attrs == '@') {
ch |= (*attrs)[1] == Meta ? (*attrs)[2] ^ 32 : (*attrs)[1];
+#endif
} else {
char *ptr;
int onoff;
@@ -983,6 +999,25 @@ zccmd_bg(const char *nam, char **args)
zwarnnam(nam, "attribute `%s' not known", ptr);
ret = 1;
} else {
+#ifdef HAVE_SETCCHAR
+ switch (onoff) {
+ case ZCURSES_ATTRON:
+ bg_attrs |= zca->number;
+ break;
+ case ZCURSES_ATTROFF:
+ bg_attrs &= ~zca->number;
+ break;
+ }
+ }
+ }
+ }
+
+ if (ret == 0) {
+ if (setcchar(&cc, &wch, bg_attrs, bg_cp, NULL) == ERR)
+ return 1;
+ return wbkgrnd(w->win, &cc) != OK;
+ }
+#else
switch(onoff) {
case ZCURSES_ATTRON:
ch |= zca->number;
@@ -997,6 +1032,7 @@ zccmd_bg(const char *nam, char **args)
if (ret == 0)
return wbkgd(w->win, ch) != OK;
+#endif
return ret;
}