Hi,

Some comments below:

On Fri, Dec 10, 2021 at 05:53:40PM -0500, Raheman Vaiya wrote:
> The attached patch adds full support for the OSC 10/11/12/4 control
> sequences.
> These are used by programs like vim and theme.sh to query and set terminal
> colours and are supported by most major terminals (e.g alacrittty, kitty,
> libvte). I submitted a patch to the wiki some time ago, but it didn't

xterm supports it too.

> include
> support for query sequences. I am posting it here because I feel it would
> be a
> good candidate for inclusion into st itself.
> 
> You can test it using https://github.com/lemnos/theme.sh by running
> 
> theme.sh zenburn
> theme.sh -p
> 
> Don't hesitate to let me know if I have made any grievous errors :P.
> 
> Regards,
> Raheman

> diff --git a/config.def.h b/config.def.h
> index 6f05dce..3932e83 100644
> --- a/config.def.h
> +++ b/config.def.h
> @@ -127,9 +127,9 @@ static const char *colorname[] = {
>   * Default colors (colorname index)
>   * foreground, background, cursor, reverse cursor
>   */
> -unsigned int defaultfg = 7;
> -unsigned int defaultbg = 0;
> -static unsigned int defaultcs = 256;
> +unsigned int defaultfg = 255;
> +unsigned int defaultbg = 254;
> +unsigned int defaultcs = 256;
>  static unsigned int defaultrcs = 257;

The values in the config are changed here. Is it intended? If so, why?

>  
>  /*
> diff --git a/st.c b/st.c
> index a9338e1..a469512 100644
> --- a/st.c
> +++ b/st.c
> @@ -1842,6 +1842,32 @@ csireset(void)
>       memset(&csiescseq, 0, sizeof(csiescseq));
>  }
>  
> +void
> +osc4_color_response(int num)
> +{
> +     int n;
> +     char buf[32];
> +     unsigned char r,g,b;
> +
> +     xgetcolor(num, &r,&g,&b);
> +     n = sprintf(buf, "\033]4;%d;rgb:%02x%02x/%02x%02x/%02x%02x\007", num, 
> r, r, g, g, b, b);
> +

I prefer snprintf here, just in case. The arguments for sprintf are too long and
should be wrapped.

> +     ttywrite(buf, n, 1);
> +}
> +
> +void
> +osc_color_response(int index, int num)
> +{
> +     int n;
> +     char buf[32];
> +     unsigned char r,g,b;
> +
> +     xgetcolor(index, &r,&g,&b);
> +     n = sprintf(buf, "\033]%d;rgb:%02x%02x/%02x%02x/%02x%02x\007", num, r, 
> r, g, g, b, b);
> +
> +     ttywrite(buf, n, 1);
> +}
> +
>  void
>  strhandle(void)
>  {
> @@ -1880,6 +1906,45 @@ strhandle(void)
>                               }
>                       }
>                       return;
> +             case 11:
> +                     if (narg < 2)
> +                             break;
> +
> +                     p = strescseq.args[1];
> +
> +                     if(!strcmp(p, "?"))
> +                             osc_color_response(defaultbg, 11);
> +                     else if (xsetcolorname(defaultbg, p))
> +                             fprintf(stderr, "erresc: invalid background 
> color %d\n", p);

The argument p is not int. The compiler (clang) also gives a warning about it.

> +                     else
> +                             redraw();
> +                     break;
> +             case 12:
> +                     if (narg < 2)
> +                             break;
> +
> +                     p = strescseq.args[1];
> +
> +                     if(!strcmp(p, "?"))
> +                             osc_color_response(defaultcs, 12);
> +                     else if (xsetcolorname(defaultcs, p))
> +                             fprintf(stderr, "erresc: invalid cursor color 
> %d\n", p);
> +                     else
> +                             redraw();
> +                     break;
> +             case 10:

Case 10 should be ordered before case 11.

> +                     if (narg < 2)
> +                             break;
> +
> +                     p = strescseq.args[1];
> +
> +                     if(!strcmp(p, "?"))
> +                             osc_color_response(defaultfg, 10);
> +                     else if (xsetcolorname(defaultfg, p))
> +                             fprintf(stderr, "erresc: invalid foreground 
> color %d\n", p);
> +                     else
> +                             redraw();
> +                     break;
>               case 4: /* color set */
>                       if (narg < 3)
>                               break;
> @@ -1887,7 +1952,10 @@ strhandle(void)
>                       /* FALLTHROUGH */
>               case 104: /* color reset, here p = NULL */
>                       j = (narg > 1) ? atoi(strescseq.args[1]) : -1;

The variable j should be checked and also the xgetcolor and/or functions using
it should have range checks. It seems dc.col can be out-of-bounds with some
input. I also noticed a crash here while testing.

> -                     if (xsetcolorname(j, p)) {
> +
> +                     if(!strcmp(p, "?"))
> +                             osc4_color_response(j);
> +                     else if (xsetcolorname(j, p)) {
>                               if (par == 104 && narg <= 1)
>                                       return; /* color reset without 
> parameter */
>                               fprintf(stderr, "erresc: invalid color j=%d, 
> p=%s\n",
> diff --git a/st.h b/st.h
> index fa2eddf..47d76ca 100644
> --- a/st.h
> +++ b/st.h
> @@ -107,6 +107,7 @@ char *getsel(void);
>  
>  size_t utf8encode(Rune, char *);
>  
> +void xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b);

xgetcolor should be below xstrdup and as a separate line.

>  void *xmalloc(size_t);
>  void *xrealloc(void *, size_t);
>  char *xstrdup(const char *);
> @@ -123,3 +124,4 @@ extern char *termname;
>  extern unsigned int tabspaces;
>  extern unsigned int defaultfg;
>  extern unsigned int defaultbg;
> +extern unsigned int defaultcs;
> diff --git a/x.c b/x.c
> index 89786b8..3761fd0 100644
> --- a/x.c
> +++ b/x.c
> @@ -799,6 +799,14 @@ xloadcols(void)
>       loaded = 1;
>  }
>  
> +void
> +xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b)
> +{
> +     *r = dc.col[x].color.red >> 8;
> +     *g = dc.col[x].color.green >> 8;
> +     *b = dc.col[x].color.blue >> 8;
> +}
> +
>  int
>  xsetcolorname(int x, const char *name)
>  {

This patch needs a bit more care and testing to be able to accept it.

Thanks for your efforts,

-- 
Kind regards,
Hiltjo

Reply via email to