mirror of
https://github.com/tmate-io/tmate.git
synced 2024-12-23 07:09:10 +01:00
Merge remote-tracking branch 'tmux/master'
This commit is contained in:
commit
b88f66192f
@ -58,7 +58,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
|
||||
|
1
TODO
1
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
|
||||
|
15
configure.ac
15
configure.ac
@ -180,10 +180,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
|
||||
|
||||
PKG_CHECK_MODULES(
|
||||
|
@ -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),
|
||||
};
|
||||
|
@ -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 }
|
||||
};
|
||||
|
@ -384,33 +384,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;
|
||||
|
8
tmux.1
8
tmux.1
@ -3298,10 +3298,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
|
||||
|
3
tmux.h
3
tmux.h
@ -139,6 +139,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),
|
||||
|
||||
|
@ -27,6 +27,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 *);
|
||||
@ -281,15 +282,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);
|
||||
}
|
||||
@ -436,21 +502,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;
|
||||
|
Loading…
Reference in New Issue
Block a user