Michal Mazurek
2016-01-26 15:32:39 UTC
If the cursor is in position 0, 0 in copy mode, and the left arrow is
pressed, the cursor position is wrapped to the end of line. A similar
situation occurs at the last position and the right arrow. The following
patch prevents that, and makes the behaviour more consistent with other
software, such as nvi:
Index: window-copy.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/window-copy.c,v
retrieving revision 1.144
diff -u -p -r1.144 window-copy.c
--- window-copy.c 19 Jan 2016 15:59:12 -0000 1.144
+++ window-copy.c 26 Jan 2016 11:43:38 -0000
@@ -1776,10 +1776,10 @@ window_copy_cursor_left(struct window_pa
{
struct window_copy_mode_data *data = wp->modedata;
- if (data->cx == 0) {
+ if (data->cx == 0 && data->cy > 0) {
window_copy_cursor_up(wp, 0);
window_copy_cursor_end_of_line(wp);
- } else {
+ } else if (data->cx > 0) {
window_copy_update_cursor(wp, data->cx - 1, data->cy);
if (window_copy_update_selection(wp, 1))
window_copy_redraw_lines(wp, data->cy, 1);
@@ -1799,10 +1799,10 @@ window_copy_cursor_right(struct window_p
px = window_copy_find_length(wp, py);
}
- if (data->cx >= px) {
+ if (data->cx >= px && data->cy < screen_size_y(&data->screen) - 1) {
window_copy_cursor_start_of_line(wp);
window_copy_cursor_down(wp, 0);
- } else {
+ } else if (data->cx < px) {
window_copy_update_cursor(wp, data->cx + 1, data->cy);
if (window_copy_update_selection(wp, 1))
window_copy_redraw_lines(wp, data->cy, 1);
Also remove two unused variables (no binary change):
Index: cmd-swap-pane.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/cmd-swap-pane.c,v
retrieving revision 1.25
diff -u -p -r1.25 cmd-swap-pane.c
--- cmd-swap-pane.c 19 Jan 2016 15:59:12 -0000 1.25
+++ cmd-swap-pane.c 26 Jan 2016 15:26:14 -0000
@@ -45,28 +45,23 @@ const struct cmd_entry cmd_swap_pane_ent
enum cmd_retval
cmd_swap_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
- struct winlink *src_wl, *dst_wl;
struct window *src_w, *dst_w;
struct window_pane *tmp_wp, *src_wp, *dst_wp;
struct layout_cell *src_lc, *dst_lc;
u_int sx, sy, xoff, yoff;
- dst_wl = cmdq->state.tflag.wl;
- dst_w = dst_wl->window;
+ dst_w = cmdq->state.tflag.wl->window;
dst_wp = cmdq->state.tflag.wp;
- src_wl = cmdq->state.sflag.wl;
- src_w = src_wl->window;
+ src_w = cmdq->state.sflag.wl->window;
src_wp = cmdq->state.sflag.wp;
server_unzoom_window(dst_w);
if (args_has(self->args, 'D')) {
- src_wl = dst_wl;
src_w = dst_w;
src_wp = TAILQ_NEXT(dst_wp, entry);
if (src_wp == NULL)
src_wp = TAILQ_FIRST(&dst_w->panes);
} else if (args_has(self->args, 'U')) {
- src_wl = dst_wl;
src_w = dst_w;
src_wp = TAILQ_PREV(dst_wp, window_panes, entry);
if (src_wp == NULL)
pressed, the cursor position is wrapped to the end of line. A similar
situation occurs at the last position and the right arrow. The following
patch prevents that, and makes the behaviour more consistent with other
software, such as nvi:
Index: window-copy.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/window-copy.c,v
retrieving revision 1.144
diff -u -p -r1.144 window-copy.c
--- window-copy.c 19 Jan 2016 15:59:12 -0000 1.144
+++ window-copy.c 26 Jan 2016 11:43:38 -0000
@@ -1776,10 +1776,10 @@ window_copy_cursor_left(struct window_pa
{
struct window_copy_mode_data *data = wp->modedata;
- if (data->cx == 0) {
+ if (data->cx == 0 && data->cy > 0) {
window_copy_cursor_up(wp, 0);
window_copy_cursor_end_of_line(wp);
- } else {
+ } else if (data->cx > 0) {
window_copy_update_cursor(wp, data->cx - 1, data->cy);
if (window_copy_update_selection(wp, 1))
window_copy_redraw_lines(wp, data->cy, 1);
@@ -1799,10 +1799,10 @@ window_copy_cursor_right(struct window_p
px = window_copy_find_length(wp, py);
}
- if (data->cx >= px) {
+ if (data->cx >= px && data->cy < screen_size_y(&data->screen) - 1) {
window_copy_cursor_start_of_line(wp);
window_copy_cursor_down(wp, 0);
- } else {
+ } else if (data->cx < px) {
window_copy_update_cursor(wp, data->cx + 1, data->cy);
if (window_copy_update_selection(wp, 1))
window_copy_redraw_lines(wp, data->cy, 1);
Also remove two unused variables (no binary change):
Index: cmd-swap-pane.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/cmd-swap-pane.c,v
retrieving revision 1.25
diff -u -p -r1.25 cmd-swap-pane.c
--- cmd-swap-pane.c 19 Jan 2016 15:59:12 -0000 1.25
+++ cmd-swap-pane.c 26 Jan 2016 15:26:14 -0000
@@ -45,28 +45,23 @@ const struct cmd_entry cmd_swap_pane_ent
enum cmd_retval
cmd_swap_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
- struct winlink *src_wl, *dst_wl;
struct window *src_w, *dst_w;
struct window_pane *tmp_wp, *src_wp, *dst_wp;
struct layout_cell *src_lc, *dst_lc;
u_int sx, sy, xoff, yoff;
- dst_wl = cmdq->state.tflag.wl;
- dst_w = dst_wl->window;
+ dst_w = cmdq->state.tflag.wl->window;
dst_wp = cmdq->state.tflag.wp;
- src_wl = cmdq->state.sflag.wl;
- src_w = src_wl->window;
+ src_w = cmdq->state.sflag.wl->window;
src_wp = cmdq->state.sflag.wp;
server_unzoom_window(dst_w);
if (args_has(self->args, 'D')) {
- src_wl = dst_wl;
src_w = dst_w;
src_wp = TAILQ_NEXT(dst_wp, entry);
if (src_wp == NULL)
src_wp = TAILQ_FIRST(&dst_w->panes);
} else if (args_has(self->args, 'U')) {
- src_wl = dst_wl;
src_w = dst_w;
src_wp = TAILQ_PREV(dst_wp, window_panes, entry);
if (src_wp == NULL)
--
Michal Mazurek
Michal Mazurek