mirror of
https://github.com/tmux/tmux.git
synced 2024-12-24 01:58:46 +00:00
Merge branch 'obsd-master' into master
This commit is contained in:
commit
7d330c19e8
47
input.c
47
input.c
@ -137,10 +137,12 @@ static void input_reset_cell(struct input_ctx *);
|
||||
static void input_osc_4(struct input_ctx *, const char *);
|
||||
static void input_osc_10(struct input_ctx *, const char *);
|
||||
static void input_osc_11(struct input_ctx *, const char *);
|
||||
static void input_osc_12(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 *);
|
||||
static void input_osc_112(struct input_ctx *, const char *);
|
||||
|
||||
/* Transition entry/exit handlers. */
|
||||
static void input_clear(struct input_ctx *);
|
||||
@ -2310,8 +2312,7 @@ input_exit_osc(struct input_ctx *ictx)
|
||||
input_osc_11(ictx, p);
|
||||
break;
|
||||
case 12:
|
||||
if (utf8_isvalid(p) && *p != '?') /* ? is colour request */
|
||||
screen_set_cursor_colour(sctx->s, p);
|
||||
input_osc_12(ictx, p);
|
||||
break;
|
||||
case 52:
|
||||
input_osc_52(ictx, p);
|
||||
@ -2326,8 +2327,7 @@ input_exit_osc(struct input_ctx *ictx)
|
||||
input_osc_111(ictx, p);
|
||||
break;
|
||||
case 112:
|
||||
if (*p == '\0') /* no arguments allowed */
|
||||
screen_set_cursor_colour(sctx->s, "");
|
||||
input_osc_112(ictx, p);
|
||||
break;
|
||||
default:
|
||||
log_debug("%s: unknown '%u'", __func__, option);
|
||||
@ -2489,7 +2489,9 @@ 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))
|
||||
if (c != -1)
|
||||
c = colour_force_rgb(c);
|
||||
if (c == -1)
|
||||
return;
|
||||
colour_split_rgb(c, &r, &g, &b);
|
||||
|
||||
@ -2564,7 +2566,7 @@ input_osc_10(struct input_ctx *ictx, const char *p)
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle the OSC 110 sequence for resetting background colour. */
|
||||
/* Handle the OSC 110 sequence for resetting foreground colour. */
|
||||
static void
|
||||
input_osc_110(struct input_ctx *ictx, const char *p)
|
||||
{
|
||||
@ -2624,6 +2626,39 @@ input_osc_111(struct input_ctx *ictx, const char *p)
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle the OSC 12 sequence for setting and querying cursor colour. */
|
||||
static void
|
||||
input_osc_12(struct input_ctx *ictx, const char *p)
|
||||
{
|
||||
struct window_pane *wp = ictx->wp;
|
||||
int c;
|
||||
|
||||
if (strcmp(p, "?") == 0) {
|
||||
if (wp != NULL) {
|
||||
c = ictx->ctx.s->ccolour;
|
||||
if (c == -1)
|
||||
c = ictx->ctx.s->default_ccolour;
|
||||
input_osc_colour_reply(ictx, 12, c);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if ((c = input_osc_parse_colour(p)) == -1) {
|
||||
log_debug("bad OSC 12: %s", p);
|
||||
return;
|
||||
}
|
||||
screen_set_cursor_colour(ictx->ctx.s, c);
|
||||
}
|
||||
|
||||
/* Handle the OSC 112 sequence for resetting cursor colour. */
|
||||
static void
|
||||
input_osc_112(struct input_ctx *ictx, const char *p)
|
||||
{
|
||||
if (*p == '\0') /* no arguments allowed */
|
||||
screen_set_cursor_colour(ictx->ctx.s, -1);
|
||||
}
|
||||
|
||||
|
||||
/* Handle the OSC 52 sequence for setting the clipboard. */
|
||||
static void
|
||||
input_osc_52(struct input_ctx *ictx, const char *p)
|
||||
|
@ -187,6 +187,7 @@ const struct options_name_map options_other_names[] = {
|
||||
{ "display-panes-color", "display-panes-colour" },
|
||||
{ "display-panes-active-color", "display-panes-active-colour" },
|
||||
{ "clock-mode-color", "clock-mode-colour" },
|
||||
{ "cursor-color", "cursor-colour" },
|
||||
{ "pane-colors", "pane-colours" },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
@ -234,6 +235,13 @@ const struct options_table_entry options_table[] = {
|
||||
"If empty, no command is run."
|
||||
},
|
||||
|
||||
{ .name = "cursor-colour",
|
||||
.type = OPTIONS_TABLE_COLOUR,
|
||||
.scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
|
||||
.default_num = -1,
|
||||
.text = "Colour of the cursor."
|
||||
},
|
||||
|
||||
{ .name = "default-terminal",
|
||||
.type = OPTIONS_TABLE_STRING,
|
||||
.scope = OPTIONS_TABLE_SERVER,
|
||||
|
@ -1106,15 +1106,22 @@ options_push_changes(const char *name)
|
||||
struct session *s;
|
||||
struct window *w;
|
||||
struct window_pane *wp;
|
||||
int c;
|
||||
|
||||
if (strcmp(name, "automatic-rename") == 0) {
|
||||
RB_FOREACH(w, windows, &windows) {
|
||||
if (w->active == NULL)
|
||||
continue;
|
||||
if (options_get_number(w->options, "automatic-rename"))
|
||||
if (options_get_number(w->options, name))
|
||||
w->active->flags |= PANE_CHANGED;
|
||||
}
|
||||
}
|
||||
if (strcmp(name, "cursor-colour") == 0) {
|
||||
RB_FOREACH(wp, window_pane_tree, &all_window_panes) {
|
||||
c = options_get_number(wp->options, name);
|
||||
wp->screen->default_ccolour = c;
|
||||
}
|
||||
}
|
||||
if (strcmp(name, "key-table") == 0) {
|
||||
TAILQ_FOREACH(loop, &clients, entry)
|
||||
server_client_set_key_table(loop, NULL);
|
||||
|
9
screen.c
9
screen.c
@ -81,7 +81,8 @@ screen_init(struct screen *s, u_int sx, u_int sy, u_int hlimit)
|
||||
s->path = NULL;
|
||||
|
||||
s->cstyle = SCREEN_CURSOR_DEFAULT;
|
||||
s->ccolour = xstrdup("");
|
||||
s->ccolour = -1;
|
||||
s->default_ccolour = -1;
|
||||
s->tabs = NULL;
|
||||
s->sel = NULL;
|
||||
|
||||
@ -125,7 +126,6 @@ screen_free(struct screen *s)
|
||||
free(s->tabs);
|
||||
free(s->path);
|
||||
free(s->title);
|
||||
free(s->ccolour);
|
||||
|
||||
if (s->write_list != NULL)
|
||||
screen_write_free_list(s);
|
||||
@ -189,10 +189,9 @@ screen_set_cursor_style(struct screen *s, u_int style)
|
||||
|
||||
/* Set screen cursor colour. */
|
||||
void
|
||||
screen_set_cursor_colour(struct screen *s, const char *colour)
|
||||
screen_set_cursor_colour(struct screen *s, int colour)
|
||||
{
|
||||
free(s->ccolour);
|
||||
s->ccolour = xstrdup(colour);
|
||||
s->ccolour = colour;
|
||||
}
|
||||
|
||||
/* Set screen title. */
|
||||
|
3
tmux.1
3
tmux.1
@ -4416,6 +4416,9 @@ The alternate screen feature preserves the contents of the window when an
|
||||
interactive application starts and restores it on exit, so that any output
|
||||
visible before the application starts reappears unchanged after it exits.
|
||||
.Pp
|
||||
.It Ic cursor-colour Ar colour
|
||||
Set the colour of the cursor.
|
||||
.Pp
|
||||
.It Ic pane-colours[] Ar colour
|
||||
The default colour palette.
|
||||
Each entry in the array defines the colour
|
||||
|
7
tmux.h
7
tmux.h
@ -780,7 +780,8 @@ struct screen {
|
||||
u_int cy; /* cursor y */
|
||||
|
||||
enum screen_cursor_style cstyle; /* cursor style */
|
||||
char *ccolour; /* cursor colour */
|
||||
int ccolour; /* cursor colour */
|
||||
int default_ccolour;
|
||||
|
||||
u_int rupper; /* scroll region top */
|
||||
u_int rlower; /* scroll region bottom */
|
||||
@ -1277,7 +1278,7 @@ struct tty {
|
||||
u_int cx;
|
||||
u_int cy;
|
||||
enum screen_cursor_style cstyle;
|
||||
char *ccolour;
|
||||
int ccolour;
|
||||
|
||||
int oflag;
|
||||
u_int oox;
|
||||
@ -2794,7 +2795,7 @@ void screen_reinit(struct screen *);
|
||||
void screen_free(struct screen *);
|
||||
void screen_reset_tabs(struct screen *);
|
||||
void screen_set_cursor_style(struct screen *, u_int);
|
||||
void screen_set_cursor_colour(struct screen *, const char *);
|
||||
void screen_set_cursor_colour(struct screen *, int);
|
||||
int screen_set_title(struct screen *, const char *);
|
||||
void screen_set_path(struct screen *, const char *);
|
||||
void screen_push_title(struct screen *);
|
||||
|
43
tty.c
43
tty.c
@ -38,7 +38,7 @@ static int tty_client_ready(struct client *);
|
||||
|
||||
static void tty_set_italics(struct tty *);
|
||||
static int tty_try_colour(struct tty *, int, const char *);
|
||||
static void tty_force_cursor_colour(struct tty *, const char *);
|
||||
static void tty_force_cursor_colour(struct tty *, int);
|
||||
static void tty_cursor_pane(struct tty *, const struct tty_ctx *, u_int,
|
||||
u_int);
|
||||
static void tty_cursor_pane_unless_wrap(struct tty *,
|
||||
@ -105,7 +105,7 @@ tty_init(struct tty *tty, struct client *c)
|
||||
tty->client = c;
|
||||
|
||||
tty->cstyle = SCREEN_CURSOR_DEFAULT;
|
||||
tty->ccolour = xstrdup("");
|
||||
tty->ccolour = -1;
|
||||
|
||||
if (tcgetattr(c->fd, &tty->tio) != 0)
|
||||
return (-1);
|
||||
@ -341,8 +341,8 @@ tty_start_tty(struct tty *tty)
|
||||
tty->flags |= TTY_STARTED;
|
||||
tty_invalidate(tty);
|
||||
|
||||
if (*tty->ccolour != '\0')
|
||||
tty_force_cursor_colour(tty, "");
|
||||
if (tty->ccolour != -1)
|
||||
tty_force_cursor_colour(tty, -1);
|
||||
|
||||
tty->mouse_drag_flag = 0;
|
||||
tty->mouse_drag_update = NULL;
|
||||
@ -406,7 +406,7 @@ tty_stop_tty(struct tty *tty)
|
||||
}
|
||||
if (tty->mode & MODE_BRACKETPASTE)
|
||||
tty_raw(tty, tty_term_string(tty->term, TTYC_DSBP));
|
||||
if (*tty->ccolour != '\0')
|
||||
if (tty->ccolour != -1)
|
||||
tty_raw(tty, tty_term_string(tty->term, TTYC_CR));
|
||||
|
||||
tty_raw(tty, tty_term_string(tty->term, TTYC_CNORM));
|
||||
@ -451,7 +451,6 @@ void
|
||||
tty_free(struct tty *tty)
|
||||
{
|
||||
tty_close(tty);
|
||||
free(tty->ccolour);
|
||||
}
|
||||
|
||||
void
|
||||
@ -650,24 +649,38 @@ tty_set_title(struct tty *tty, const char *title)
|
||||
}
|
||||
|
||||
static void
|
||||
tty_force_cursor_colour(struct tty *tty, const char *ccolour)
|
||||
tty_force_cursor_colour(struct tty *tty, int c)
|
||||
{
|
||||
if (*ccolour == '\0')
|
||||
u_char r, g, b;
|
||||
char s[13] = "";
|
||||
|
||||
if (c != -1)
|
||||
c = colour_force_rgb(c);
|
||||
if (c == tty->ccolour)
|
||||
return;
|
||||
if (c == -1)
|
||||
tty_putcode(tty, TTYC_CR);
|
||||
else
|
||||
tty_putcode_ptr1(tty, TTYC_CS, ccolour);
|
||||
free(tty->ccolour);
|
||||
tty->ccolour = xstrdup(ccolour);
|
||||
else {
|
||||
colour_split_rgb(c, &r, &g, &b);
|
||||
xsnprintf(s, sizeof s, "rgb:%02hhx/%02hhx/%02hhx", r, g, b);
|
||||
tty_putcode_ptr1(tty, TTYC_CS, s);
|
||||
}
|
||||
tty->ccolour = c;
|
||||
}
|
||||
|
||||
static void
|
||||
tty_update_cursor(struct tty *tty, int mode, int changed, struct screen *s)
|
||||
{
|
||||
enum screen_cursor_style cstyle;
|
||||
enum screen_cursor_style cstyle;
|
||||
int ccolour;
|
||||
|
||||
/* Set cursor colour if changed. */
|
||||
if (s != NULL && strcmp(s->ccolour, tty->ccolour) != 0)
|
||||
tty_force_cursor_colour(tty, s->ccolour);
|
||||
if (s != NULL) {
|
||||
ccolour = s->ccolour;
|
||||
if (s->ccolour == -1)
|
||||
ccolour = s->default_ccolour;
|
||||
tty_force_cursor_colour(tty, ccolour);
|
||||
}
|
||||
|
||||
/* If cursor is off, set as invisible. */
|
||||
if (~mode & MODE_CURSOR) {
|
||||
|
Loading…
Reference in New Issue
Block a user