Introduction
Introduction Statistics Contact Development Disclaimer Help
code-golfing: cleanup osc color related code - st - simple terminal
git clone git://git.suckless.org/st
Log
Files
Refs
README
LICENSE
---
commit 8629d9a1da72cc18568a8f146307b0e939b77ebf
parent ef0551932fb162f907b40185d2f48c3b497708ee
Author: NRK <[email protected]>
Date: Fri, 7 Jan 2022 23:21:04 +0600
code-golfing: cleanup osc color related code
* 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)
* check for snprintf error/truncation
* 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.
Diffstat:
M st.c | 90 +++++++++++------------------…
M st.h | 2 --
M win.h | 1 +
3 files changed, 33 insertions(+), 60 deletions(-)
---
diff --git 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);
@@ -1835,39 +1836,28 @@ 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%02…
- 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", inde…
- return;
+ n = snprintf(buf, sizeof buf, "\033]%s%d;rgb:%02x%02x/%02x%02x/%02x%02…
+ is_osc4 ? "4;" : "", num, r, r, g, g, b, b);
+ if (n < 0 || n >= sizeof(buf)) {
+ fprintf(stderr, "error: %s while printing %s response\n",
+ n < 0 ? "snprintf failed" : "truncation occurred",
+ is_osc4 ? "osc4" : "osc");
+ } else {
+ ttywrite(buf, n, 1);
}
-
- n = snprintf(buf, sizeof buf, "\033]%d;rgb:%02x%02x/%02x%02x/%02x%02x\…
- num, r, r, g, g, b, b);
-
- ttywrite(buf, n, 1);
}
void
@@ -1875,6 +1865,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();
@@ -1909,43 +1904,22 @@ 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 co…
- 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 co…
- else
- tfulldirt();
- return;
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:…
- else
+ if ((j = par - 10) < 0 || j >= LEN(osc_table))
+ break; /* shouldn't be possible */
+
+ if (!strcmp(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\…
+ osc_table[j].str, p);
+ } else {
tfulldirt();
+ }
return;
case 4: /* color set */
if (narg < 3)
@@ -1955,9 +1929,9 @@ strhandle(void)
case 104: /* color reset */
j = (narg > 1) ? atoi(strescseq.args[1]) : -1;
- if (p && !strcmp(p, "?"))
- osc4_color_response(j);
- else if (xsetcolorname(j, p)) {
+ if (p && !strcmp(p, "?")) {
+ osc_color_response(j, 0, 1);
+ } else if (xsetcolorname(j, p)) {
if (par == 104 && narg <= 1)
return; /* color reset without paramet…
fprintf(stderr, "erresc: invalid color j=%d, p…
diff --git 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
@@ -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);
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.