mirror of
https://github.com/tmux/tmux.git
synced 2025-09-03 22:43:58 +00:00
Fix some cursor movement commands, from Anindya Mukherjee.
This commit is contained in:
@ -3981,11 +3981,12 @@ window_copy_cursor_start_of_line(struct window_mode_entry *wme)
|
|||||||
struct window_copy_mode_data *data = wme->data;
|
struct window_copy_mode_data *data = wme->data;
|
||||||
struct screen *back_s = data->backing;
|
struct screen *back_s = data->backing;
|
||||||
struct grid_reader gr;
|
struct grid_reader gr;
|
||||||
u_int px, py, cy, yy, ny, hsize;
|
u_int px, py, cy, oldy, yy, ny, nd, hsize;
|
||||||
|
|
||||||
px = data->cx;
|
px = data->cx;
|
||||||
hsize = screen_hsize(back_s);
|
hsize = screen_hsize(back_s);
|
||||||
py = hsize + data->cy - data->oy;
|
py = hsize + data->cy - data->oy;
|
||||||
|
oldy = data->cy;
|
||||||
|
|
||||||
grid_reader_start(&gr, back_s->grid, px, py);
|
grid_reader_start(&gr, back_s->grid, px, py);
|
||||||
grid_reader_cursor_start_of_line(&gr, 1);
|
grid_reader_cursor_start_of_line(&gr, 1);
|
||||||
@ -3996,9 +3997,11 @@ window_copy_cursor_start_of_line(struct window_mode_entry *wme)
|
|||||||
if (py < yy) {
|
if (py < yy) {
|
||||||
ny = yy - py;
|
ny = yy - py;
|
||||||
cy = 0;
|
cy = 0;
|
||||||
|
nd = 1;
|
||||||
} else {
|
} else {
|
||||||
ny = 0;
|
ny = 0;
|
||||||
cy = py - yy;
|
cy = py - yy;
|
||||||
|
nd = oldy - cy + 1;
|
||||||
}
|
}
|
||||||
while (ny > 0) {
|
while (ny > 0) {
|
||||||
window_copy_cursor_up(wme, 1);
|
window_copy_cursor_up(wme, 1);
|
||||||
@ -4006,7 +4009,7 @@ window_copy_cursor_start_of_line(struct window_mode_entry *wme)
|
|||||||
}
|
}
|
||||||
window_copy_update_cursor(wme, px, cy);
|
window_copy_update_cursor(wme, px, cy);
|
||||||
if (window_copy_update_selection(wme, 1, 0))
|
if (window_copy_update_selection(wme, 1, 0))
|
||||||
window_copy_redraw_lines(wme, data->cy, 1);
|
window_copy_redraw_lines(wme, data->cy, nd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -4038,11 +4041,12 @@ window_copy_cursor_end_of_line(struct window_mode_entry *wme)
|
|||||||
struct window_copy_mode_data *data = wme->data;
|
struct window_copy_mode_data *data = wme->data;
|
||||||
struct screen *back_s = data->backing;
|
struct screen *back_s = data->backing;
|
||||||
struct grid_reader gr;
|
struct grid_reader gr;
|
||||||
u_int px, py, cy, yy, ny, hsize;
|
u_int px, py, cy, oldy, yy, ny, nd, hsize;
|
||||||
|
|
||||||
px = data->cx;
|
px = data->cx;
|
||||||
hsize = screen_hsize(back_s);
|
hsize = screen_hsize(back_s);
|
||||||
py = hsize + data->cy - data->oy;
|
py = hsize + data->cy - data->oy;
|
||||||
|
oldy = data->cy;
|
||||||
|
|
||||||
grid_reader_start(&gr, back_s->grid, px, py);
|
grid_reader_start(&gr, back_s->grid, px, py);
|
||||||
if (data->screen.sel != NULL && data->rectflag)
|
if (data->screen.sel != NULL && data->rectflag)
|
||||||
@ -4054,10 +4058,14 @@ window_copy_cursor_end_of_line(struct window_mode_entry *wme)
|
|||||||
/* Scroll down if we went off the visible screen. */
|
/* Scroll down if we went off the visible screen. */
|
||||||
cy = py - hsize + data->oy;
|
cy = py - hsize + data->oy;
|
||||||
yy = screen_size_y(back_s) - 1;
|
yy = screen_size_y(back_s) - 1;
|
||||||
if (cy > yy)
|
if (cy > yy) {
|
||||||
ny = cy - yy;
|
ny = cy - yy;
|
||||||
else
|
oldy = yy;
|
||||||
|
nd = 1;
|
||||||
|
} else {
|
||||||
ny = 0;
|
ny = 0;
|
||||||
|
nd = cy - oldy + 1;
|
||||||
|
}
|
||||||
while (ny > 0) {
|
while (ny > 0) {
|
||||||
window_copy_cursor_down(wme, 1);
|
window_copy_cursor_down(wme, 1);
|
||||||
ny--;
|
ny--;
|
||||||
@ -4067,7 +4075,7 @@ window_copy_cursor_end_of_line(struct window_mode_entry *wme)
|
|||||||
else
|
else
|
||||||
window_copy_update_cursor(wme, px, cy);
|
window_copy_update_cursor(wme, px, cy);
|
||||||
if (window_copy_update_selection(wme, 1, 0))
|
if (window_copy_update_selection(wme, 1, 0))
|
||||||
window_copy_redraw_lines(wme, data->cy, 1);
|
window_copy_redraw_lines(wme, oldy, nd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -4433,41 +4441,39 @@ window_copy_cursor_next_word(struct window_mode_entry *wme,
|
|||||||
{
|
{
|
||||||
struct window_copy_mode_data *data = wme->data;
|
struct window_copy_mode_data *data = wme->data;
|
||||||
struct screen *back_s = data->backing;
|
struct screen *back_s = data->backing;
|
||||||
u_int px, py, xx, yy;
|
struct grid_reader gr;
|
||||||
int expected = 0;
|
u_int px, py, cy, oldy, yy, ny, nd, hsize;
|
||||||
|
|
||||||
px = data->cx;
|
px = data->cx;
|
||||||
py = screen_hsize(back_s) + data->cy - data->oy;
|
hsize = screen_hsize(back_s);
|
||||||
xx = window_copy_find_length(wme, py);
|
py = hsize + data->cy - data->oy;
|
||||||
yy = screen_hsize(back_s) + screen_size_y(back_s) - 1;
|
oldy = data->cy;
|
||||||
|
|
||||||
/*
|
grid_reader_start(&gr, back_s->grid, px, py);
|
||||||
* First skip past any nonword characters and then any word characters.
|
grid_reader_cursor_next_word(&gr, separators);
|
||||||
*
|
grid_reader_get_cursor(&gr, &px, &py);
|
||||||
* expected is initially set to 0 for the former and then 1 for the
|
|
||||||
* latter.
|
|
||||||
*/
|
|
||||||
do {
|
|
||||||
while (px > xx ||
|
|
||||||
window_copy_in_set(wme, px, py, separators) == expected) {
|
|
||||||
/* Move down if we're past the end of the line. */
|
|
||||||
if (px > xx) {
|
|
||||||
if (py == yy)
|
|
||||||
return;
|
|
||||||
window_copy_cursor_down(wme, 0);
|
|
||||||
px = 0;
|
|
||||||
|
|
||||||
py = screen_hsize(back_s) + data->cy - data->oy;
|
/* Scroll down if we went off the visible screen. */
|
||||||
xx = window_copy_find_length(wme, py);
|
cy = py - hsize + data->oy;
|
||||||
} else
|
yy = screen_size_y(back_s) - 1;
|
||||||
px++;
|
if (cy > yy) {
|
||||||
|
ny = cy - yy;
|
||||||
|
oldy = yy;
|
||||||
|
nd = 1;
|
||||||
|
} else {
|
||||||
|
ny = 0;
|
||||||
|
nd = cy - oldy + 1;
|
||||||
}
|
}
|
||||||
expected = !expected;
|
while (ny > 0) {
|
||||||
} while (expected == 1);
|
window_copy_cursor_down(wme, 1);
|
||||||
|
ny--;
|
||||||
window_copy_update_cursor(wme, px, data->cy);
|
}
|
||||||
|
if (cy > yy)
|
||||||
|
window_copy_update_cursor(wme, px, yy);
|
||||||
|
else
|
||||||
|
window_copy_update_cursor(wme, px, cy);
|
||||||
if (window_copy_update_selection(wme, 1, 0))
|
if (window_copy_update_selection(wme, 1, 0))
|
||||||
window_copy_redraw_lines(wme, data->cy, 1);
|
window_copy_redraw_lines(wme, oldy, nd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -4528,12 +4534,13 @@ window_copy_cursor_next_word_end(struct window_mode_entry *wme,
|
|||||||
struct options *oo = wp->window->options;
|
struct options *oo = wp->window->options;
|
||||||
struct screen *back_s = data->backing;
|
struct screen *back_s = data->backing;
|
||||||
struct grid_reader gr;
|
struct grid_reader gr;
|
||||||
u_int px, py, cy, yy, ny, hsize;
|
u_int px, py, cy, oldy, yy, ny, nd, hsize;
|
||||||
int keys;
|
int keys;
|
||||||
|
|
||||||
px = data->cx;
|
px = data->cx;
|
||||||
hsize = screen_hsize(back_s);
|
hsize = screen_hsize(back_s);
|
||||||
py = hsize + data->cy - data->oy;
|
py = hsize + data->cy - data->oy;
|
||||||
|
oldy = data->cy;
|
||||||
|
|
||||||
grid_reader_start(&gr, back_s->grid, px, py);
|
grid_reader_start(&gr, back_s->grid, px, py);
|
||||||
keys = options_get_number(oo, "mode-keys");
|
keys = options_get_number(oo, "mode-keys");
|
||||||
@ -4547,10 +4554,14 @@ window_copy_cursor_next_word_end(struct window_mode_entry *wme,
|
|||||||
/* Scroll down if we went off the visible screen. */
|
/* Scroll down if we went off the visible screen. */
|
||||||
cy = py - hsize + data->oy;
|
cy = py - hsize + data->oy;
|
||||||
yy = screen_size_y(back_s) - 1;
|
yy = screen_size_y(back_s) - 1;
|
||||||
if (cy > yy)
|
if (cy > yy) {
|
||||||
ny = cy - yy;
|
ny = cy - yy;
|
||||||
else
|
oldy = yy;
|
||||||
|
nd = 1;
|
||||||
|
} else {
|
||||||
ny = 0;
|
ny = 0;
|
||||||
|
nd = cy - oldy + 1;
|
||||||
|
}
|
||||||
while (ny > 0) {
|
while (ny > 0) {
|
||||||
window_copy_cursor_down(wme, 1);
|
window_copy_cursor_down(wme, 1);
|
||||||
ny--;
|
ny--;
|
||||||
@ -4560,7 +4571,7 @@ window_copy_cursor_next_word_end(struct window_mode_entry *wme,
|
|||||||
else
|
else
|
||||||
window_copy_update_cursor(wme, px, cy);
|
window_copy_update_cursor(wme, px, cy);
|
||||||
if (window_copy_update_selection(wme, 1, no_reset))
|
if (window_copy_update_selection(wme, 1, no_reset))
|
||||||
window_copy_redraw_lines(wme, data->cy, 1);
|
window_copy_redraw_lines(wme, oldy, nd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compute the previous place where a word begins. */
|
/* Compute the previous place where a word begins. */
|
||||||
@ -4617,11 +4628,12 @@ window_copy_cursor_previous_word(struct window_mode_entry *wme,
|
|||||||
struct window_copy_mode_data *data = wme->data;
|
struct window_copy_mode_data *data = wme->data;
|
||||||
struct screen *back_s = data->backing;
|
struct screen *back_s = data->backing;
|
||||||
struct grid_reader gr;
|
struct grid_reader gr;
|
||||||
u_int px, py, cy, yy, ny, hsize;
|
u_int px, py, cy, oldy, yy, ny, nd, hsize;
|
||||||
|
|
||||||
px = data->cx;
|
px = data->cx;
|
||||||
hsize = screen_hsize(back_s);
|
hsize = screen_hsize(back_s);
|
||||||
py = hsize + data->cy - data->oy;
|
py = hsize + data->cy - data->oy;
|
||||||
|
oldy = data->cy;
|
||||||
|
|
||||||
grid_reader_start(&gr, back_s->grid, px, py);
|
grid_reader_start(&gr, back_s->grid, px, py);
|
||||||
grid_reader_cursor_previous_word(&gr, separators, already);
|
grid_reader_cursor_previous_word(&gr, separators, already);
|
||||||
@ -4632,9 +4644,11 @@ window_copy_cursor_previous_word(struct window_mode_entry *wme,
|
|||||||
if (py < yy) {
|
if (py < yy) {
|
||||||
ny = yy - py;
|
ny = yy - py;
|
||||||
cy = 0;
|
cy = 0;
|
||||||
|
nd = 1;
|
||||||
} else {
|
} else {
|
||||||
ny = 0;
|
ny = 0;
|
||||||
cy = py - yy;
|
cy = py - yy;
|
||||||
|
nd = oldy - cy + 1;
|
||||||
}
|
}
|
||||||
while (ny > 0) {
|
while (ny > 0) {
|
||||||
window_copy_cursor_up(wme, 1);
|
window_copy_cursor_up(wme, 1);
|
||||||
@ -4642,7 +4656,7 @@ window_copy_cursor_previous_word(struct window_mode_entry *wme,
|
|||||||
}
|
}
|
||||||
window_copy_update_cursor(wme, px, cy);
|
window_copy_update_cursor(wme, px, cy);
|
||||||
if (window_copy_update_selection(wme, 1, 0))
|
if (window_copy_update_selection(wme, 1, 0))
|
||||||
window_copy_redraw_lines(wme, data->cy, 1);
|
window_copy_redraw_lines(wme, data->cy, nd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Reference in New Issue
Block a user