Add prompt-cursor-colour and prompt-cursor-style to set the style of the

cursor in the command prompt and remove the emulated cursor, from
Alexander Arch in GitHub issue 4170.
This commit is contained in:
nicm 2024-10-07 12:58:36 +00:00
parent a3dea81b49
commit 735082b7c2
4 changed files with 56 additions and 28 deletions

View File

@ -208,6 +208,7 @@ const struct options_name_map options_other_names[] = {
{ "display-panes-active-color", "display-panes-active-colour" }, { "display-panes-active-color", "display-panes-active-colour" },
{ "clock-mode-color", "clock-mode-colour" }, { "clock-mode-color", "clock-mode-colour" },
{ "cursor-color", "cursor-colour" }, { "cursor-color", "cursor-colour" },
{ "prompt-cursor-color", "prompt-cursor-colour" },
{ "pane-colors", "pane-colours" }, { "pane-colors", "pane-colours" },
{ NULL, NULL } { NULL, NULL }
}; };
@ -832,6 +833,21 @@ const struct options_table_entry options_table[] = {
.text = "Style of the status line." .text = "Style of the status line."
}, },
{ .name = "prompt-cursor-colour",
.type = OPTIONS_TABLE_COLOUR,
.scope = OPTIONS_TABLE_SESSION,
.default_num = 6,
.text = "Colour of the cursor when in the command prompt."
},
{ .name = "prompt-cursor-style",
.type = OPTIONS_TABLE_CHOICE,
.scope = OPTIONS_TABLE_SESSION,
.choices = options_table_cursor_style_list,
.default_num = 0,
.text = "Style of the cursor when in the command prompt."
},
{ .name = "update-environment", { .name = "update-environment",
.type = OPTIONS_TABLE_STRING, .type = OPTIONS_TABLE_STRING,
.scope = OPTIONS_TABLE_SESSION, .scope = OPTIONS_TABLE_SESSION,

View File

@ -2473,7 +2473,7 @@ server_client_reset_state(struct client *c)
/* Move cursor to pane cursor and offset. */ /* Move cursor to pane cursor and offset. */
if (c->prompt_string != NULL) { if (c->prompt_string != NULL) {
n = options_get_number(c->session->options, "status-position"); n = options_get_number(oo, "status-position");
if (n == 0) if (n == 0)
cy = 0; cy = 0;
else { else {
@ -2484,22 +2484,37 @@ server_client_reset_state(struct client *c)
cy = tty->sy - n; cy = tty->sy - n;
} }
cx = c->prompt_cursor; cx = c->prompt_cursor;
mode &= ~MODE_CURSOR;
} else if (c->overlay_draw == NULL) {
cursor = 0;
tty_window_offset(tty, &ox, &oy, &sx, &sy);
if (wp->xoff + s->cx >= ox && wp->xoff + s->cx <= ox + sx &&
wp->yoff + s->cy >= oy && wp->yoff + s->cy <= oy + sy) {
cursor = 1;
cx = wp->xoff + s->cx - ox; n = options_get_number(oo, "prompt-cursor-colour");
cy = wp->yoff + s->cy - oy; s->default_ccolour = n;
n = options_get_number(oo, "prompt-cursor-style");
screen_set_cursor_style(n, &s->default_cstyle,
&s->default_mode);
} else {
n = options_get_number(wp->options, "cursor-colour");
s->default_ccolour = n;
n = options_get_number(wp->options, "cursor-style");
screen_set_cursor_style(n, &s->default_cstyle,
&s->default_mode);
if (status_at_line(c) == 0) if (c->overlay_draw == NULL) {
cy += status_line_size(c); cursor = 0;
tty_window_offset(tty, &ox, &oy, &sx, &sy);
if (wp->xoff + s->cx >= ox &&
wp->xoff + s->cx <= ox + sx &&
wp->yoff + s->cy >= oy &&
wp->yoff + s->cy <= oy + sy) {
cursor = 1;
cx = wp->xoff + s->cx - ox;
cy = wp->yoff + s->cy - oy;
if (status_at_line(c) == 0)
cy += status_line_size(c);
}
if (!cursor)
mode &= ~MODE_CURSOR;
} }
if (!cursor)
mode &= ~MODE_CURSOR;
} }
log_debug("%s: cursor to %u,%u", __func__, cx, cy); log_debug("%s: cursor to %u,%u", __func__, cx, cy);
tty_cursor(tty, cx, cy); tty_cursor(tty, cx, cy);

View File

@ -660,7 +660,7 @@ status_prompt_set(struct client *c, struct cmd_find_state *fs,
c->prompt_mode = PROMPT_ENTRY; c->prompt_mode = PROMPT_ENTRY;
if (~flags & PROMPT_INCREMENTAL) if (~flags & PROMPT_INCREMENTAL)
c->tty.flags |= (TTY_NOCURSOR|TTY_FREEZE); c->tty.flags |= TTY_FREEZE;
c->flags |= CLIENT_REDRAWSTATUS; c->flags |= CLIENT_REDRAWSTATUS;
if (flags & PROMPT_INCREMENTAL) if (flags & PROMPT_INCREMENTAL)
@ -738,7 +738,7 @@ status_prompt_redraw(struct client *c)
struct screen old_screen; struct screen old_screen;
u_int i, lines, offset, left, start, width; u_int i, lines, offset, left, start, width;
u_int pcursor, pwidth, promptline; u_int pcursor, pwidth, promptline;
struct grid_cell gc, cursorgc; struct grid_cell gc;
struct format_tree *ft; struct format_tree *ft;
if (c->tty.sx == 0 || c->tty.sy == 0) if (c->tty.sx == 0 || c->tty.sy == 0)
@ -761,9 +761,6 @@ status_prompt_redraw(struct client *c)
style_apply(&gc, s->options, "message-style", ft); style_apply(&gc, s->options, "message-style", ft);
format_free(ft); format_free(ft);
memcpy(&cursorgc, &gc, sizeof cursorgc);
cursorgc.attr ^= GRID_ATTR_REVERSE;
start = format_width(c->prompt_string); start = format_width(c->prompt_string);
if (start > c->tty.sx) if (start > c->tty.sx)
start = c->tty.sx; start = c->tty.sx;
@ -808,16 +805,9 @@ status_prompt_redraw(struct client *c)
if (width > offset + pwidth) if (width > offset + pwidth)
break; break;
if (i != c->prompt_index) { utf8_copy(&gc.data, &c->prompt_buffer[i]);
utf8_copy(&gc.data, &c->prompt_buffer[i]); screen_write_cell(&ctx, &gc);
screen_write_cell(&ctx, &gc);
} else {
utf8_copy(&cursorgc.data, &c->prompt_buffer[i]);
screen_write_cell(&ctx, &cursorgc);
}
} }
if (sl->active->cx < screen_size_x(sl->active) && c->prompt_index >= i)
screen_write_putc(&ctx, &cursorgc, ' ');
finished: finished:
screen_write_stop(&ctx); screen_write_stop(&ctx);

7
tmux.1
View File

@ -4550,6 +4550,13 @@ waits after
.Ic prefix .Ic prefix
is input before dismissing it. is input before dismissing it.
Can be set to zero to disable any timeout. Can be set to zero to disable any timeout.
.It Ic prompt-cursor-colour Ar colour
Set the colour of the cursor in the command prompt.
.It Ic prompt-cursor-style Ar style
Set the style of the cursor in the command prompt.
See the
.Ic cursor-style
options for available styles.
.It Xo Ic renumber-windows .It Xo Ic renumber-windows
.Op Ic on | off .Op Ic on | off
.Xc .Xc