@@ 168,7 168,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 void osc_color_response(int, int);
static int eschandle(uchar);
static void strdump(void);
static void strhandle(void);
@@ 1898,28 1898,39 @@ csireset(void)
}
void
-osc_color_response(int num, int index, int is_osc4)
+osc4_color_response(int num)
{
int n;
char buf[32];
unsigned char r, g, b;
- 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);
+ if (xgetcolor(num, &r, &g, &b)) {
+ fprintf(stderr, "erresc: failed to fetch osc4 color %d\n", num);
return;
}
- 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);
- 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]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
@@ 1966,23 1977,44 @@ 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 ((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\n",
- osc_table[j].str, p);
- } else {
- tfulldirt();
- }
- return;
+
+ 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;
@@ 1991,9 2023,9 @@ strhandle(void)
case 104: /* color reset */
j = (narg > 1) ? atoi(strescseq.args[1]) : -1;
- if (p && !strcmp(p, "?")) {
- osc_color_response(j, 0, 1);
- } else 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",