diff options
| author | Mikael Magnusson <mikachu@gmail.com> | 2026-05-12 02:04:01 +0200 |
|---|---|---|
| committer | Mikael Magnusson <mikachu@gmail.com> | 2026-05-16 18:28:30 +0200 |
| commit | ab4d5a3d26ab51fc0f30d113ada4f9c2a47d8b3a (patch) | |
| tree | d1ad4fbacf711d8815abca92d9a7a2b6c2f55056 /Src/Modules | |
| parent | 54553: curses: free subwindows before parents or they don't get freed at all (diff) | |
| download | zsh-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.c | 40 |
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; } |
