On Sun, Dec 12, 2021 at 01:29:32AM -0500, Raheman Vaiya wrote:
> > -static unsigned int defaultcs = 256;
> >> +unsigned int defaultfg = 255;
> >> +unsigned int defaultbg = 254;
> >> +unsigned int defaultcs = 256;
> 
> > The values in the config are changed here. Is it intended? If so, why?
> 
> The colours 0 and 7 are distinct and can be set independently from the
> foreground and background colours in most terminals. I modified defaultbg
> and
> defaultfg to reflect this. In retrospect, I probably should have made them >
> 255 to avoid conflicting with legitimate palette colours. I have done so in
> the
> amended patch.
> 
> >> +     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.
> 
> Ok.
> 
> >> +                     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.
> 
> Oops. I'm not sure why my gcc didn't produce a warning.
> 
> > Case 10 should be ordered before case 11.
> 
> Ok.
> 
> >               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.
> 
> Ok.
> 
> >> +void xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char
> *b);
> 
> > xgetcolor should be below xstrdup and as a separate line.
> 
> Will do.
> 
> Thanks for reviewing the patch :). I have attached an amended copy below.
> Let
> me know if anything else requires attention.
> 
> Regards,
> Raheman
> 
> On Sat, Dec 11, 2021 at 7:01 AM Hiltjo Posthuma <hil...@codemadness.org>
> wrote:
> 
> > 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
> >
> >

> diff --git a/config.def.h b/config.def.h
> index 6f05dce..91ab8ca 100644
> --- a/config.def.h
> +++ b/config.def.h
> @@ -120,6 +120,8 @@ static const char *colorname[] = {
>       /* more colors can be added after 255 to use with DefaultXX */
>       "#cccccc",
>       "#555555",
> +     "gray90", /* default foreground colour */
> +     "black", /* default background colour */
>  };
>  
>  
> @@ -127,9 +129,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 = 258;
> +unsigned int defaultbg = 259;
> +unsigned int defaultcs = 256;
>  static unsigned int defaultrcs = 257;
>  
>  /*
> diff --git a/st.c b/st.c
> index a9338e1..ad5c8e8 100644
> --- a/st.c
> +++ b/st.c
> @@ -1842,6 +1842,42 @@ csireset(void)
>       memset(&csiescseq, 0, sizeof(csiescseq));
>  }
>  
> +void
> +osc4_color_response(int num)
> +{
> +     int n;
> +     char buf[32];
> +     unsigned char r,g,b;
> +
> +     if (xgetcolor(num, &r,&g,&b)) {
> +             fprintf(stderr, "erresc: failed to fetch osc4 color %d\n", num);
> +             return;
> +     }
> +
> +     n = snprintf(buf, sizeof buf, 
> "\033]4;%d;rgb:%02x%02x/%02x%02x/%02x%02x\007",
> +                  num, r, r, g, g, b, b);
> +
> +     ttywrite(buf, n, 1);
> +}
> +
> +void
> +osc_color_response(int index, int num)
> +{
> +     int n;
> +     char buf[32];
> +     unsigned char r,g,b;
> +
> +     if (xgetcolor(index, &r,&g,&b)) {
> +             fprintf(stderr, "erresc: failed to fetch osc color %d\n", 
> index);
> +             return;
> +     }
> +
> +     n = snprintf(buf, sizeof 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 +1916,45 @@ strhandle(void)
>                               }
>                       }
>                       return;
> +             case 10:
> +                     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: %s\n", p);
> +                     else
> +                             redraw();
> +                     break;
> +             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: %s\n", p);
> +                     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: 
> %s\n", p);
> +                     else
> +                             redraw();
> +                     break;
>               case 4: /* color set */
>                       if (narg < 3)
>                               break;
> @@ -1887,7 +1962,10 @@ strhandle(void)
>                       /* FALLTHROUGH */
>               case 104: /* color reset, here p = NULL */
>                       j = (narg > 1) ? atoi(strescseq.args[1]) : -1;
> -                     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..519b9bd 100644
> --- a/st.h
> +++ b/st.h
> @@ -111,6 +111,8 @@ void *xmalloc(size_t);
>  void *xrealloc(void *, size_t);
>  char *xstrdup(const char *);
>  
> +int xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b);
> +
>  /* config.h globals */
>  extern char *utmp;
>  extern char *scroll;
> @@ -123,3 +125,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..8a16faa 100644
> --- a/x.c
> +++ b/x.c
> @@ -799,6 +799,19 @@ xloadcols(void)
>       loaded = 1;
>  }
>  
> +int
> +xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b)
> +{
> +     if (!BETWEEN(x, 0, dc.collen))
> +             return 1;
> +
> +     *r = dc.col[x].color.red >> 8;
> +     *g = dc.col[x].color.green >> 8;
> +     *b = dc.col[x].color.blue >> 8;
> +
> +     return 0;
> +}
> +
>  int
>  xsetcolorname(int x, const char *name)
>  {

Hi,

Pushed and added small code-style changes and a follow-up fix.

Thanks for the patch,

-- 
Kind regards,
Hiltjo

Reply via email to