aboutsummaryrefslogtreecommitdiff
path: root/input.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2020-11-03 08:35:52 +0000
committerNicholas Marriott <nicholas.marriott@gmail.com>2020-11-03 08:35:52 +0000
commitba9962b568dd111455963c88b0458cf8847c9690 (patch)
treea13a66498befbd75237a3a7a3869ccd2c52b8452 /input.c
parent733abfcfc5b05cb3e1f2cf08f00a9325c6f6fa04 (diff)
parentff53eed402abb146096673963da39b5036a5c861 (diff)
downloadrtmux-ba9962b568dd111455963c88b0458cf8847c9690.tar.gz
rtmux-ba9962b568dd111455963c88b0458cf8847c9690.tar.bz2
rtmux-ba9962b568dd111455963c88b0458cf8847c9690.zip
Merge branch 'master' into 3.2-rc
Diffstat (limited to 'input.c')
-rw-r--r--input.c51
1 files changed, 43 insertions, 8 deletions
diff --git a/input.c b/input.c
index 60bfa8e2..8b7ba08a 100644
--- a/input.c
+++ b/input.c
@@ -65,7 +65,7 @@ struct input_param {
INPUT_MISSING,
INPUT_NUMBER,
INPUT_STRING
- } type;
+ } type;
union {
int num;
char *str;
@@ -81,7 +81,7 @@ struct input_ctx {
struct input_cell cell;
struct input_cell old_cell;
- u_int old_cx;
+ u_int old_cx;
u_int old_cy;
int old_mode;
@@ -121,7 +121,7 @@ struct input_ctx {
* All input received since we were last in the ground state. Sent to
* control clients on connection.
*/
- struct evbuffer *since_ground;
+ struct evbuffer *since_ground;
};
/* Helper functions. */
@@ -1545,6 +1545,10 @@ input_csi_dispatch(struct input_ctx *ictx)
if (n == -1)
break;
+ m = screen_size_x(s) - s->cx;
+ if (n > m)
+ n = m;
+
if (ictx->last == -1)
break;
ictx->ch = ictx->last;
@@ -1867,6 +1871,7 @@ input_csi_dispatch_winops(struct input_ctx *ictx)
case 2:
screen_pop_title(sctx->s);
if (wp != NULL) {
+ notify_pane("pane-title-changed", wp);
server_redraw_window_borders(wp->window);
server_status_window(wp->window);
}
@@ -2266,6 +2271,7 @@ input_exit_osc(struct input_ctx *ictx)
case 0:
case 2:
if (screen_set_title(sctx->s, p) && wp != NULL) {
+ notify_pane("pane-title-changed", wp);
server_redraw_window_borders(wp->window);
server_status_window(wp->window);
}
@@ -2331,6 +2337,7 @@ input_exit_apc(struct input_ctx *ictx)
log_debug("%s: \"%s\"", __func__, ictx->input_buf);
if (screen_set_title(sctx->s, ictx->input_buf) && wp != NULL) {
+ notify_pane("pane-title-changed", wp);
server_redraw_window_borders(wp->window);
server_status_window(wp->window);
}
@@ -2461,13 +2468,31 @@ input_osc_parse_colour(const char *p, u_int *r, u_int *g, u_int *b)
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. */
static void
input_osc_4(struct input_ctx *ictx, const char *p)
{
struct window_pane *wp = ictx->wp;
char *copy, *s, *next = NULL;
- long idx;
+ long idx;
u_int r, g, b;
if (wp == NULL)
@@ -2499,17 +2524,22 @@ bad:
free(copy);
}
-/* Handle the OSC 10 sequence for setting foreground colour. */
+/* Handle the OSC 10 sequence for setting and querying foreground colour. */
static void
input_osc_10(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;
- if (strcmp(p, "?") == 0)
+
+ if (strcmp(p, "?") == 0) {
+ tty_default_colours(&defaults, wp);
+ input_osc_colour_reply(ictx, 10, defaults.fg);
return;
+ }
if (!input_osc_parse_colour(p, &r, &g, &b))
goto bad;
@@ -2522,17 +2552,22 @@ bad:
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
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;
- if (strcmp(p, "?") == 0)
+
+ if (strcmp(p, "?") == 0) {
+ tty_default_colours(&defaults, wp);
+ input_osc_colour_reply(ictx, 11, defaults.bg);
return;
+ }
if (!input_osc_parse_colour(p, &r, &g, &b))
goto bad;