Merge remote-tracking branch 'tmux/master'

This commit is contained in:
Nicolas Viennot 2016-03-27 02:15:29 -04:00
commit b88f66192f
9 changed files with 105 additions and 38 deletions

View File

@ -58,7 +58,7 @@ if IS_SUNCC
CFLAGS += -erroff=E_EMPTY_DECLARATION CFLAGS += -erroff=E_EMPTY_DECLARATION
endif endif
# Set _LINUX_SOURCE_COMPAT for AIX for mallocing 0 bytes # Set _LINUX_SOURCE_COMPAT for AIX for malloc(0).
if IS_AIX if IS_AIX
DEFS += -D_LINUX_SOURCE_COMPAT=1 DEFS += -D_LINUX_SOURCE_COMPAT=1
endif endif

1
TODO
View File

@ -75,6 +75,7 @@
* searching in copy mode should unwrap lines, so if you seach for "foobar" * 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 then it should be found even if it is now "foo\nbar" (if the WRAP flag
is set on the line) is set on the line)
* {} to go to next/previous blank line in copy mode
- layout stuff - layout stuff
* way to tag a layout as a number/name * way to tag a layout as a number/name

View File

@ -180,10 +180,17 @@ if test "x$found_curses" = xno; then
fi fi
# Look for utempter. # Look for utempter.
AC_CHECK_HEADER(utempter.h, have_utempter=yes, have_utempter=no) AC_CHECK_HEADER(utempter.h, found_utempter=yes, found_utempter=no)
if test "x$have_utempter" = xyes; then if test "x$found_utempter" = xyes; then
AC_DEFINE(HAVE_UTEMPTER) AC_SEARCH_LIBS(
LIBS="$LIBS -lutempter" utempter_add_record,
utempter,
found_utempter=yes,
found_utempter=no
)
if test "x$found_utempter" = xyes; then
AC_DEFINE(HAVE_UTEMPTER)
fi
fi fi
PKG_CHECK_MODULES( PKG_CHECK_MODULES(

View File

@ -93,6 +93,9 @@ const struct {
KEYC_MOUSE_STRING(MOUSEDRAG1, MouseDrag1), KEYC_MOUSE_STRING(MOUSEDRAG1, MouseDrag1),
KEYC_MOUSE_STRING(MOUSEDRAG2, MouseDrag2), KEYC_MOUSE_STRING(MOUSEDRAG2, MouseDrag2),
KEYC_MOUSE_STRING(MOUSEDRAG3, MouseDrag3), 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(WHEELUP, WheelUp),
KEYC_MOUSE_STRING(WHEELDOWN, WheelDown), KEYC_MOUSE_STRING(WHEELDOWN, WheelDown),
}; };

View File

@ -347,7 +347,7 @@ const struct mode_key_entry mode_key_vi_copy[] = {
{ KEYC_WHEELUP_PANE, 0, MODEKEYCOPY_SCROLLUP }, { KEYC_WHEELUP_PANE, 0, MODEKEYCOPY_SCROLLUP },
{ KEYC_WHEELDOWN_PANE, 0, MODEKEYCOPY_SCROLLDOWN }, { KEYC_WHEELDOWN_PANE, 0, MODEKEYCOPY_SCROLLDOWN },
{ KEYC_MOUSEDRAG1_PANE, 0, MODEKEYCOPY_STARTSELECTION }, { KEYC_MOUSEDRAG1_PANE, 0, MODEKEYCOPY_STARTSELECTION },
{ KEYC_MOUSEUP1_PANE, 0, MODEKEYCOPY_COPYSELECTION }, { KEYC_MOUSEDRAGEND1_PANE, 0, MODEKEYCOPY_COPYSELECTION },
{ 0, -1, 0 } { 0, -1, 0 }
}; };
@ -496,7 +496,7 @@ const struct mode_key_entry mode_key_emacs_copy[] = {
{ KEYC_WHEELUP_PANE, 0, MODEKEYCOPY_SCROLLUP }, { KEYC_WHEELUP_PANE, 0, MODEKEYCOPY_SCROLLUP },
{ KEYC_WHEELDOWN_PANE, 0, MODEKEYCOPY_SCROLLDOWN }, { KEYC_WHEELDOWN_PANE, 0, MODEKEYCOPY_SCROLLDOWN },
{ KEYC_MOUSEDRAG1_PANE, 0, MODEKEYCOPY_STARTSELECTION }, { KEYC_MOUSEDRAG1_PANE, 0, MODEKEYCOPY_STARTSELECTION },
{ KEYC_MOUSEUP1_PANE, 0, MODEKEYCOPY_COPYSELECTION }, { KEYC_MOUSEDRAGEND1_PANE, 0, MODEKEYCOPY_COPYSELECTION },
{ 0, -1, 0 } { 0, -1, 0 }
}; };

View File

