version 1.182, 2020/07/24 07:05:37 |
version 1.183, 2020/08/19 06:37:23 |
|
|
INPUT_MISSING, |
INPUT_MISSING, |
INPUT_NUMBER, |
INPUT_NUMBER, |
INPUT_STRING |
INPUT_STRING |
} type; |
} type; |
union { |
union { |
int num; |
int num; |
char *str; |
char *str; |
|
|
struct input_cell cell; |
struct input_cell cell; |
|
|
struct input_cell old_cell; |
struct input_cell old_cell; |
u_int old_cx; |
u_int old_cx; |
u_int old_cy; |
u_int old_cy; |
int old_mode; |
int old_mode; |
|
|
|
|
* All input received since we were last in the ground state. Sent to |
* All input received since we were last in the ground state. Sent to |
* control clients on connection. |
* control clients on connection. |
*/ |
*/ |
struct evbuffer *since_ground; |
struct evbuffer *since_ground; |
}; |
}; |
|
|
/* Helper functions. */ |
/* Helper functions. */ |
|
|
return (1); |
return (1); |
} |
} |
|
|
|
/* Reply to a colour request. */ |
|
static void |
|
input_osc_colour_reply(struct input_ctx *ictx, u_int n, int c) |
|
{ |
|
u_char r, g, b; |
|
const char *end; |
|
|
|
if (c == 8 || (~c & COLOUR_FLAG_RGB)) |
|
return; |
|
colour_split_rgb(c, &r, &g, &b); |
|
|
|
if (ictx->input_end == INPUT_END_BEL) |
|
end = "\007"; |
|
else |
|
end = "\033\\"; |
|
input_reply(ictx, "\033]%u;rgb:%02hhx/%02hhx/%02hhx%s", n, r, g, b, end); |
|
} |
|
|
/* Handle the OSC 4 sequence for setting (multiple) palette entries. */ |
/* Handle the OSC 4 sequence for setting (multiple) palette entries. */ |
static void |
static void |
input_osc_4(struct input_ctx *ictx, const char *p) |
input_osc_4(struct input_ctx *ictx, const char *p) |
{ |
{ |
struct window_pane *wp = ictx->wp; |
struct window_pane *wp = ictx->wp; |
char *copy, *s, *next = NULL; |
char *copy, *s, *next = NULL; |
long idx; |
long idx; |
u_int r, g, b; |
u_int r, g, b; |
|
|
if (wp == NULL) |
if (wp == NULL) |
|
|
free(copy); |
free(copy); |
} |
} |
|
|
/* Handle the OSC 10 sequence for setting foreground colour. */ |
/* Handle the OSC 10 sequence for setting and querying foreground colour. */ |
static void |
static void |
input_osc_10(struct input_ctx *ictx, const char *p) |
input_osc_10(struct input_ctx *ictx, const char *p) |
{ |
{ |
struct window_pane *wp = ictx->wp; |
struct window_pane *wp = ictx->wp; |
|
struct grid_cell defaults; |
u_int r, g, b; |
u_int r, g, b; |
|
|
if (wp == NULL) |
if (wp == NULL) |
return; |
return; |
if (strcmp(p, "?") == 0) |
|
|
if (strcmp(p, "?") == 0) { |
|
tty_default_colours(&defaults, wp); |
|
input_osc_colour_reply(ictx, 10, defaults.fg); |
return; |
return; |
|
} |
|
|
if (!input_osc_parse_colour(p, &r, &g, &b)) |
if (!input_osc_parse_colour(p, &r, &g, &b)) |
goto bad; |
goto bad; |
|
|
log_debug("bad OSC 10: %s", p); |
log_debug("bad OSC 10: %s", p); |
} |
} |
|
|
/* Handle the OSC 11 sequence for setting background colour. */ |
/* Handle the OSC 11 sequence for setting and querying background colour. */ |
static void |
static void |
input_osc_11(struct input_ctx *ictx, const char *p) |
input_osc_11(struct input_ctx *ictx, const char *p) |
{ |
{ |
struct window_pane *wp = ictx->wp; |
struct window_pane *wp = ictx->wp; |
|
struct grid_cell defaults; |
u_int r, g, b; |
u_int r, g, b; |
|
|
if (wp == NULL) |
if (wp == NULL) |
return; |
return; |
if (strcmp(p, "?") == 0) |
|
|
if (strcmp(p, "?") == 0) { |
|
tty_default_colours(&defaults, wp); |
|
input_osc_colour_reply(ictx, 11, defaults.bg); |
return; |
return; |
|
} |
|
|
if (!input_osc_parse_colour(p, &r, &g, &b)) |
if (!input_osc_parse_colour(p, &r, &g, &b)) |
goto bad; |
goto bad; |