Leave the hardware cursor at the position of the selected line in choose
authornicm <nicm@openbsd.org>
Mon, 15 Nov 2021 10:58:13 +0000 (10:58 +0000)
committernicm <nicm@openbsd.org>
Mon, 15 Nov 2021 10:58:13 +0000 (10:58 +0000)
modes and current editing position and at the command prompt. It is
invisible but this is helpful for people using screen readers. GitHub
issue 2970.

usr.bin/tmux/mode-tree.c
usr.bin/tmux/server-client.c
usr.bin/tmux/status.c
usr.bin/tmux/tmux.h

index 1be4156..78f18cf 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: mode-tree.c,v 1.59 2021/10/26 12:22:23 nicm Exp $ */
+/* $OpenBSD: mode-tree.c,v 1.60 2021/11/15 10:58:13 nicm Exp $ */
 
 /*
  * Copyright (c) 2017 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -736,10 +736,8 @@ mode_tree_draw(struct mode_tree_data *mtd)
        }
 
        sy = screen_size_y(s);
-       if (!mtd->preview || sy <= 4 || h <= 4 || sy - h <= 4 || w <= 4) {
-               screen_write_stop(&ctx);
-               return;
-       }
+       if (!mtd->preview || sy <= 4 || h <= 4 || sy - h <= 4 || w <= 4)
+               goto done;
 
        line = &mtd->line_list[mtd->current];
        mti = line->item;
@@ -783,6 +781,8 @@ mode_tree_draw(struct mode_tree_data *mtd)
                mtd->drawcb(mtd->modedata, mti->itemdata, &ctx, box_x, box_y);
        }
 
+done:
+       screen_write_cursormove(&ctx, 0, mtd->current - mtd->offset, 0);
        screen_write_stop(&ctx);
 }
 
index 7879ce5..a91a24c 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: server-client.c,v 1.389 2021/10/28 18:54:33 nicm Exp $ */
+/* $OpenBSD: server-client.c,v 1.390 2021/11/15 10:58:13 nicm Exp $ */
 
 /*
  * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1706,7 +1706,7 @@ server_client_reset_state(struct client *c)
        struct window_pane      *wp = server_client_get_pane(c), *loop;
        struct screen           *s = NULL;
        struct options          *oo = c->session->options;
-       int                      mode = 0, cursor, flags;
+       int                      mode = 0, cursor, flags, n;
        u_int                    cx = 0, cy = 0, ox, oy, sx, sy;
 
        if (c->flags & (CLIENT_CONTROL|CLIENT_SUSPENDED))
@@ -1734,7 +1734,20 @@ server_client_reset_state(struct client *c)
        tty_margin_off(tty);
 
        /* Move cursor to pane cursor and offset. */
-       if (c->overlay_draw == NULL) {
+       if (c->prompt_string != NULL) {
+               n = options_get_number(c->session->options, "status-position");
+               if (n == 0)
+                       cy = 0;
+               else {
+                       n = status_line_size(c);
+                       if (n == 0)
+                               cy = tty->sy - 1;
+                       else
+                               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 &&
index 13bef13..7fb9764 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: status.c,v 1.230 2021/11/01 07:48:04 nicm Exp $ */
+/* $OpenBSD: status.c,v 1.231 2021/11/15 10:58:13 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -748,6 +748,7 @@ status_prompt_redraw(struct client *c)
                offset = 0;
        if (pwidth > left)
                pwidth = left;
+       c->prompt_cursor = start + c->prompt_index - offset;
 
        width = 0;
        for (i = 0; c->prompt_buffer[i].size != 0; i++) {
index 36935c8..ec0fb68 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.1154 2021/11/03 13:37:17 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.1155 2021/11/15 10:58:13 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1758,6 +1758,7 @@ struct client {
 #define PROMPT_KEY 0x10
        int              prompt_flags;
        enum prompt_type prompt_type;
+       int              prompt_cursor;
 
        struct session  *session;
        struct session  *last_session;