=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/input.c,v retrieving revision 1.185 retrieving revision 1.186 diff -c -r1.185 -r1.186 *** src/usr.bin/tmux/input.c 2020/10/30 11:34:13 1.185 --- src/usr.bin/tmux/input.c 2021/02/15 09:39:38 1.186 *************** *** 1,4 **** ! /* $OpenBSD: input.c,v 1.185 2020/10/30 11:34:13 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: input.c,v 1.186 2021/02/15 09:39:38 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 138,143 **** --- 138,145 ---- static void input_osc_11(struct input_ctx *, const char *); static void input_osc_52(struct input_ctx *, const char *); static void input_osc_104(struct input_ctx *, const char *); + static void input_osc_110(struct input_ctx *, const char *); + static void input_osc_111(struct input_ctx *, const char *); /* Transition entry/exit handlers. */ static void input_clear(struct input_ctx *); *************** *** 2304,2309 **** --- 2306,2317 ---- case 104: input_osc_104(ictx, p); break; + case 110: + input_osc_110(ictx, p); + break; + case 111: + input_osc_111(ictx, p); + break; case 112: if (*p == '\0') /* no arguments allowed */ screen_set_cursor_colour(sctx->s, ""); *************** *** 2422,2471 **** /* Parse colour from OSC. */ static int ! input_osc_parse_colour(const char *p, u_int *r, u_int *g, u_int *b) { ! u_int rsize, gsize, bsize; ! const char *cp, *s = p; ! if (sscanf(p, "rgb:%x/%x/%x", r, g, b) != 3) ! return (0); ! p += 4; ! ! cp = strchr(p, '/'); ! rsize = cp - p; ! if (rsize == 1) ! (*r) = (*r) | ((*r) << 4); ! else if (rsize == 3) ! (*r) >>= 4; ! else if (rsize == 4) ! (*r) >>= 8; ! else if (rsize != 2) ! return (0); ! ! p = cp + 1; ! cp = strchr(p, '/'); ! gsize = cp - p; ! if (gsize == 1) ! (*g) = (*g) | ((*g) << 4); ! else if (gsize == 3) ! (*g) >>= 4; ! else if (gsize == 4) ! (*g) >>= 8; ! else if (gsize != 2) ! return (0); ! ! bsize = strlen(cp + 1); ! if (bsize == 1) ! (*b) = (*b) | ((*b) << 4); ! else if (bsize == 3) ! (*b) >>= 4; ! else if (bsize == 4) ! (*b) >>= 8; ! else if (bsize != 2) ! return (0); ! ! log_debug("%s: %s = %02x%02x%02x", __func__, s, *r, *g, *b); ! return (1); } /* Reply to a colour request. */ --- 2430,2470 ---- /* Parse colour from OSC. */ static int ! input_osc_parse_colour(const char *p) { ! double c, m, y, k = 0; ! u_int r, g, b; ! size_t len = strlen(p); ! int colour = -1; ! char *copy; ! if ((len == 12 && sscanf(p, "rgb:%02x/%02x/%02x", &r, &g, &b) == 3) || ! (len == 7 && sscanf(p, "#%02x%02x%02x", &r, &g, &b) == 3) || ! sscanf(p, "%d,%d,%d", &r, &g, &b) == 3) ! colour = colour_join_rgb(r, g, b); ! else if ((len == 18 && ! sscanf(p, "rgb:%04x/%04x/%04x", &r, &g, &b) == 3) || ! (len == 13 && sscanf(p, "#%04x%04x%04x", &r, &g, &b) == 3)) ! colour = colour_join_rgb(r >> 8, g >> 8, b >> 8); ! else if ((sscanf(p, "cmyk:%lf/%lf/%lf/%lf", &c, &m, &y, &k) == 4 || ! sscanf(p, "cmy:%lf/%lf/%lf", &c, &m, &y) == 3) && ! c >= 0 && c <= 1 && m >= 0 && m <= 1 && ! y >= 0 && y <= 1 && k >= 0 && k <= 1) { ! colour = colour_join_rgb( ! (1 - c) * (1 - k) * 255, ! (1 - m) * (1 - k) * 255, ! (1 - y) * (1 - k) * 255); ! } else { ! while (*p == ' ') ! p++; ! while (len != 0 && p[len - 1] == ' ') ! len--; ! copy = xstrndup(p, len); ! colour = colour_byname(copy); ! free(copy); ! } ! log_debug("%s: %s = %s", __func__, p, colour_tostring(colour)); ! return (colour); } /* Reply to a colour request. */ *************** *** 2493,2499 **** struct window_pane *wp = ictx->wp; char *copy, *s, *next = NULL; long idx; ! u_int r, g, b; if (wp == NULL) return; --- 2492,2498 ---- struct window_pane *wp = ictx->wp; char *copy, *s, *next = NULL; long idx; ! int c; if (wp == NULL) return; *************** *** 2507,2518 **** goto bad; s = strsep(&next, ";"); ! if (!input_osc_parse_colour(s, &r, &g, &b)) { s = next; continue; } ! window_pane_set_palette(wp, idx, colour_join_rgb(r, g, b)); s = next; } --- 2506,2517 ---- goto bad; s = strsep(&next, ";"); ! if ((c = input_osc_parse_colour(s)) == -1) { s = next; continue; } ! window_pane_set_palette(wp, idx, c); s = next; } *************** *** 2530,2536 **** { struct window_pane *wp = ictx->wp; struct grid_cell defaults; ! u_int r, g, b; if (wp == NULL) return; --- 2529,2535 ---- { struct window_pane *wp = ictx->wp; struct grid_cell defaults; ! int c; if (wp == NULL) return; *************** *** 2541,2549 **** return; } ! if (!input_osc_parse_colour(p, &r, &g, &b)) goto bad; ! wp->fg = colour_join_rgb(r, g, b); wp->flags |= (PANE_REDRAW|PANE_STYLECHANGED); return; --- 2540,2548 ---- return; } ! if ((c = input_osc_parse_colour(p)) == -1) goto bad; ! wp->fg = c; wp->flags |= (PANE_REDRAW|PANE_STYLECHANGED); return; *************** *** 2552,2564 **** log_debug("bad OSC 10: %s", p); } /* Handle the OSC 11 sequence for setting and querying background colour. */ static void input_osc_11(struct input_ctx *ictx, const char *p) { struct window_pane *wp = ictx->wp; struct grid_cell defaults; ! u_int r, g, b; if (wp == NULL) return; --- 2551,2579 ---- log_debug("bad OSC 10: %s", p); } + /* Handle the OSC 110 sequence for resetting background colour. */ + static void + input_osc_110(struct input_ctx *ictx, const char *p) + { + struct window_pane *wp = ictx->wp; + + if (wp == NULL) + return; + + if (*p != '\0') + return; + + wp->fg = 8; + wp->flags |= (PANE_REDRAW|PANE_STYLECHANGED); + } + /* Handle the OSC 11 sequence for setting and querying background colour. */ static void input_osc_11(struct input_ctx *ictx, const char *p) { struct window_pane *wp = ictx->wp; struct grid_cell defaults; ! int c; if (wp == NULL) return; *************** *** 2569,2583 **** return; } ! if (!input_osc_parse_colour(p, &r, &g, &b)) ! goto bad; ! wp->bg = colour_join_rgb(r, g, b); wp->flags |= (PANE_REDRAW|PANE_STYLECHANGED); return; bad: log_debug("bad OSC 11: %s", p); } /* Handle the OSC 52 sequence for setting the clipboard. */ --- 2584,2614 ---- return; } ! if ((c = input_osc_parse_colour(p)) == -1) ! goto bad; ! wp->bg = c; wp->flags |= (PANE_REDRAW|PANE_STYLECHANGED); return; bad: log_debug("bad OSC 11: %s", p); + } + + /* Handle the OSC 111 sequence for resetting background colour. */ + static void + input_osc_111(struct input_ctx *ictx, const char *p) + { + struct window_pane *wp = ictx->wp; + + if (wp == NULL) + return; + + if (*p != '\0') + return; + + wp->bg = 8; + wp->flags |= (PANE_REDRAW|PANE_STYLECHANGED); } /* Handle the OSC 52 sequence for setting the clipboard. */