@ -384,33 +384,33 @@ server_client_check_mouse(struct client *c)
c->tty.mouse_drag_release = NULL; c->tty.mouse_drag_release = NULL;
/* /*
* End a mouse drag by passing a MouseUp key corresponding to * End a mouse drag by passing a MouseDragEnd key corresponding
* the button that started the drag. * to the button that started the drag.
*/ */
switch (c->tty.mouse_drag_flag) { switch (c->tty.mouse_drag_flag) {
case 1: case 1:
if (where == PANE) if (where == PANE)
key = KEYC_MOUSEUP1_PANE; key = KEYC_MOUSEDRAGEND1_PANE;
if (where == STATUS) if (where == STATUS)
key = KEYC_MOUSEUP1_STATUS; key = KEYC_MOUSEDRAGEND1_STATUS;
if (where == BORDER) if (where == BORDER)
key = KEYC_MOUSEUP1_BORDER; key = KEYC_MOUSEDRAGEND1_BORDER;
break; break;
case 2: case 2:
if (where == PANE) if (where == PANE)
key = KEYC_MOUSEUP2_PANE; key = KEYC_MOUSEDRAGEND2_PANE;
if (where == STATUS) if (where == STATUS)
key = KEYC_MOUSEUP2_STATUS; key = KEYC_MOUSEDRAGEND2_STATUS;
if (where == BORDER) if (where == BORDER)
key = KEYC_MOUSEUP2_BORDER; key = KEYC_MOUSEDRAGEND2_BORDER;
break; break;
case 3: case 3:
if (where == PANE) if (where == PANE)
key = KEYC_MOUSEUP3_PANE; key = KEYC_MOUSEDRAGEND3_PANE;
if (where == STATUS) if (where == STATUS)
key = KEYC_MOUSEUP3_STATUS; key = KEYC_MOUSEDRAGEND3_STATUS;
if (where == BORDER) if (where == BORDER)
key = KEYC_MOUSEUP3_BORDER; key = KEYC_MOUSEDRAGEND3_BORDER;
break; break;
default: default:
key = KEYC_MOUSE; key = KEYC_MOUSE;

8
tmux.1
View File

@ -3298,10 +3298,10 @@ for a pane border or
for the status line). for the status line).
The following mouse events are available: The following mouse events are available:
.Bl -column "MouseDown1" "MouseDrag1" "WheelDown" -offset indent .Bl -column "MouseDown1" "MouseDrag1" "WheelDown" -offset indent
.It Li "MouseDown1" Ta "MouseUp1" Ta "MouseDrag1" .It Li "MouseDown1" Ta "MouseUp1" Ta "MouseDrag1" Ta "MouseDragEnd1"
.It Li "MouseDown2" Ta "MouseUp2" Ta "MouseDrag2" .It Li "MouseDown2" Ta "MouseUp2" Ta "MouseDrag2" Ta "MouseDragEnd2"
.It Li "MouseDown3" Ta "MouseUp3" Ta "MouseDrag3" .It Li "MouseDown3" Ta "MouseUp3" Ta "MouseDrag3" Ta "MouseDragEnd3"
.It Li "WheelUp" Ta "WheelDown" Ta "" .It Li "WheelUp" Ta "WheelDown" Ta "" Ta ""
.El .El
.Pp .Pp
Each should be suffixed with a location, for example Each should be suffixed with a location, for example

3
tmux.h
View File

@ -139,6 +139,9 @@ enum {
KEYC_MOUSE_KEY(MOUSEDRAG1), KEYC_MOUSE_KEY(MOUSEDRAG1),
KEYC_MOUSE_KEY(MOUSEDRAG2), KEYC_MOUSE_KEY(MOUSEDRAG2),
KEYC_MOUSE_KEY(MOUSEDRAG3), KEYC_MOUSE_KEY(MOUSEDRAG3),
KEYC_MOUSE_KEY(MOUSEDRAGEND1),
KEYC_MOUSE_KEY(MOUSEDRAGEND2),
KEYC_MOUSE_KEY(MOUSEDRAGEND3),
KEYC_MOUSE_KEY(WHEELUP), KEYC_MOUSE_KEY(WHEELUP),
KEYC_MOUSE_KEY(WHEELDOWN), KEYC_MOUSE_KEY(WHEELDOWN),

View File

@ -27,6 +27,7 @@
struct screen *window_copy_init(struct window_pane *); struct screen *window_copy_init(struct window_pane *);
void window_copy_free(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_resize(struct window_pane *, u_int, u_int);
void window_copy_key(struct window_pane *, struct client *, struct session *, void window_copy_key(struct window_pane *, struct client *, struct session *,
key_code, struct mouse_event *); key_code, struct mouse_event *);
@ -281,15 +282,80 @@ window_copy_pageup(struct window_pane *wp)
{ {
struct window_copy_mode_data *data = wp->modedata; struct window_copy_mode_data *data = wp->modedata;
struct screen *s = &data->screen; 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; n = 1;
if (screen_size_y(s) > 2) if (screen_size_y(s) > 2)
n = screen_size_y(s) - 2; n = screen_size_y(s) - 2;
if (data->oy + n > screen_hsize(data->backing)) if (data->oy + n > screen_hsize(data->backing))
data->oy = screen_hsize(data->backing); data->oy = screen_hsize(data->backing);
else else
data->oy += n; 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_update_selection(wp, 1);
window_copy_redraw_screen(wp); window_copy_redraw_screen(wp);
} }
@ -436,21 +502,8 @@ __window_copy_key(struct window_pane *wp, struct client *c, struct session *sess
window_copy_pageup(wp); window_copy_pageup(wp);
break; break;
case MODEKEYCOPY_NEXTPAGE: case MODEKEYCOPY_NEXTPAGE:
n = 1; for (; np != 0; np--)
if (screen_size_y(s) > 2) window_copy_pagedown(wp);
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);
break; break;
case MODEKEYCOPY_HALFPAGEUP: case MODEKEYCOPY_HALFPAGEUP:
n = screen_size_y(s) / 2; n = screen_size_y(s) / 2;