On Sun, Mar 20, 2022 at 05:36:04PM +0600, NRK wrote:
> * adds missing function prototype
> * move xgetcolor() prototype to win.h (that's where all the other x.c
>   func prototype seems to be declared at).
> * reduces code duplication for osc 10/11/12
> * unify osc_color_response() and osc4_color_response() into a single function.
> 
> the latter two was suggested by Quentin Rameau in his patch review on
> the hackers list.
> ---
>  st.c  | 72 ++++++++++++++++-------------------------------------------
>  st.h  |  2 --
>  win.h |  1 +
>  3 files changed, 20 insertions(+), 55 deletions(-)
> 
> diff --git a/st.c b/st.c
> index c71fa06..068c92c 100644
> --- a/st.c
> +++ b/st.c
> @@ -161,6 +161,7 @@ static void csidump(void);
>  static void csihandle(void);
>  static void csiparse(void);
>  static void csireset(void);
> +static void osc_color_response(int, int, int);
>  static int eschandle(uchar);
>  static void strdump(void);
>  static void strhandle(void);
> @@ -1843,38 +1844,20 @@ csireset(void)
>  }
>  
>  void
> -osc4_color_response(int num)
> +osc_color_response(int num, int index, int is_osc4)
>  {
>       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);
> +     if (xgetcolor(is_osc4 ? num : index, &r, &g, &b)) {
> +             fprintf(stderr, "erresc: failed to fetch %s color %d\n",
> +                     is_osc4 ? "osc4" : "osc", is_osc4 ? num : index);
>               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);
> -}

A nitpick, because I think the string always fits in the buffer `buf`, but: the
return value can be negative or on truncation >= sizeof(buf). So the pattern
of:

        n = snprintf(...);
        ttywrite(..., n, ...);

Is not good.

> -
> -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);
> -
> +     n = snprintf(buf, sizeof buf, 
> "\033]%s%d;rgb:%02x%02x/%02x%02x/%02x%02x\007",
> +                  is_osc4 ? "4;" : "", num, r, r, g, g, b, b);
>       ttywrite(buf, n, 1);
>  }
>  
> @@ -1883,6 +1866,11 @@ strhandle(void)
>  {
>       char *p = NULL, *dec;
>       int j, narg, par;
> +     const struct { int idx; char *str; } osc_table[] = {
> +             { defaultfg, "foreground" },
> +             { defaultbg, "background" },
> +             { defaultcs, "cursor" }
> +     };
>  
>       term.esc &= ~(ESC_STR_END|ESC_STR);
>       strparse();
> @@ -1917,41 +1905,19 @@ 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
> -                             tfulldirt();
> -                     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: %s\n", p);
> -                     else
> -                             tfulldirt();
> -                     return;
>               case 12:
>                       if (narg < 2)
>                               break;
> -
>                       p = strescseq.args[1];
> +                     if ((j = par - 10) < 0 || j >= LEN(osc_table))
> +                             break; /* shouldn't be possible */
>  
>                       if (!strcmp(p, "?"))
> -                             osc_color_response(defaultcs, 12);
> -                     else if (xsetcolorname(defaultcs, p))
> -                             fprintf(stderr, "erresc: invalid cursor color: 
> %s\n", p);
> +                             osc_color_response(par, osc_table[j].idx, 0);
> +                     else if (xsetcolorname(osc_table[j].idx, p))
> +                             fprintf(stderr, "erresc: invalid %s color: 
> %s\n",
> +                                     osc_table[j].str, p);
>                       else
>                               tfulldirt();
>                       return;
> @@ -1964,7 +1930,7 @@ strhandle(void)
>                       j = (narg > 1) ? atoi(strescseq.args[1]) : -1;
>  
>                       if (p && !strcmp(p, "?"))
> -                             osc4_color_response(j);
> +                             osc_color_response(j, 0, 1);
>                       else if (xsetcolorname(j, p)) {
>                               if (par == 104 && narg <= 1)
>                                       return; /* color reset without 
> parameter */
> diff --git a/st.h b/st.h
> index 519b9bd..fd3b0d8 100644
> --- a/st.h
> +++ b/st.h
> @@ -111,8 +111,6 @@ 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;
> diff --git a/win.h b/win.h
> index e6e4369..6de960d 100644
> --- a/win.h
> +++ b/win.h
> @@ -30,6 +30,7 @@ void xdrawline(Line, int, int, int);
>  void xfinishdraw(void);
>  void xloadcols(void);
>  int xsetcolorname(int, const char *);
> +int xgetcolor(int, unsigned char *, unsigned char *, unsigned char *);
>  void xseticontitle(char *);
>  void xsettitle(char *);
>  int xsetcursor(int);
> -- 
> 2.34.1
> 
> 

-- 
Kind regards,
Hiltjo

Reply via email to