mirror of
https://github.com/tmux/tmux.git
synced 2025-04-01 13:18:49 +00:00
Merge branch 'obsd-master'
This commit is contained in:
commit
94783addfc
7
client.c
7
client.c
@ -266,8 +266,13 @@ client_main(struct event_base *base, int argc, char **argv, uint64_t flags,
|
|||||||
if (cmd_list_any_have(pr->cmdlist, CMD_STARTSERVER))
|
if (cmd_list_any_have(pr->cmdlist, CMD_STARTSERVER))
|
||||||
flags |= CLIENT_STARTSERVER;
|
flags |= CLIENT_STARTSERVER;
|
||||||
cmd_list_free(pr->cmdlist);
|
cmd_list_free(pr->cmdlist);
|
||||||
} else
|
} else {
|
||||||
|
fprintf(stderr, "%s\n", pr->error);
|
||||||
|
args_free_values(values, argc);
|
||||||
|
free(values);
|
||||||
free(pr->error);
|
free(pr->error);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
args_free_values(values, argc);
|
args_free_values(values, argc);
|
||||||
free(values);
|
free(values);
|
||||||
}
|
}
|
||||||
|
@ -53,9 +53,15 @@ static struct input_key_entry input_key_defaults[] = {
|
|||||||
{ .key = KEYC_PASTE_START,
|
{ .key = KEYC_PASTE_START,
|
||||||
.data = "\033[200~"
|
.data = "\033[200~"
|
||||||
},
|
},
|
||||||
|
{ .key = KEYC_PASTE_START|KEYC_IMPLIED_META,
|
||||||
|
.data = "\033[200~"
|
||||||
|
},
|
||||||
{ .key = KEYC_PASTE_END,
|
{ .key = KEYC_PASTE_END,
|
||||||
.data = "\033[201~"
|
.data = "\033[201~"
|
||||||
},
|
},
|
||||||
|
{ .key = KEYC_PASTE_END|KEYC_IMPLIED_META,
|
||||||
|
.data = "\033[201~"
|
||||||
|
},
|
||||||
|
|
||||||
/* Function keys. */
|
/* Function keys. */
|
||||||
{ .key = KEYC_F1,
|
{ .key = KEYC_F1,
|
||||||
|
@ -433,11 +433,15 @@ screen_redraw_make_pane_status(struct client *c, struct window_pane *wp,
|
|||||||
const char *fmt;
|
const char *fmt;
|
||||||
struct format_tree *ft;
|
struct format_tree *ft;
|
||||||
char *expanded;
|
char *expanded;
|
||||||
int pane_status = rctx->pane_status;
|
int pane_status = rctx->pane_status, sb_w = 0;
|
||||||
|
int pane_scrollbars = rctx->pane_scrollbars;
|
||||||
u_int width, i, cell_type, px, py;
|
u_int width, i, cell_type, px, py;
|
||||||
struct screen_write_ctx ctx;
|
struct screen_write_ctx ctx;
|
||||||
struct screen old;
|
struct screen old;
|
||||||
|
|
||||||
|
if (window_pane_show_scrollbar(wp, pane_scrollbars))
|
||||||
|
sb_w = wp->scrollbar_style.width + wp->scrollbar_style.pad;
|
||||||
|
|
||||||
ft = format_create(c, NULL, FORMAT_PANE|wp->id, FORMAT_STATUS);
|
ft = format_create(c, NULL, FORMAT_PANE|wp->id, FORMAT_STATUS);
|
||||||
format_defaults(ft, c, c->session, c->session->curw, wp);
|
format_defaults(ft, c, c->session, c->session->curw, wp);
|
||||||
|
|
||||||
@ -451,7 +455,7 @@ screen_redraw_make_pane_status(struct client *c, struct window_pane *wp,
|
|||||||
if (wp->sx < 4)
|
if (wp->sx < 4)
|
||||||
wp->status_size = width = 0;
|
wp->status_size = width = 0;
|
||||||
else
|
else
|
||||||
wp->status_size = width = wp->sx - 4;
|
wp->status_size = width = wp->sx + sb_w - 2;
|
||||||
|
|
||||||
memcpy(&old, &wp->status_screen, sizeof old);
|
memcpy(&old, &wp->status_screen, sizeof old);
|
||||||
screen_init(&wp->status_screen, width, 1, 0);
|
screen_init(&wp->status_screen, width, 1, 0);
|
||||||
|
@ -2243,13 +2243,13 @@ out:
|
|||||||
static int
|
static int
|
||||||
server_client_is_bracket_paste(struct client *c, key_code key)
|
server_client_is_bracket_paste(struct client *c, key_code key)
|
||||||
{
|
{
|
||||||
if (key == KEYC_PASTE_START) {
|
if ((key & KEYC_MASK_KEY) == KEYC_PASTE_START) {
|
||||||
c->flags |= CLIENT_BRACKETPASTING;
|
c->flags |= CLIENT_BRACKETPASTING;
|
||||||
log_debug("%s: bracket paste on", c->name);
|
log_debug("%s: bracket paste on", c->name);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key == KEYC_PASTE_END) {
|
if ((key & KEYC_MASK_KEY) == KEYC_PASTE_END) {
|
||||||
c->flags &= ~CLIENT_BRACKETPASTING;
|
c->flags &= ~CLIENT_BRACKETPASTING;
|
||||||
log_debug("%s: bracket paste off", c->name);
|
log_debug("%s: bracket paste off", c->name);
|
||||||
return (0);
|
return (0);
|
||||||
|
6
tmux.1
6
tmux.1
@ -5869,6 +5869,12 @@ with
|
|||||||
.Ql bar/
|
.Ql bar/
|
||||||
throughout.
|
throughout.
|
||||||
.Pp
|
.Pp
|
||||||
|
Multiple modifiers may be separated with a semicolon (;) as in
|
||||||
|
.Ql #{T;=10:status-left} ,
|
||||||
|
which limits the resulting
|
||||||
|
.Xr strftime 3 -expanded
|
||||||
|
string to at most 10 characters.
|
||||||
|
.Pp
|
||||||
In addition, the last line of a shell command's output may be inserted using
|
In addition, the last line of a shell command's output may be inserted using
|
||||||
.Ql #() .
|
.Ql #() .
|
||||||
For example,
|
For example,
|
||||||
|
3
tmux.h
3
tmux.h
@ -176,7 +176,8 @@ struct winlink;
|
|||||||
|
|
||||||
/* Is this a paste key? */
|
/* Is this a paste key? */
|
||||||
#define KEYC_IS_PASTE(key) \
|
#define KEYC_IS_PASTE(key) \
|
||||||
((key) == KEYC_PASTE_START || (key) == KEYC_PASTE_END)
|
(((key) & KEYC_MASK_KEY) == KEYC_PASTE_START || \
|
||||||
|
((key) & KEYC_MASK_KEY) == KEYC_PASTE_END)
|
||||||
|
|
||||||
/* Multiple click timeout. */
|
/* Multiple click timeout. */
|
||||||
#define KEYC_CLICK_TIMEOUT 300
|
#define KEYC_CLICK_TIMEOUT 300
|
||||||
|
@ -208,8 +208,8 @@ static const struct tty_default_key_raw tty_default_raw_keys[] = {
|
|||||||
{ "\033[O", KEYC_FOCUS_OUT },
|
{ "\033[O", KEYC_FOCUS_OUT },
|
||||||
|
|
||||||
/* Paste keys. */
|
/* Paste keys. */
|
||||||
{ "\033[200~", KEYC_PASTE_START },
|
{ "\033[200~", KEYC_PASTE_START|KEYC_IMPLIED_META },
|
||||||
{ "\033[201~", KEYC_PASTE_END },
|
{ "\033[201~", KEYC_PASTE_END|KEYC_IMPLIED_META },
|
||||||
|
|
||||||
/* Extended keys. */
|
/* Extended keys. */
|
||||||
{ "\033[1;5Z", '\011'|KEYC_CTRL|KEYC_SHIFT },
|
{ "\033[1;5Z", '\011'|KEYC_CTRL|KEYC_SHIFT },
|
||||||
|
94
window.c
94
window.c
@ -1359,6 +1359,36 @@ window_pane_choose_best(struct window_pane **list, u_int size)
|
|||||||
return (best);
|
return (best);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get full size and offset of a window pane including the area of the
|
||||||
|
* scrollbars if they were visible but not including the border(s).
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
window_pane_full_size_offset(struct window_pane *wp, u_int *xoff, u_int *yoff,
|
||||||
|
u_int *sx, u_int *sy)
|
||||||
|
{
|
||||||
|
struct window *w = wp->window;
|
||||||
|
int pane_scrollbars;
|
||||||
|
u_int sb_w, sb_pos;
|
||||||
|
|
||||||
|
pane_scrollbars = options_get_number(w->options, "pane-scrollbars");
|
||||||
|
sb_pos = options_get_number(w->options, "pane-scrollbars-position");
|
||||||
|
|
||||||
|
if (window_pane_show_scrollbar(wp, pane_scrollbars))
|
||||||
|
sb_w = wp->scrollbar_style.width + wp->scrollbar_style.pad;
|
||||||
|
else
|
||||||
|
sb_w = 0;
|
||||||
|
if (sb_pos == PANE_SCROLLBARS_LEFT) {
|
||||||
|
*xoff = wp->xoff - sb_w;
|
||||||
|
*sx = wp->sx + sb_w;
|
||||||
|
} else { /* sb_pos == PANE_SCROLLBARS_RIGHT */
|
||||||
|
*xoff = wp->xoff;
|
||||||
|
*sx = wp->sx + sb_w;
|
||||||
|
}
|
||||||
|
*yoff = wp->yoff;
|
||||||
|
*sy = wp->sy;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find the pane directly above another. We build a list of those adjacent to
|
* Find the pane directly above another. We build a list of those adjacent to
|
||||||
* top edge and then choose the best.
|
* top edge and then choose the best.
|
||||||
@ -1370,6 +1400,7 @@ window_pane_find_up(struct window_pane *wp)
|
|||||||
struct window_pane *next, *best, **list;
|
struct window_pane *next, *best, **list;
|
||||||
u_int edge, left, right, end, size;
|
u_int edge, left, right, end, size;
|
||||||
int status, found;
|
int status, found;
|
||||||
|
u_int xoff, yoff, sx, sy;
|
||||||
|
|
||||||
if (wp == NULL)
|
if (wp == NULL)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
@ -1379,7 +1410,9 @@ window_pane_find_up(struct window_pane *wp)
|
|||||||
list = NULL;
|
list = NULL;
|
||||||
size = 0;
|
size = 0;
|
||||||
|
|
||||||
edge = wp->yoff;
|
window_pane_full_size_offset(wp, &xoff, &yoff, &sx, &sy);
|
||||||
|
|
||||||
|
edge = yoff;
|
||||||
if (status == PANE_STATUS_TOP) {
|
if (status == PANE_STATUS_TOP) {
|
||||||
if (edge == 1)
|
if (edge == 1)
|
||||||
edge = w->sy + 1;
|
edge = w->sy + 1;
|
||||||
@ -1391,20 +1424,21 @@ window_pane_find_up(struct window_pane *wp)
|
|||||||
edge = w->sy + 1;
|
edge = w->sy + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
left = wp->xoff;
|
left = xoff;
|
||||||
right = wp->xoff + wp->sx;
|
right = xoff + sx;
|
||||||
|
|
||||||
TAILQ_FOREACH(next, &w->panes, entry) {
|
TAILQ_FOREACH(next, &w->panes, entry) {
|
||||||
|
window_pane_full_size_offset(next, &xoff, &yoff, &sx, &sy);
|
||||||
if (next == wp)
|
if (next == wp)
|
||||||
continue;
|
continue;
|
||||||
if (next->yoff + next->sy + 1 != edge)
|
if (yoff + sy + 1 != edge)
|
||||||
continue;
|
continue;
|
||||||
end = next->xoff + next->sx - 1;
|
end = xoff + sx - 1;
|
||||||
|
|
||||||
found = 0;
|
found = 0;
|
||||||
if (next->xoff < left && end > right)
|
if (xoff < left && end > right)
|
||||||
found = 1;
|
found = 1;
|
||||||
else if (next->xoff >= left && next->xoff <= right)
|
else if (xoff >= left && xoff <= right)
|
||||||
found = 1;
|
found = 1;
|
||||||
else if (end >= left && end <= right)
|
else if (end >= left && end <= right)
|
||||||
found = 1;
|
found = 1;
|
||||||
@ -1427,6 +1461,7 @@ window_pane_find_down(struct window_pane *wp)
|
|||||||
struct window_pane *next, *best, **list;
|
struct window_pane *next, *best, **list;
|
||||||
u_int edge, left, right, end, size;
|
u_int edge, left, right, end, size;
|
||||||
int status, found;
|
int status, found;
|
||||||
|
u_int xoff, yoff, sx, sy;
|
||||||
|
|
||||||
if (wp == NULL)
|
if (wp == NULL)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
@ -1436,7 +1471,9 @@ window_pane_find_down(struct window_pane *wp)
|
|||||||
list = NULL;
|
list = NULL;
|
||||||
size = 0;
|
size = 0;
|
||||||
|
|
||||||
edge = wp->yoff + wp->sy + 1;
|
window_pane_full_size_offset(wp, &xoff, &yoff, &sx, &sy);
|
||||||
|
|
||||||
|
edge = yoff + sy + 1;
|
||||||
if (status == PANE_STATUS_TOP) {
|
if (status == PANE_STATUS_TOP) {
|
||||||
if (edge >= w->sy)
|
if (edge >= w->sy)
|
||||||
edge = 1;
|
edge = 1;
|
||||||
@ -1452,16 +1489,17 @@ window_pane_find_down(struct window_pane *wp)
|
|||||||
right = wp->xoff + wp->sx;
|
right = wp->xoff + wp->sx;
|
||||||
|
|
||||||
TAILQ_FOREACH(next, &w->panes, entry) {
|
TAILQ_FOREACH(next, &w->panes, entry) {
|
||||||
|
window_pane_full_size_offset(next, &xoff, &yoff, &sx, &sy);
|
||||||
if (next == wp)
|
if (next == wp)
|
||||||
continue;
|
continue;
|
||||||
if (next->yoff != edge)
|
if (yoff != edge)
|
||||||
continue;
|
continue;
|
||||||
end = next->xoff + next->sx - 1;
|
end = xoff + sx - 1;
|
||||||
|
|
||||||
found = 0;
|
found = 0;
|
||||||
if (next->xoff < left && end > right)
|
if (xoff < left && end > right)
|
||||||
found = 1;
|
found = 1;
|
||||||
else if (next->xoff >= left && next->xoff <= right)
|
else if (xoff >= left && xoff <= right)
|
||||||
found = 1;
|
found = 1;
|
||||||
else if (end >= left && end <= right)
|
else if (end >= left && end <= right)
|
||||||
found = 1;
|
found = 1;
|
||||||
@ -1484,6 +1522,7 @@ window_pane_find_left(struct window_pane *wp)
|
|||||||
struct window_pane *next, *best, **list;
|
struct window_pane *next, *best, **list;
|
||||||
u_int edge, top, bottom, end, size;
|
u_int edge, top, bottom, end, size;
|
||||||
int found;
|
int found;
|
||||||
|
u_int xoff, yoff, sx, sy;
|
||||||
|
|
||||||
if (wp == NULL)
|
if (wp == NULL)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
@ -1492,24 +1531,27 @@ window_pane_find_left(struct window_pane *wp)
|
|||||||
list = NULL;
|
list = NULL;
|
||||||
size = 0;
|
size = 0;
|
||||||
|
|
||||||
edge = wp->xoff;
|
window_pane_full_size_offset(wp, &xoff, &yoff, &sx, &sy);
|
||||||
|
|
||||||
|
edge = xoff;
|
||||||
if (edge == 0)
|
if (edge == 0)
|
||||||
edge = w->sx + 1;
|
edge = w->sx + 1;
|
||||||
|
|
||||||
top = wp->yoff;
|
top = yoff;
|
||||||
bottom = wp->yoff + wp->sy;
|
bottom = yoff + sy;
|
||||||
|
|
||||||
TAILQ_FOREACH(next, &w->panes, entry) {
|
TAILQ_FOREACH(next, &w->panes, entry) {
|
||||||
|
window_pane_full_size_offset(next, &xoff, &yoff, &sx, &sy);
|
||||||
if (next == wp)
|
if (next == wp)
|
||||||
continue;
|
continue;
|
||||||
if (next->xoff + next->sx + 1 != edge)
|
if (xoff + sx + 1 != edge)
|
||||||
continue;
|
continue;
|
||||||
end = next->yoff + next->sy - 1;
|
end = yoff + sy - 1;
|
||||||
|
|
||||||
found = 0;
|
found = 0;
|
||||||
if (next->yoff < top && end > bottom)
|
if (yoff < top && end > bottom)
|
||||||
found = 1;
|
found = 1;
|
||||||
else if (next->yoff >= top && next->yoff <= bottom)
|
else if (yoff >= top && yoff <= bottom)
|
||||||
found = 1;
|
found = 1;
|
||||||
else if (end >= top && end <= bottom)
|
else if (end >= top && end <= bottom)
|
||||||
found = 1;
|
found = 1;
|
||||||
@ -1532,6 +1574,7 @@ window_pane_find_right(struct window_pane *wp)
|
|||||||
struct window_pane *next, *best, **list;
|
struct window_pane *next, *best, **list;
|
||||||
u_int edge, top, bottom, end, size;
|
u_int edge, top, bottom, end, size;
|
||||||
int found;
|
int found;
|
||||||
|
u_int xoff, yoff, sx, sy;
|
||||||
|
|
||||||
if (wp == NULL)
|
if (wp == NULL)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
@ -1540,7 +1583,9 @@ window_pane_find_right(struct window_pane *wp)
|
|||||||
list = NULL;
|
list = NULL;
|
||||||
size = 0;
|
size = 0;
|
||||||
|
|
||||||
edge = wp->xoff + wp->sx + 1;
|
window_pane_full_size_offset(wp, &xoff, &yoff, &sx, &sy);
|
||||||
|
|
||||||
|
edge = xoff + sx + 1;
|
||||||
if (edge >= w->sx)
|
if (edge >= w->sx)
|
||||||
edge = 0;
|
edge = 0;
|
||||||
|
|
||||||
@ -1548,16 +1593,17 @@ window_pane_find_right(struct window_pane *wp)
|
|||||||
bottom = wp->yoff + wp->sy;
|
bottom = wp->yoff + wp->sy;
|
||||||
|
|
||||||
TAILQ_FOREACH(next, &w->panes, entry) {
|
TAILQ_FOREACH(next, &w->panes, entry) {
|
||||||
|
window_pane_full_size_offset(next, &xoff, &yoff, &sx, &sy);
|
||||||
if (next == wp)
|
if (next == wp)
|
||||||
continue;
|
continue;
|
||||||
if (next->xoff != edge)
|
if (xoff != edge)
|
||||||
continue;
|
continue;
|
||||||
end = next->yoff + next->sy - 1;
|
end = yoff + sy - 1;
|
||||||
|
|
||||||
found = 0;
|
found = 0;
|
||||||
if (next->yoff < top && end > bottom)
|
if (yoff < top && end > bottom)
|
||||||
found = 1;
|
found = 1;
|
||||||
else if (next->yoff >= top && next->yoff <= bottom)
|
else if (yoff >= top && yoff <= bottom)
|
||||||
found = 1;
|
found = 1;
|
||||||
else if (end >= top && end <= bottom)
|
else if (end >= top && end <= bottom)
|
||||||
found = 1;
|
found = 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user