Add prompt-cursor-colour and prompt-cursor-style to set the style of the
authornicm <nicm@openbsd.org>
Mon, 7 Oct 2024 12:58:36 +0000 (12:58 +0000)
committernicm <nicm@openbsd.org>
Mon, 7 Oct 2024 12:58:36 +0000 (12:58 +0000)
cursor in the command prompt and remove the emulated cursor, from
Alexander Arch in GitHub issue 4170.

usr.bin/tmux/options-table.c
usr.bin/tmux/server-client.c
usr.bin/tmux/status.c
usr.bin/tmux/tmux.1

index 69326c1..44c4506 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: options-table.c,v 1.181 2024/10/07 08:50:47 nicm Exp $ */
+/* $OpenBSD: options-table.c,v 1.182 2024/10/07 12:58:36 nicm Exp $ */
 
 /*
  * Copyright (c) 2011 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -208,6 +208,7 @@ const struct options_name_map options_other_names[] = {
        { "display-panes-active-color", "display-panes-active-colour" },
        { "clock-mode-color", "clock-mode-colour" },
        { "cursor-color", "cursor-colour" },
+       { "prompt-cursor-color", "prompt-cursor-colour" },
        { "pane-colors", "pane-colours" },
        { NULL, NULL }
 };
@@ -832,6 +833,21 @@ const struct options_table_entry options_table[] = {
          .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",
          .type = OPTIONS_TABLE_STRING,
          .scope = OPTIONS_TABLE_SESSION,
index 5c4539f..65cf1f9 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: server-client.c,v 1.412 2024/10/07 08:50:47 nicm Exp $ */
+/* $OpenBSD: server-client.c,v 1.413 2024/10/07 12:58:36 nicm Exp $ */
 
 /*
  * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -2473,7 +2473,7 @@ server_client_reset_state(struct client *c)
 
        /* Move cursor to pane cursor and offset. */
        if (c->prompt_string != NULL) {
-               n = options_get_number(c->session->options, "status-position");
+               n = options_get_number(oo, "status-position");
                if (n == 0)
                        cy = 0;
                else {
@@ -2484,22 +2484,37 @@ server_client_reset_state(struct client *c)
                                cy = tty->sy - n;
                }
                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;
-                       cy = wp->yoff + s->cy - oy;
-
-                       if (status_at_line(c) == 0)
-                               cy += status_line_size(c);
+
+               n = options_get_number(oo, "prompt-cursor-colour");
+               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 (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;
+                               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);
        tty_cursor(tty, cx, cy);
index 65a5f84..5b64832 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: status.c,v 1.246 2024/10/04 19:16:13 nicm Exp $ */
+/* $OpenBSD: status.c,v 1.247 2024/10/07 12:58:36 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -660,7 +660,7 @@ status_prompt_set(struct client *c, struct cmd_find_state *fs,
        c->prompt_mode = PROMPT_ENTRY;
 
        if (~flags & PROMPT_INCREMENTAL)
-               c->tty.flags |= (TTY_NOCURSOR|TTY_FREEZE);
+               c->tty.flags |= TTY_FREEZE;
        c->flags |= CLIENT_REDRAWSTATUS;
 
        if (flags & PROMPT_INCREMENTAL)
@@ -738,7 +738,7 @@ status_prompt_redraw(struct client *c)
        struct screen            old_screen;
        u_int                    i, lines, offset, left, start, width;
        u_int                    pcursor, pwidth, promptline;
-       struct grid_cell         gc, cursorgc;
+       struct grid_cell         gc;
        struct format_tree      *ft;
 
        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);
        format_free(ft);
 
-       memcpy(&cursorgc, &gc, sizeof cursorgc);
-       cursorgc.attr ^= GRID_ATTR_REVERSE;
-
        start = format_width(c->prompt_string);
        if (start > c->tty.sx)
                start = c->tty.sx;
@@ -808,16 +805,9 @@ status_prompt_redraw(struct client *c)
                if (width > offset + pwidth)
                        break;
 
-               if (i != c->prompt_index) {
-                       utf8_copy(&gc.data, &c->prompt_buffer[i]);
-                       screen_write_cell(&ctx, &gc);
-               } else {
-                       utf8_copy(&cursorgc.data, &c->prompt_buffer[i]);
-                       screen_write_cell(&ctx, &cursorgc);
-               }
+               utf8_copy(&gc.data, &c->prompt_buffer[i]);
+               screen_write_cell(&ctx, &gc);
        }
-       if (sl->active->cx < screen_size_x(sl->active) && c->prompt_index >= i)
-               screen_write_putc(&ctx, &cursorgc, ' ');
 
 finished:
        screen_write_stop(&ctx);
index 0bb20ae..bd93f84 100644 (file)
@@ -1,4 +1,4 @@
-.\" $OpenBSD: tmux.1,v 1.963 2024/10/07 08:50:47 nicm Exp $
+.\" $OpenBSD: tmux.1,v 1.964 2024/10/07 12:58:36 nicm Exp $
 .\"
 .\" Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
 .\"
@@ -4550,6 +4550,13 @@ waits after
 .Ic prefix
 is input before dismissing it.
 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
 .Op Ic on | off
 .Xc