From 3dfc79fb092273b65fd8a24174007d13804d3641 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Thu, 17 Mar 2016 15:11:40 +0000 Subject: [PATCH 1/5] Tweak a comment. --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 8678a38e..718cfc77 100644 --- a/Makefile.am +++ b/Makefile.am @@ -54,7 +54,7 @@ if IS_SUNCC CFLAGS += -erroff=E_EMPTY_DECLARATION endif -# Set _LINUX_SOURCE_COMPAT for AIX for mallocing 0 bytes +# Set _LINUX_SOURCE_COMPAT for AIX for malloc(0). if IS_AIX DEFS += -D_LINUX_SOURCE_COMPAT=1 endif From fa97b0a95b804fec86b03d35d16c270d2866ebd6 Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 18 Mar 2016 07:28:27 +0000 Subject: [PATCH 2/5] Instead of reusing MouseUp at the finish of a drag, add a new key MouseDragEnd. It can be useful to bind them separately in copy mode. --- key-string.c | 3 +++ mode-key.c | 4 ++-- server-client.c | 22 +++++++++++----------- tmux.1 | 8 ++++---- tmux.h | 3 +++ 5 files changed, 23 insertions(+), 17 deletions(-) diff --git a/key-string.c b/key-string.c index c56681f1..119035a0 100644 --- a/key-string.c +++ b/key-string.c @@ -93,6 +93,9 @@ const struct { KEYC_MOUSE_STRING(MOUSEDRAG1, MouseDrag1), KEYC_MOUSE_STRING(MOUSEDRAG2, MouseDrag2), KEYC_MOUSE_STRING(MOUSEDRAG3, MouseDrag3), + KEYC_MOUSE_STRING(MOUSEDRAGEND1, MouseDragEnd1), + KEYC_MOUSE_STRING(MOUSEDRAGEND2, MouseDragEnd2), + KEYC_MOUSE_STRING(MOUSEDRAGEND3, MouseDragEnd3), KEYC_MOUSE_STRING(WHEELUP, WheelUp), KEYC_MOUSE_STRING(WHEELDOWN, WheelDown), }; diff --git a/mode-key.c b/mode-key.c index a9b15bb9..aed161bb 100644 --- a/mode-key.c +++ b/mode-key.c @@ -347,7 +347,7 @@ const struct mode_key_entry mode_key_vi_copy[] = { { KEYC_WHEELUP_PANE, 0, MODEKEYCOPY_SCROLLUP }, { KEYC_WHEELDOWN_PANE, 0, MODEKEYCOPY_SCROLLDOWN }, { KEYC_MOUSEDRAG1_PANE, 0, MODEKEYCOPY_STARTSELECTION }, - { KEYC_MOUSEUP1_PANE, 0, MODEKEYCOPY_COPYSELECTION }, + { KEYC_MOUSEDRAGEND1_PANE, 0, MODEKEYCOPY_COPYSELECTION }, { 0, -1, 0 } }; @@ -496,7 +496,7 @@ const struct mode_key_entry mode_key_emacs_copy[] = { { KEYC_WHEELUP_PANE, 0, MODEKEYCOPY_SCROLLUP }, { KEYC_WHEELDOWN_PANE, 0, MODEKEYCOPY_SCROLLDOWN }, { KEYC_MOUSEDRAG1_PANE, 0, MODEKEYCOPY_STARTSELECTION }, - { KEYC_MOUSEUP1_PANE, 0, MODEKEYCOPY_COPYSELECTION }, + { KEYC_MOUSEDRAGEND1_PANE, 0, MODEKEYCOPY_COPYSELECTION }, { 0, -1, 0 } }; diff --git a/server-client.c b/server-client.c index 9111eb82..6166eac4 100644 --- a/server-client.c +++ b/server-client.c @@ -385,33 +385,33 @@ server_client_check_mouse(struct client *c) c->tty.mouse_drag_release = NULL; /* - * End a mouse drag by passing a MouseUp key corresponding to - * the button that started the drag. + * End a mouse drag by passing a MouseDragEnd key corresponding + * to the button that started the drag. */ switch (c->tty.mouse_drag_flag) { case 1: if (where == PANE) - key = KEYC_MOUSEUP1_PANE; + key = KEYC_MOUSEDRAGEND1_PANE; if (where == STATUS) - key = KEYC_MOUSEUP1_STATUS; + key = KEYC_MOUSEDRAGEND1_STATUS; if (where == BORDER) - key = KEYC_MOUSEUP1_BORDER; + key = KEYC_MOUSEDRAGEND1_BORDER; break; case 2: if (where == PANE) - key = KEYC_MOUSEUP2_PANE; + key = KEYC_MOUSEDRAGEND2_PANE; if (where == STATUS) - key = KEYC_MOUSEUP2_STATUS; + key = KEYC_MOUSEDRAGEND2_STATUS; if (where == BORDER) - key = KEYC_MOUSEUP2_BORDER; + key = KEYC_MOUSEDRAGEND2_BORDER; break; case 3: if (where == PANE) - key = KEYC_MOUSEUP3_PANE; + key = KEYC_MOUSEDRAGEND3_PANE; if (where == STATUS) - key = KEYC_MOUSEUP3_STATUS; + key = KEYC_MOUSEDRAGEND3_STATUS; if (where == BORDER) - key = KEYC_MOUSEUP3_BORDER; + key = KEYC_MOUSEDRAGEND3_BORDER; break; default: key = KEYC_MOUSE; diff --git a/tmux.1 b/tmux.1 index 448673f1..a304e76b 100644 --- a/tmux.1 +++ b/tmux.1 @@ -3294,10 +3294,10 @@ for a pane border or for the status line). The following mouse events are available: .Bl -column "MouseDown1" "MouseDrag1" "WheelDown" -offset indent -.It Li "MouseDown1" Ta "MouseUp1" Ta "MouseDrag1" -.It Li "MouseDown2" Ta "MouseUp2" Ta "MouseDrag2" -.It Li "MouseDown3" Ta "MouseUp3" Ta "MouseDrag3" -.It Li "WheelUp" Ta "WheelDown" Ta "" +.It Li "MouseDown1" Ta "MouseUp1" Ta "MouseDrag1" Ta "MouseDragEnd1" +.It Li "MouseDown2" Ta "MouseUp2" Ta "MouseDrag2" Ta "MouseDragEnd2" +.It Li "MouseDown3" Ta "MouseUp3" Ta "MouseDrag3" Ta "MouseDragEnd3" +.It Li "WheelUp" Ta "WheelDown" Ta "" Ta "" .El .Pp Each should be suffixed with a location, for example diff --git a/tmux.h b/tmux.h index ac94d780..b2445fce 100644 --- a/tmux.h +++ b/tmux.h @@ -135,6 +135,9 @@ enum { KEYC_MOUSE_KEY(MOUSEDRAG1), KEYC_MOUSE_KEY(MOUSEDRAG2), KEYC_MOUSE_KEY(MOUSEDRAG3), + KEYC_MOUSE_KEY(MOUSEDRAGEND1), + KEYC_MOUSE_KEY(MOUSEDRAGEND2), + KEYC_MOUSE_KEY(MOUSEDRAGEND3), KEYC_MOUSE_KEY(WHEELUP), KEYC_MOUSE_KEY(WHEELDOWN), From 312a7a1e629431a71930fc6523f0feb6c595afda Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 18 Mar 2016 14:27:24 +0000 Subject: [PATCH 3/5] Make scrolling behaviour more sensible and maintain cursor position, as if the same had been done line-by-line. From Michal Mazurek. --- window-copy.c | 85 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 69 insertions(+), 16 deletions(-) diff --git a/window-copy.c b/window-copy.c index d345f246..5c907c3d 100644 --- a/window-copy.c +++ b/window-copy.c @@ -26,6 +26,7 @@ struct screen *window_copy_init(struct window_pane *); void window_copy_free(struct window_pane *); +void window_copy_pagedown(struct window_pane *); void window_copy_resize(struct window_pane *, u_int, u_int); void window_copy_key(struct window_pane *, struct client *, struct session *, key_code, struct mouse_event *); @@ -324,15 +325,80 @@ window_copy_pageup(struct window_pane *wp) { struct window_copy_mode_data *data = wp->modedata; struct screen *s = &data->screen; - u_int n; + u_int n, ox, oy; + + oy = screen_hsize(data->backing) + data->cy - data->oy; + ox = window_copy_find_length(wp, oy); + + if (s->sel.lineflag == LINE_SEL_LEFT_RIGHT && oy == data->sely) + window_copy_other_end(wp); + + if (data->cx != ox) { + data->lastcx = data->cx; + data->lastsx = ox; + } + data->cx = data->lastcx; n = 1; if (screen_size_y(s) > 2) n = screen_size_y(s) - 2; + if (data->oy + n > screen_hsize(data->backing)) data->oy = screen_hsize(data->backing); else data->oy += n; + + if (!data->screen.sel.flag || !data->rectflag) { + u_int py = screen_hsize(data->backing) + data->cy - data->oy; + u_int px = window_copy_find_length(wp, py); + if ((data->cx >= data->lastsx && data->cx != px) || data->cx > px) + window_copy_cursor_end_of_line(wp); + } + + window_copy_update_selection(wp, 1); + window_copy_redraw_screen(wp); +} + +void +window_copy_pagedown(struct window_pane *wp) +{ + struct window_copy_mode_data *data = wp->modedata; + struct screen *s = &data->screen; + u_int n, ox, oy; + + oy = screen_hsize(data->backing) + data->cy - data->oy; + ox = window_copy_find_length(wp, oy); + + if (s->sel.lineflag == LINE_SEL_RIGHT_LEFT && oy == data->sely) + window_copy_other_end(wp); + + if (data->cx != ox) { + data->lastcx = data->cx; + data->lastsx = ox; + } + data->cx = data->lastcx; + + n = 1; + if (screen_size_y(s) > 2) + n = screen_size_y(s) - 2; + + if (data->oy < n) + data->oy = 0; + else + data->oy -= n; + + if (!data->screen.sel.flag || !data->rectflag) { + u_int py = screen_hsize(data->backing) + data->cy - data->oy; + u_int px = window_copy_find_length(wp, py); + if ((data->cx >= data->lastsx && data->cx != px) || data->cx > px) + window_copy_cursor_end_of_line(wp); + } + + if (data->scroll_exit && data->oy == 0) { + window_pane_reset_mode(wp); + return; + } + window_copy_update_selection(wp, 1); window_copy_redraw_screen(wp); } @@ -479,21 +545,8 @@ window_copy_key(struct window_pane *wp, struct client *c, struct session *sess, window_copy_pageup(wp); break; case MODEKEYCOPY_NEXTPAGE: - n = 1; - if (screen_size_y(s) > 2) - n = screen_size_y(s) - 2; - for (; np != 0; np--) { - if (data->oy < n) - data->oy = 0; - else - data->oy -= n; - } - if (data->scroll_exit && data->oy == 0) { - window_pane_reset_mode(wp); - return; - } - window_copy_update_selection(wp, 1); - window_copy_redraw_screen(wp); + for (; np != 0; np--) + window_copy_pagedown(wp); break; case MODEKEYCOPY_HALFPAGEUP: n = screen_size_y(s) / 2; From b429a00cce4c150cf8050545f903ecb304691ab9 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sun, 20 Mar 2016 08:14:14 +0000 Subject: [PATCH 4/5] Add to TODO. --- TODO | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO b/TODO index 4a284220..e0e3de6d 100644 --- a/TODO +++ b/TODO @@ -75,6 +75,7 @@ * searching in copy mode should unwrap lines, so if you seach for "foobar" then it should be found even if it is now "foo\nbar" (if the WRAP flag is set on the line) + * {} to go to next/previous blank line in copy mode - layout stuff * way to tag a layout as a number/name From 5658b628b9bf1c1e0bd5856736332ce8b9c51517 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sat, 26 Mar 2016 20:17:17 +0000 Subject: [PATCH 5/5] Look for utempter_add_record to be sure we have the new utempter API, the old utempter API was also using utempter.h. --- configure.ac | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index 82e8a452..8ce20632 100644 --- a/configure.ac +++ b/configure.ac @@ -167,10 +167,17 @@ if test "x$found_curses" = xno; then fi # Look for utempter. -AC_CHECK_HEADER(utempter.h, have_utempter=yes, have_utempter=no) -if test "x$have_utempter" = xyes; then - AC_DEFINE(HAVE_UTEMPTER) - LIBS="$LIBS -lutempter" +AC_CHECK_HEADER(utempter.h, found_utempter=yes, found_utempter=no) +if test "x$found_utempter" = xyes; then + AC_SEARCH_LIBS( + utempter_add_record, + utempter, + found_utempter=yes, + found_utempter=no + ) + if test "x$found_utempter" = xyes; then + AC_DEFINE(HAVE_UTEMPTER) + fi fi # Check for b64_ntop.