mirror of
https://github.com/tmux/tmux.git
synced 2024-12-04 19:58:48 +00:00
Merge branch 'obsd-master' into master
This commit is contained in:
commit
12cfd0d22b
@ -146,7 +146,7 @@ cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item)
|
||||
TAILQ_INSERT_BEFORE(dst_wp, src_wp, entry);
|
||||
else
|
||||
TAILQ_INSERT_AFTER(&dst_w->panes, dst_wp, src_wp, entry);
|
||||
layout_assign_pane(lc, src_wp);
|
||||
layout_assign_pane(lc, src_wp, 0);
|
||||
|
||||
recalculate_sizes();
|
||||
|
||||
|
@ -52,7 +52,7 @@ cmd_rotate_window_exec(struct cmd *self, struct cmdq_item *item)
|
||||
struct layout_cell *lc;
|
||||
u_int sx, sy, xoff, yoff;
|
||||
|
||||
window_push_zoom(w, args_has(args, 'Z'));
|
||||
window_push_zoom(w, 0, args_has(args, 'Z'));
|
||||
|
||||
if (args_has(args, 'D')) {
|
||||
wp = TAILQ_LAST(&w->panes, window_panes);
|
||||
|
@ -117,7 +117,7 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
|
||||
server_redraw_window_borders(lastwp->window);
|
||||
server_status_window(lastwp->window);
|
||||
} else {
|
||||
if (window_push_zoom(w, args_has(args, 'Z')))
|
||||
if (window_push_zoom(w, 0, args_has(args, 'Z')))
|
||||
server_redraw_window(w);
|
||||
window_redraw_active_switch(w, lastwp);
|
||||
if (window_set_active_pane(w, lastwp, 1)) {
|
||||
@ -171,19 +171,19 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
|
||||
}
|
||||
|
||||
if (args_has(args, 'L')) {
|
||||
window_push_zoom(w, 1);
|
||||
window_push_zoom(w, 0, 1);
|
||||
wp = window_pane_find_left(wp);
|
||||
window_pop_zoom(w);
|
||||
} else if (args_has(args, 'R')) {
|
||||
window_push_zoom(w, 1);
|
||||
window_push_zoom(w, 0, 1);
|
||||
wp = window_pane_find_right(wp);
|
||||
window_pop_zoom(w);
|
||||
} else if (args_has(args, 'U')) {
|
||||
window_push_zoom(w, 1);
|
||||
window_push_zoom(w, 0, 1);
|
||||
wp = window_pane_find_up(wp);
|
||||
window_pop_zoom(w);
|
||||
} else if (args_has(args, 'D')) {
|
||||
window_push_zoom(w, 1);
|
||||
window_push_zoom(w, 0, 1);
|
||||
wp = window_pane_find_down(wp);
|
||||
window_pop_zoom(w);
|
||||
}
|
||||
@ -220,7 +220,7 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
|
||||
activewp = w->active;
|
||||
if (wp == activewp)
|
||||
return (CMD_RETURN_NORMAL);
|
||||
if (window_push_zoom(w, args_has(args, 'Z')))
|
||||
if (window_push_zoom(w, 0, args_has(args, 'Z')))
|
||||
server_redraw_window(w);
|
||||
window_redraw_active_switch(w, wp);
|
||||
if (c != NULL && c->session != NULL && (c->flags & CLIENT_ACTIVEPANE))
|
||||
|
@ -39,8 +39,8 @@ const struct cmd_entry cmd_split_window_entry = {
|
||||
.name = "split-window",
|
||||
.alias = "splitw",
|
||||
|
||||
.args = { "bc:de:fF:hIl:p:Pt:v", 0, -1 },
|
||||
.usage = "[-bdefhIPv] [-c start-directory] [-e environment] "
|
||||
.args = { "bc:de:fF:hIl:p:Pt:vZ", 0, -1 },
|
||||
.usage = "[-bdefhIPvZ] [-c start-directory] [-e environment] "
|
||||
"[-F format] [-l size] " CMD_TARGET_PANE_USAGE " [command]",
|
||||
|
||||
.target = { 't', CMD_FIND_PANE, 0 },
|
||||
@ -110,7 +110,7 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
|
||||
} else
|
||||
size = -1;
|
||||
|
||||
server_unzoom_window(wp->window);
|
||||
window_push_zoom(wp->window, 1, args_has(args, 'Z'));
|
||||
input = (args_has(args, 'I') && args->argc == 0);
|
||||
|
||||
flags = 0;
|
||||
@ -152,6 +152,8 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
|
||||
sc.flags = flags;
|
||||
if (args_has(args, 'd'))
|
||||
sc.flags |= SPAWN_DETACHED;
|
||||
if (args_has(args, 'Z'))
|
||||
sc.flags |= SPAWN_ZOOM;
|
||||
|
||||
if ((new_wp = spawn_pane(&sc, &cause)) == NULL) {
|
||||
cmdq_error(item, "create pane failed: %s", cause);
|
||||
@ -168,6 +170,7 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
|
||||
}
|
||||
if (!args_has(args, 'd'))
|
||||
cmd_find_from_winlink_pane(current, wl, new_wp, 0);
|
||||
window_pop_zoom(wp->window);
|
||||
server_redraw_window(wp->window);
|
||||
server_status_session(s);
|
||||
|
||||
|
@ -58,7 +58,7 @@ cmd_swap_pane_exec(struct cmd *self, struct cmdq_item *item)
|
||||
src_w = source->wl->window;
|
||||
src_wp = source->wp;
|
||||
|
||||
if (window_push_zoom(dst_w, args_has(args, 'Z')))
|
||||
if (window_push_zoom(dst_w, 0, args_has(args, 'Z')))
|
||||
server_redraw_window(dst_w);
|
||||
|
||||
if (args_has(args, 'D')) {
|
||||
@ -73,7 +73,7 @@ cmd_swap_pane_exec(struct cmd *self, struct cmdq_item *item)
|
||||
src_wp = TAILQ_LAST(&dst_w->panes, window_panes);
|
||||
}
|
||||
|
||||
if (src_w != dst_w && window_push_zoom(src_w, args_has(args, 'Z')))
|
||||
if (src_w != dst_w && window_push_zoom(src_w, 0, args_has(args, 'Z')))
|
||||
server_redraw_window(src_w);
|
||||
|
||||
if (src_wp == dst_wp)
|
||||
|
@ -118,7 +118,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmdq_item *item)
|
||||
return (CMD_RETURN_NORMAL);
|
||||
if (wl != NULL && wp != NULL && wp != wl->window->active) {
|
||||
w = wl->window;
|
||||
if (window_push_zoom(w, args_has(args, 'Z')))
|
||||
if (window_push_zoom(w, 0, args_has(args, 'Z')))
|
||||
server_redraw_window(w);
|
||||
window_redraw_active_switch(w, wp);
|
||||
window_set_active_pane(w, wp, 1);
|
||||
|
214
format-draw.c
214
format-draw.c
@ -157,13 +157,14 @@ format_draw_put_list(struct screen_write_ctx *octx,
|
||||
static void
|
||||
format_draw_none(struct screen_write_ctx *octx, u_int available, u_int ocx,
|
||||
u_int ocy, struct screen *left, struct screen *centre, struct screen *right,
|
||||
struct format_ranges *frs)
|
||||
struct screen *abs_centre, struct format_ranges *frs)
|
||||
{
|
||||
u_int width_left, width_centre, width_right;
|
||||
u_int width_left, width_centre, width_right, width_abs_centre;
|
||||
|
||||
width_left = left->cx;
|
||||
width_centre = centre->cx;
|
||||
width_right = right->cx;
|
||||
width_abs_centre = abs_centre->cx;
|
||||
|
||||
/*
|
||||
* Try to keep as much of the left and right as possible at the expense
|
||||
@ -199,23 +200,34 @@ format_draw_none(struct screen_write_ctx *octx, u_int available, u_int ocx,
|
||||
- width_centre / 2,
|
||||
centre->cx / 2 - width_centre / 2,
|
||||
width_centre);
|
||||
|
||||
/*
|
||||
* Write abs_centre in the perfect centre of all horizontal space.
|
||||
*/
|
||||
if (width_abs_centre > available)
|
||||
width_abs_centre = available;
|
||||
format_draw_put(octx, ocx, ocy, abs_centre, frs,
|
||||
(available - width_abs_centre) / 2,
|
||||
0,
|
||||
width_abs_centre);
|
||||
}
|
||||
|
||||
/* Draw format with list on the left. */
|
||||
static void
|
||||
format_draw_left(struct screen_write_ctx *octx, u_int available, u_int ocx,
|
||||
u_int ocy, struct screen *left, struct screen *centre, struct screen *right,
|
||||
struct screen *list, struct screen *list_left, struct screen *list_right,
|
||||
struct screen *after, int focus_start, int focus_end,
|
||||
struct format_ranges *frs)
|
||||
struct screen *abs_centre, struct screen *list, struct screen *list_left,
|
||||
struct screen *list_right, struct screen *after, int focus_start,
|
||||
int focus_end, struct format_ranges *frs)
|
||||
{
|
||||
u_int width_left, width_centre, width_right;
|
||||
u_int width_list, width_after;
|
||||
u_int width_list, width_after, width_abs_centre;
|
||||
struct screen_write_ctx ctx;
|
||||
|
||||
width_left = left->cx;
|
||||
width_centre = centre->cx;
|
||||
width_right = right->cx;
|
||||
width_abs_centre = abs_centre->cx;
|
||||
width_list = list->cx;
|
||||
width_after = after->cx;
|
||||
|
||||
@ -247,7 +259,7 @@ format_draw_left(struct screen_write_ctx *octx, u_int available, u_int ocx,
|
||||
screen_write_stop(&ctx);
|
||||
|
||||
format_draw_none(octx, available, ocx, ocy, left, centre,
|
||||
right, frs);
|
||||
right, abs_centre, frs);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -291,23 +303,34 @@ format_draw_left(struct screen_write_ctx *octx, u_int available, u_int ocx,
|
||||
focus_start = focus_end = 0;
|
||||
format_draw_put_list(octx, ocx, ocy, width_left, width_list, list,
|
||||
list_left, list_right, focus_start, focus_end, frs);
|
||||
|
||||
/*
|
||||
* Write abs_centre in the perfect centre of all horizontal space.
|
||||
*/
|
||||
if (width_abs_centre > available)
|
||||
width_abs_centre = available;
|
||||
format_draw_put(octx, ocx, ocy, abs_centre, frs,
|
||||
(available - width_abs_centre) / 2,
|
||||
0,
|
||||
width_abs_centre);
|
||||
}
|
||||
|
||||
/* Draw format with list in the centre. */
|
||||
static void
|
||||
format_draw_centre(struct screen_write_ctx *octx, u_int available, u_int ocx,
|
||||
u_int ocy, struct screen *left, struct screen *centre, struct screen *right,
|
||||
struct screen *list, struct screen *list_left, struct screen *list_right,
|
||||
struct screen *after, int focus_start, int focus_end,
|
||||
struct format_ranges *frs)
|
||||
struct screen *abs_centre, struct screen *list, struct screen *list_left,
|
||||
struct screen *list_right, struct screen *after, int focus_start,
|
||||
int focus_end, struct format_ranges *frs)
|
||||
{
|
||||
u_int width_left, width_centre, width_right;
|
||||
u_int width_list, width_after, middle;
|
||||
u_int width_left, width_centre, width_right, middle;
|
||||
u_int width_list, width_after, width_abs_centre;
|
||||
struct screen_write_ctx ctx;
|
||||
|
||||
width_left = left->cx;
|
||||
width_centre = centre->cx;
|
||||
width_right = right->cx;
|
||||
width_abs_centre = abs_centre->cx;
|
||||
width_list = list->cx;
|
||||
width_after = after->cx;
|
||||
|
||||
@ -339,7 +362,7 @@ format_draw_centre(struct screen_write_ctx *octx, u_int available, u_int ocx,
|
||||
screen_write_stop(&ctx);
|
||||
|
||||
format_draw_none(octx, available, ocx, ocy, left, centre,
|
||||
right, frs);
|
||||
right, abs_centre, frs);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -388,23 +411,34 @@ format_draw_centre(struct screen_write_ctx *octx, u_int available, u_int ocx,
|
||||
format_draw_put_list(octx, ocx, ocy, middle - width_list / 2,
|
||||
width_list, list, list_left, list_right, focus_start, focus_end,
|
||||
frs);
|
||||
|
||||
/*
|
||||
* Write abs_centre in the perfect centre of all horizontal space.
|
||||
*/
|
||||
if (width_abs_centre > available)
|
||||
width_abs_centre = available;
|
||||
format_draw_put(octx, ocx, ocy, abs_centre, frs,
|
||||
(available - width_abs_centre) / 2,
|
||||
0,
|
||||
width_abs_centre);
|
||||
}
|
||||
|
||||
/* Draw format with list on the right. */
|
||||
static void
|
||||
format_draw_right(struct screen_write_ctx *octx, u_int available, u_int ocx,
|
||||
u_int ocy, struct screen *left, struct screen *centre, struct screen *right,
|
||||
struct screen *list, struct screen *list_left, struct screen *list_right,
|
||||
struct screen *after, int focus_start, int focus_end,
|
||||
struct format_ranges *frs)
|
||||
struct screen *abs_centre, struct screen *list,
|
||||
struct screen *list_left, struct screen *list_right, struct screen *after,
|
||||
int focus_start, int focus_end, struct format_ranges *frs)
|
||||
{
|
||||
u_int width_left, width_centre, width_right;
|
||||
u_int width_list, width_after;
|
||||
u_int width_list, width_after, width_abs_centre;
|
||||
struct screen_write_ctx ctx;
|
||||
|
||||
width_left = left->cx;
|
||||
width_centre = centre->cx;
|
||||
width_right = right->cx;
|
||||
width_abs_centre = abs_centre->cx;
|
||||
width_list = list->cx;
|
||||
width_after = after->cx;
|
||||
|
||||
@ -436,7 +470,7 @@ format_draw_right(struct screen_write_ctx *octx, u_int available, u_int ocx,
|
||||
screen_write_stop(&ctx);
|
||||
|
||||
format_draw_none(octx, available, ocx, ocy, left, centre,
|
||||
right, frs);
|
||||
right, abs_centre, frs);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -484,6 +518,118 @@ format_draw_right(struct screen_write_ctx *octx, u_int available, u_int ocx,
|
||||
format_draw_put_list(octx, ocx, ocy, available - width_list -
|
||||
width_after, width_list, list, list_left, list_right, focus_start,
|
||||
focus_end, frs);
|
||||
|
||||
/*
|
||||
* Write abs_centre in the perfect centre of all horizontal space.
|
||||
*/
|
||||
if (width_abs_centre > available)
|
||||
width_abs_centre = available;
|
||||
format_draw_put(octx, ocx, ocy, abs_centre, frs,
|
||||
(available - width_abs_centre) / 2,
|
||||
0,
|
||||
width_abs_centre);
|
||||
}
|
||||
|
||||
static void
|
||||
format_draw_absolute_centre(struct screen_write_ctx *octx, u_int available,
|
||||
u_int ocx, u_int ocy, struct screen *left, struct screen *centre,
|
||||
struct screen *right, struct screen *abs_centre, struct screen *list,
|
||||
struct screen *list_left, struct screen *list_right, struct screen *after,
|
||||
int focus_start, int focus_end, struct format_ranges *frs)
|
||||
{
|
||||
u_int width_left, width_centre, width_right, width_abs_centre;
|
||||
u_int width_list, width_after, middle, abs_centre_offset;
|
||||
|
||||
width_left = left->cx;
|
||||
width_centre = centre->cx;
|
||||
width_right = right->cx;
|
||||
width_abs_centre = abs_centre->cx;
|
||||
width_list = list->cx;
|
||||
width_after = after->cx;
|
||||
|
||||
/*
|
||||
* Trim first centre, then the right, then the left.
|
||||
*/
|
||||
while (width_left +
|
||||
width_centre +
|
||||
width_right > available) {
|
||||
if (width_centre > 0)
|
||||
width_centre--;
|
||||
else if (width_right > 0)
|
||||
width_right--;
|
||||
else
|
||||
width_left--;
|
||||
}
|
||||
|
||||
/*
|
||||
* We trim list after and abs_centre independently, as we are drawing
|
||||
* them over the rest. Trim first the list, then after the list, then
|
||||
* abs_centre.
|
||||
*/
|
||||
while (width_list + width_after + width_abs_centre > available) {
|
||||
if (width_list > 0)
|
||||
width_list--;
|
||||
else if (width_after > 0)
|
||||
width_after--;
|
||||
else
|
||||
width_abs_centre--;
|
||||
}
|
||||
|
||||
/* Write left at 0. */
|
||||
format_draw_put(octx, ocx, ocy, left, frs, 0, 0, width_left);
|
||||
|
||||
/* Write right at available - width_right. */
|
||||
format_draw_put(octx, ocx, ocy, right, frs,
|
||||
available - width_right,
|
||||
right->cx - width_right,
|
||||
width_right);
|
||||
|
||||
/*
|
||||
* Keep writing centre at the relative centre. Only the list is written
|
||||
* in the absolute centre of the horizontal space.
|
||||
*/
|
||||
middle = (width_left + ((available - width_right) - width_left) / 2);
|
||||
|
||||
/*
|
||||
* Write centre at
|
||||
* middle - width_centre.
|
||||
*/
|
||||
format_draw_put(octx, ocx, ocy, centre, frs,
|
||||
middle - width_centre,
|
||||
0,
|
||||
width_centre);
|
||||
|
||||
/*
|
||||
* If there is no focus given, keep the centre in focus.
|
||||
*/
|
||||
if (focus_start == -1 || focus_end == -1)
|
||||
focus_start = focus_end = list->cx / 2;
|
||||
|
||||
/*
|
||||
* We centre abs_centre and the list together, so their shared centre is
|
||||
* in the perfect centre of horizontal space.
|
||||
*/
|
||||
abs_centre_offset = (available - width_list - width_abs_centre) / 2;
|
||||
|
||||
/*
|
||||
* Write abs_centre before the list.
|
||||
*/
|
||||
format_draw_put(octx, ocx, ocy, abs_centre, frs, abs_centre_offset,
|
||||
0, width_abs_centre);
|
||||
abs_centre_offset += width_abs_centre;
|
||||
|
||||
/*
|
||||
* Draw the list in the absolute centre
|
||||
*/
|
||||
format_draw_put_list(octx, ocx, ocy, abs_centre_offset, width_list,
|
||||
list, list_left, list_right, focus_start, focus_end, frs);
|
||||
abs_centre_offset += width_list;
|
||||
|
||||
/*
|
||||
* Write after at the end of the centre
|
||||
*/
|
||||
format_draw_put(octx, ocx, ocy, after, frs, abs_centre_offset, 0,
|
||||
width_after);
|
||||
}
|
||||
|
||||
/* Draw multiple characters. */
|
||||
@ -506,6 +652,7 @@ format_draw(struct screen_write_ctx *octx, const struct grid_cell *base,
|
||||
enum { LEFT,
|
||||
CENTRE,
|
||||
RIGHT,
|
||||
ABSOLUTE_CENTRE,
|
||||
LIST,
|
||||
LIST_LEFT,
|
||||
LIST_RIGHT,
|
||||
@ -514,6 +661,7 @@ format_draw(struct screen_write_ctx *octx, const struct grid_cell *base,
|
||||
const char *names[] = { "LEFT",
|
||||
"CENTRE",
|
||||
"RIGHT",
|
||||
"ABSOLUTE_CENTRE",
|
||||
"LIST",
|
||||
"LIST_LEFT",
|
||||
"LIST_RIGHT",
|
||||
@ -522,7 +670,11 @@ format_draw(struct screen_write_ctx *octx, const struct grid_cell *base,
|
||||
struct screen *os = octx->s, s[TOTAL];
|
||||
struct screen_write_ctx ctx[TOTAL];
|
||||
u_int ocx = os->cx, ocy = os->cy, n, i, width[TOTAL];
|
||||
u_int map[] = { LEFT, LEFT, CENTRE, RIGHT };
|
||||
u_int map[] = { LEFT,
|
||||
LEFT,
|
||||
CENTRE,
|
||||
RIGHT,
|
||||
ABSOLUTE_CENTRE };
|
||||
int focus_start = -1, focus_end = -1;
|
||||
int list_state = -1, fill = -1, even;
|
||||
enum style_align list_align = STYLE_ALIGN_DEFAULT;
|
||||
@ -789,25 +941,35 @@ format_draw(struct screen_write_ctx *octx, const struct grid_cell *base,
|
||||
case STYLE_ALIGN_DEFAULT:
|
||||
/* No list. */
|
||||
format_draw_none(octx, available, ocx, ocy, &s[LEFT],
|
||||
&s[CENTRE], &s[RIGHT], &frs);
|
||||
&s[CENTRE], &s[RIGHT], &s[ABSOLUTE_CENTRE], &frs);
|
||||
break;
|
||||
case STYLE_ALIGN_LEFT:
|
||||
/* List is part of the left. */
|
||||
format_draw_left(octx, available, ocx, ocy, &s[LEFT],
|
||||
&s[CENTRE], &s[RIGHT], &s[LIST], &s[LIST_LEFT],
|
||||
&s[LIST_RIGHT], &s[AFTER], focus_start, focus_end, &frs);
|
||||
&s[CENTRE], &s[RIGHT], &s[ABSOLUTE_CENTRE], &s[LIST],
|
||||
&s[LIST_LEFT], &s[LIST_RIGHT], &s[AFTER],
|
||||
focus_start, focus_end, &frs);
|
||||
break;
|
||||
case STYLE_ALIGN_CENTRE:
|
||||
/* List is part of the centre. */
|
||||
format_draw_centre(octx, available, ocx, ocy, &s[LEFT],
|
||||
&s[CENTRE], &s[RIGHT], &s[LIST], &s[LIST_LEFT],
|
||||
&s[LIST_RIGHT], &s[AFTER], focus_start, focus_end, &frs);
|
||||
&s[CENTRE], &s[RIGHT], &s[ABSOLUTE_CENTRE], &s[LIST],
|
||||
&s[LIST_LEFT], &s[LIST_RIGHT], &s[AFTER],
|
||||
focus_start, focus_end, &frs);
|
||||
break;
|
||||
case STYLE_ALIGN_RIGHT:
|
||||
/* List is part of the right. */
|
||||
format_draw_right(octx, available, ocx, ocy, &s[LEFT],
|
||||
&s[CENTRE], &s[RIGHT], &s[LIST], &s[LIST_LEFT],
|
||||
&s[LIST_RIGHT], &s[AFTER], focus_start, focus_end, &frs);
|
||||
&s[CENTRE], &s[RIGHT], &s[ABSOLUTE_CENTRE], &s[LIST],
|
||||
&s[LIST_LEFT], &s[LIST_RIGHT], &s[AFTER],
|
||||
focus_start, focus_end, &frs);
|
||||
break;
|
||||
case STYLE_ALIGN_ABSOLUTE_CENTRE:
|
||||
/* List is in the centre of the entire horizontal space. */
|
||||
format_draw_absolute_centre(octx, available, ocx, ocy, &s[LEFT],
|
||||
&s[CENTRE], &s[RIGHT], &s[ABSOLUTE_CENTRE], &s[LIST],
|
||||
&s[LIST_LEFT], &s[LIST_RIGHT], &s[AFTER],
|
||||
focus_start, focus_end, &frs);
|
||||
break;
|
||||
}
|
||||
|
||||
|
37
format.c
37
format.c
@ -41,7 +41,6 @@
|
||||
struct format_expand_state;
|
||||
|
||||
static char *format_job_get(struct format_expand_state *, const char *);
|
||||
static void format_job_timer(int, short, void *);
|
||||
static char *format_expand1(struct format_expand_state *, const char *);
|
||||
static int format_replace(struct format_expand_state *, const char *,
|
||||
size_t, char **, size_t *, size_t *);
|
||||
@ -69,7 +68,6 @@ struct format_job {
|
||||
};
|
||||
|
||||
/* Format job tree. */
|
||||
static struct event format_job_event;
|
||||
static int format_job_cmp(struct format_job *, struct format_job *);
|
||||
static RB_HEAD(format_job_tree, format_job) format_jobs = RB_INITIALIZER();
|
||||
RB_GENERATE_STATIC(format_job_tree, format_job, entry, format_job_cmp);
|
||||
@ -437,6 +435,19 @@ format_job_tidy(struct format_job_tree *jobs, int force)
|
||||
}
|
||||
}
|
||||
|
||||
/* Tidy old jobs for all clients. */
|
||||
void
|
||||
format_tidy_jobs(void)
|
||||
{
|
||||
struct client *c;
|
||||
|
||||
format_job_tidy(&format_jobs, 0);
|
||||
TAILQ_FOREACH(c, &clients, entry) {
|
||||
if (c->jobs != NULL)
|
||||
format_job_tidy(c->jobs, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove old jobs for client. */
|
||||
void
|
||||
format_lost_client(struct client *c)
|
||||
@ -446,23 +457,6 @@ format_lost_client(struct client *c)
|
||||
free(c->jobs);
|
||||
}
|
||||
|
||||
/* Remove old jobs periodically. */
|
||||
static void
|
||||
format_job_timer(__unused int fd, __unused short events, __unused void *arg)
|
||||
{
|
||||
struct client *c;
|
||||
struct timeval tv = { .tv_sec = 60 };
|
||||
|
||||
format_job_tidy(&format_jobs, 0);
|
||||
TAILQ_FOREACH(c, &clients, entry) {
|
||||
if (c->jobs != NULL)
|
||||
format_job_tidy(c->jobs, 0);
|
||||
}
|
||||
|
||||
evtimer_del(&format_job_event);
|
||||
evtimer_add(&format_job_event, &tv);
|
||||
}
|
||||
|
||||
/* Wrapper for asprintf. */
|
||||
static char * printflike(1, 2)
|
||||
format_printf(const char *fmt, ...)
|
||||
@ -3048,11 +3042,6 @@ format_create(struct client *c, struct cmdq_item *item, int tag, int flags)
|
||||
{
|
||||
struct format_tree *ft;
|
||||
|
||||
if (!event_initialized(&format_job_event)) {
|
||||
evtimer_set(&format_job_event, format_job_timer, NULL);
|
||||
format_job_timer(-1, 0, NULL);
|
||||
}
|
||||
|
||||
ft = xcalloc(1, sizeof *ft);
|
||||
RB_INIT(&ft->tree);
|
||||
|
||||
|
@ -233,7 +233,7 @@ layout_parse(struct window *w, const char *layout)
|
||||
|
||||
/* Update pane offsets and sizes. */
|
||||
layout_fix_offsets(w);
|
||||
layout_fix_panes(w);
|
||||
layout_fix_panes(w, NULL);
|
||||
recalculate_sizes();
|
||||
|
||||
layout_print_cell(lc, __func__, 0);
|
||||
|
@ -160,7 +160,7 @@ layout_set_even(struct window *w, enum layout_type type)
|
||||
|
||||
/* Fix cell offsets. */
|
||||
layout_fix_offsets(w);
|
||||
layout_fix_panes(w);
|
||||
layout_fix_panes(w, NULL);
|
||||
|
||||
layout_print_cell(w->layout_root, __func__, 1);
|
||||
|
||||
@ -270,7 +270,7 @@ layout_set_main_h(struct window *w)
|
||||
|
||||
/* Fix cell offsets. */
|
||||
layout_fix_offsets(w);
|
||||
layout_fix_panes(w);
|
||||
layout_fix_panes(w, NULL);
|
||||
|
||||
layout_print_cell(w->layout_root, __func__, 1);
|
||||
|
||||
@ -368,7 +368,7 @@ layout_set_main_v(struct window *w)
|
||||
|
||||
/* Fix cell offsets. */
|
||||
layout_fix_offsets(w);
|
||||
layout_fix_panes(w);
|
||||
layout_fix_panes(w, NULL);
|
||||
|
||||
layout_print_cell(w->layout_root, __func__, 1);
|
||||
|
||||
@ -477,7 +477,7 @@ layout_set_tiled(struct window *w)
|
||||
|
||||
/* Fix cell offsets. */
|
||||
layout_fix_offsets(w);
|
||||
layout_fix_panes(w);
|
||||
layout_fix_panes(w, NULL);
|
||||
|
||||
layout_print_cell(w->layout_root, __func__, 1);
|
||||
|
||||
|
22
layout.c
22
layout.c
@ -286,7 +286,7 @@ layout_add_border(struct window *w, struct layout_cell *lc, int status)
|
||||
|
||||
/* Update pane offsets and sizes based on their cells. */
|
||||
void
|
||||
layout_fix_panes(struct window *w)
|
||||
layout_fix_panes(struct window *w, struct window_pane *skip)
|
||||
{
|
||||
struct window_pane *wp;
|
||||
struct layout_cell *lc;
|
||||
@ -294,7 +294,7 @@ layout_fix_panes(struct window *w)
|
||||
|
||||
status = options_get_number(w->options, "pane-border-status");
|
||||
TAILQ_FOREACH(wp, &w->panes, entry) {
|
||||
if ((lc = wp->layout_cell) == NULL)
|
||||
if ((lc = wp->layout_cell) == NULL || wp == skip)
|
||||
continue;
|
||||
|
||||
wp->xoff = lc->xoff;
|
||||
@ -482,7 +482,7 @@ layout_init(struct window *w, struct window_pane *wp)
|
||||
lc = w->layout_root = layout_create_cell(NULL);
|
||||
layout_set_size(lc, w->sx, w->sy, 0, 0);
|
||||
layout_make_leaf(lc, wp);
|
||||
layout_fix_panes(w);
|
||||
layout_fix_panes(w, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
@ -540,7 +540,7 @@ layout_resize(struct window *w, u_int sx, u_int sy)
|
||||
|
||||
/* Fix cell offsets. */
|
||||
layout_fix_offsets(w);
|
||||
layout_fix_panes(w);
|
||||
layout_fix_panes(w, NULL);
|
||||
}
|
||||
|
||||
/* Resize a pane to an absolute size. */
|
||||
@ -600,7 +600,7 @@ layout_resize_layout(struct window *w, struct layout_cell *lc,
|
||||
|
||||
/* Fix cell offsets. */
|
||||
layout_fix_offsets(w);
|
||||
layout_fix_panes(w);
|
||||
layout_fix_panes(w, NULL);
|
||||
notify_window("window-layout-changed", w);
|
||||
}
|
||||
|
||||
@ -704,10 +704,14 @@ layout_resize_pane_shrink(struct window *w, struct layout_cell *lc,
|
||||
|
||||
/* Assign window pane to newly split cell. */
|
||||
void
|
||||
layout_assign_pane(struct layout_cell *lc, struct window_pane *wp)
|
||||
layout_assign_pane(struct layout_cell *lc, struct window_pane *wp,
|
||||
int do_not_resize)
|
||||
{
|
||||
layout_make_leaf(lc, wp);
|
||||
layout_fix_panes(wp->window);
|
||||
if (do_not_resize)
|
||||
layout_fix_panes(wp->window, wp);
|
||||
else
|
||||
layout_fix_panes(wp->window, NULL);
|
||||
}
|
||||
|
||||
/* Calculate the new pane size for resized parent. */
|
||||
@ -1040,7 +1044,7 @@ layout_close_pane(struct window_pane *wp)
|
||||
/* Fix pane offsets and sizes. */
|
||||
if (w->layout_root != NULL) {
|
||||
layout_fix_offsets(w);
|
||||
layout_fix_panes(w);
|
||||
layout_fix_panes(w, NULL);
|
||||
}
|
||||
notify_window("window-layout-changed", w);
|
||||
}
|
||||
@ -1109,7 +1113,7 @@ layout_spread_out(struct window_pane *wp)
|
||||
do {
|
||||
if (layout_spread_cell(w, parent)) {
|
||||
layout_fix_offsets(w);
|
||||
layout_fix_panes(w);
|
||||
layout_fix_panes(w, NULL);
|
||||
break;
|
||||
}
|
||||
} while ((parent = parent->parent) != NULL);
|
||||
|
@ -45,7 +45,7 @@ static const char *options_table_status_keys_list[] = {
|
||||
"emacs", "vi", NULL
|
||||
};
|
||||
static const char *options_table_status_justify_list[] = {
|
||||
"left", "centre", "right", NULL
|
||||
"left", "centre", "right", "absolute-centre", NULL
|
||||
};
|
||||
static const char *options_table_status_position_list[] = {
|
||||
"top", "bottom", NULL
|
||||
|
@ -1115,7 +1115,7 @@ options_push_changes(const char *name)
|
||||
}
|
||||
if (strcmp(name, "pane-border-status") == 0) {
|
||||
RB_FOREACH(w, windows, &windows)
|
||||
layout_fix_panes(w);
|
||||
layout_fix_panes(w, NULL);
|
||||
}
|
||||
RB_FOREACH(s, sessions, &sessions)
|
||||
status_update_cache(s);
|
||||
|
26
server.c
26
server.c
@ -46,6 +46,7 @@ static int server_fd = -1;
|
||||
static uint64_t server_client_flags;
|
||||
static int server_exit;
|
||||
static struct event server_ev_accept;
|
||||
static struct event server_ev_tidy;
|
||||
|
||||
struct cmd_find_state marked_pane;
|
||||
|
||||
@ -149,15 +150,29 @@ fail:
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* Tidy up every hour. */
|
||||
static void
|
||||
server_tidy_event(__unused int fd, __unused short events, __unused void *data)
|
||||
{
|
||||
struct timeval tv = { .tv_sec = 3600 };
|
||||
uint64_t t = get_timer();
|
||||
|
||||
format_tidy_jobs();
|
||||
|
||||
log_debug("%s: took %llu milliseconds", __func__, get_timer() - t);
|
||||
evtimer_add(&server_ev_tidy, &tv);
|
||||
}
|
||||
|
||||
/* Fork new server. */
|
||||
int
|
||||
server_start(struct tmuxproc *client, int flags, struct event_base *base,
|
||||
int lockfd, char *lockfile)
|
||||
{
|
||||
int fd;
|
||||
sigset_t set, oldset;
|
||||
struct client *c = NULL;
|
||||
char *cause = NULL;
|
||||
int fd;
|
||||
sigset_t set, oldset;
|
||||
struct client *c = NULL;
|
||||
char *cause = NULL;
|
||||
struct timeval tv = { .tv_sec = 3600 };
|
||||
|
||||
sigfillset(&set);
|
||||
sigprocmask(SIG_BLOCK, &set, &oldset);
|
||||
@ -216,6 +231,9 @@ server_start(struct tmuxproc *client, int flags, struct event_base *base,
|
||||
free(cause);
|
||||
}
|
||||
|
||||
evtimer_set(&server_ev_tidy, server_tidy_event, NULL);
|
||||
evtimer_add(&server_ev_tidy, &tv);
|
||||
|
||||
server_add_accept(0);
|
||||
proc_loop(server_proc, server_loop);
|
||||
|
||||
|
5
spawn.c
5
spawn.c
@ -259,7 +259,10 @@ spawn_pane(struct spawn_context *sc, char **cause)
|
||||
layout_init(w, new_wp);
|
||||
} else {
|
||||
new_wp = window_add_pane(w, sc->wp0, hlimit, sc->flags);
|
||||
layout_assign_pane(sc->lc, new_wp);
|
||||
if (sc->flags & SPAWN_ZOOM)
|
||||
layout_assign_pane(sc->lc, new_wp, 1);
|
||||
else
|
||||
layout_assign_pane(sc->lc, new_wp, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
4
style.c
4
style.c
@ -139,6 +139,8 @@ style_parse(struct style *sy, const struct grid_cell *base, const char *in)
|
||||
sy->align = STYLE_ALIGN_CENTRE;
|
||||
else if (strcasecmp(tmp + 6, "right") == 0)
|
||||
sy->align = STYLE_ALIGN_RIGHT;
|
||||
else if (strcasecmp(tmp + 6, "absolute-centre") == 0)
|
||||
sy->align = STYLE_ALIGN_ABSOLUTE_CENTRE;
|
||||
else
|
||||
goto error;
|
||||
} else if (end > 5 && strncasecmp(tmp, "fill=", 5) == 0) {
|
||||
@ -227,6 +229,8 @@ style_tostring(struct style *sy)
|
||||
tmp = "centre";
|
||||
else if (sy->align == STYLE_ALIGN_RIGHT)
|
||||
tmp = "right";
|
||||
else if (sy->align == STYLE_ALIGN_ABSOLUTE_CENTRE)
|
||||
tmp = "absolute-centre";
|
||||
off += xsnprintf(s + off, sizeof s - off, "%salign=%s", comma,
|
||||
tmp);
|
||||
comma = ",";
|
||||
|
11
tmux.1
11
tmux.1
@ -2804,7 +2804,7 @@ is given and the selected window is already the current window,
|
||||
the command behaves like
|
||||
.Ic last-window .
|
||||
.It Xo Ic split-window
|
||||
.Op Fl bdfhIvP
|
||||
.Op Fl bdfhIvPZ
|
||||
.Op Fl c Ar start-directory
|
||||
.Op Fl e Ar environment
|
||||
.Op Fl l Ar size
|
||||
@ -2840,6 +2840,8 @@ option creates a new pane spanning the full window height (with
|
||||
or full window width (with
|
||||
.Fl v ) ,
|
||||
instead of splitting the active pane.
|
||||
.Fl Z
|
||||
zooms if the window is not zoomed, or keeps it zoomed if already zoomed.
|
||||
.Pp
|
||||
An empty
|
||||
.Ar shell-command
|
||||
@ -3813,10 +3815,11 @@ seconds.
|
||||
By default, updates will occur every 15 seconds.
|
||||
A setting of zero disables redrawing at interval.
|
||||
.It Xo Ic status-justify
|
||||
.Op Ic left | centre | right
|
||||
.Op Ic left | centre | right | absolute-centre
|
||||
.Xc
|
||||
Set the position of the window list component of the status line: left, centre
|
||||
or right justified.
|
||||
Set the position of the window list in the status line: left, centre or right.
|
||||
centre puts the window list in the relative centre of the available free space;
|
||||
absolute-centre uses the centre of the entire horizontal space.
|
||||
.It Xo Ic status-keys
|
||||
.Op Ic vi | emacs
|
||||
.Xc
|
||||
|
12
tmux.h
12
tmux.h
@ -741,7 +741,8 @@ enum style_align {
|
||||
STYLE_ALIGN_DEFAULT,
|
||||
STYLE_ALIGN_LEFT,
|
||||
STYLE_ALIGN_CENTRE,
|
||||
STYLE_ALIGN_RIGHT
|
||||
STYLE_ALIGN_RIGHT,
|
||||
STYLE_ALIGN_ABSOLUTE_CENTRE
|
||||
};
|
||||
|
||||
/* Style list. */
|
||||
@ -1863,6 +1864,7 @@ struct spawn_context {
|
||||
#define SPAWN_NONOTIFY 0x10
|
||||
#define SPAWN_FULLSIZE 0x20
|
||||
#define SPAWN_EMPTY 0x40
|
||||
#define SPAWN_ZOOM 0x80
|
||||
};
|
||||
|
||||
/* Mode tree sort order. */
|
||||
@ -1946,6 +1948,7 @@ char *paste_make_sample(struct paste_buffer *);
|
||||
struct format_tree;
|
||||
struct format_modifier;
|
||||
typedef void *(*format_cb)(struct format_tree *);
|
||||
void format_tidy_jobs(void);
|
||||
const char *format_skip(const char *, const char *);
|
||||
int format_true(const char *);
|
||||
struct format_tree *format_create(struct client *, struct cmdq_item *, int,
|
||||
@ -2753,7 +2756,7 @@ void window_resize(struct window *, u_int, u_int, int, int);
|
||||
void window_pane_send_resize(struct window_pane *, int);
|
||||
int window_zoom(struct window_pane *);
|
||||
int window_unzoom(struct window *);
|
||||
int window_push_zoom(struct window *, int);
|
||||
int window_push_zoom(struct window *, int, int);
|
||||
int window_pop_zoom(struct window *);
|
||||
void window_lost_pane(struct window *, struct window_pane *);
|
||||
void window_remove_pane(struct window *, struct window_pane *);
|
||||
@ -2816,7 +2819,7 @@ void layout_set_size(struct layout_cell *, u_int, u_int, u_int,
|
||||
void layout_make_leaf(struct layout_cell *, struct window_pane *);
|
||||
void layout_make_node(struct layout_cell *, enum layout_type);
|
||||
void layout_fix_offsets(struct window *);
|
||||
void layout_fix_panes(struct window *);
|
||||
void layout_fix_panes(struct window *, struct window_pane *);
|
||||
void layout_resize_adjust(struct window *, struct layout_cell *,
|
||||
enum layout_type, int);
|
||||
void layout_init(struct window *, struct window_pane *);
|
||||
@ -2826,7 +2829,8 @@ void layout_resize_pane(struct window_pane *, enum layout_type,
|
||||
int, int);
|
||||
void layout_resize_pane_to(struct window_pane *, enum layout_type,
|
||||
u_int);
|
||||
void layout_assign_pane(struct layout_cell *, struct window_pane *);
|
||||
void layout_assign_pane(struct layout_cell *, struct window_pane *,
|
||||
int);
|
||||
struct layout_cell *layout_split_pane(struct window_pane *, enum layout_type,
|
||||
int, int);
|
||||
void layout_close_pane(struct window_pane *);
|
||||
|
6
window.c
6
window.c
@ -629,18 +629,18 @@ window_unzoom(struct window *w)
|
||||
wp->layout_cell = wp->saved_layout_cell;
|
||||
wp->saved_layout_cell = NULL;
|
||||
}
|
||||
layout_fix_panes(w);
|
||||
layout_fix_panes(w, NULL);
|
||||
notify_window("window-layout-changed", w);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
window_push_zoom(struct window *w, int flag)
|
||||
window_push_zoom(struct window *w, int always, int flag)
|
||||
{
|
||||
log_debug("%s: @%u %d", __func__, w->id,
|
||||
flag && (w->flags & WINDOW_ZOOMED));
|
||||
if (flag && (w->flags & WINDOW_ZOOMED))
|
||||
if (flag && (always || (w->flags & WINDOW_ZOOMED)))
|
||||
w->flags |= WINDOW_WASZOOMED;
|
||||
else
|
||||
w->flags &= ~WINDOW_WASZOOMED;
|
||||
|
Loading…
Reference in New Issue
Block a user