aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornicm <nicm>2021-11-15 10:58:13 +0000
committernicm <nicm>2021-11-15 10:58:13 +0000
commitb55f0ac6b94449b3372f0d1737fcf967f4fa13a2 (patch)
tree7990e52a80163eeaa327068efa9411de02a148f8
parentcb8a0d83fbaa2ae49c06105cb94d247ef20ed91e (diff)
downloadrtmux-b55f0ac6b94449b3372f0d1737fcf967f4fa13a2.tar.gz
rtmux-b55f0ac6b94449b3372f0d1737fcf967f4fa13a2.tar.bz2
rtmux-b55f0ac6b94449b3372f0d1737fcf967f4fa13a2.zip
Leave the hardware cursor at the position of the selected line in choose
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.
-rw-r--r--mode-tree.c8
-rw-r--r--server-client.c17
-rw-r--r--status.c1
-rw-r--r--tmux.h1
4 files changed, 21 insertions, 6 deletions
diff --git a/mode-tree.c b/mode-tree.c
index 85027caf..21a73ef2 100644
--- a/mode-tree.c
+++ b/mode-tree.c
@@ -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);
}
diff --git a/server-client.c b/server-client.c
index 7cea32c0..072c5589 100644
--- a/server-client.c
+++ b/server-client.c
@@ -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 &&
diff --git a/status.c b/status.c
index d499eab8..bb57b3d6 100644
--- a/status.c
+++ b/status.c
@@ -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++) {
diff --git a/tmux.h b/tmux.h
index 07e649f2..dfea1583 100644
--- a/tmux.h
+++ b/tmux.h
@@ -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;