mirror of
https://github.com/tmate-io/tmate.git
synced 2025-06-20 01:27:45 +02: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
|
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
1
TODO
@ -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
|
||||||
|
13
configure.ac
13
configure.ac
@ -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_SEARCH_LIBS(
|
||||||
|
utempter_add_record,
|
||||||
|
utempter,
|
||||||
|
found_utempter=yes,
|
||||||
|
found_utempter=no
|
||||||
|
)
|
||||||
|
if test "x$found_utempter" = xyes; then
|
||||||
AC_DEFINE(HAVE_UTEMPTER)
|
AC_DEFINE(HAVE_UTEMPTER)
|
||||||
LIBS="$LIBS -lutempter"
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PKG_CHECK_MODULES(
|
PKG_CHECK_MODULES(
|
||||||
|
@ -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),
|
||||||
};
|
};
|
||||||
|
@ -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 }
|
||||||
};
|
};
|
||||||
|
@ -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
8
tmux.1
@ -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
3
tmux.h
@ -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),
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user