mirror of
https://github.com/tmux/tmux.git
synced 2024-12-12 17:38:48 +00:00
Merge branch 'obsd-master'
This commit is contained in:
commit
f8ad72b2ee
@ -77,6 +77,8 @@ cmd_break_pane_exec(struct cmd *self, struct cmdq_item *item)
|
||||
layout_close_pane(wp);
|
||||
|
||||
w = wp->window = window_create(w->sx, w->sy);
|
||||
options_set_parent(wp->options, w->options);
|
||||
wp->flags |= PANE_STYLECHANGED;
|
||||
TAILQ_INSERT_HEAD(&w->panes, wp, entry);
|
||||
w->active = wp;
|
||||
|
||||
|
@ -139,6 +139,8 @@ cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item)
|
||||
TAILQ_REMOVE(&src_w->panes, src_wp, entry);
|
||||
|
||||
src_wp->window = dst_w;
|
||||
options_set_parent(src_wp->options, dst_w->options);
|
||||
src_wp->flags |= PANE_STYLECHANGED;
|
||||
TAILQ_INSERT_AFTER(&dst_w->panes, dst_wp, src_wp, entry);
|
||||
layout_assign_pane(lc, src_wp);
|
||||
|
||||
|
@ -33,8 +33,8 @@ const struct cmd_entry cmd_select_pane_entry = {
|
||||
.name = "select-pane",
|
||||
.alias = "selectp",
|
||||
|
||||
.args = { "DdegLlMmP:RT:t:U", 0, 0 },
|
||||
.usage = "[-DdegLlMmRU] [-P style] [-T title] " CMD_TARGET_PANE_USAGE,
|
||||
.args = { "DdegLlMmP:RT:t:U", 0, 0 }, /* -P and -g deprecated */
|
||||
.usage = "[-DdeLlMmRU] [-T title] " CMD_TARGET_PANE_USAGE,
|
||||
|
||||
.target = { 't', CMD_FIND_PANE, 0 },
|
||||
|
||||
@ -90,9 +90,10 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
|
||||
struct window *w = wl->window;
|
||||
struct session *s = item->target.s;
|
||||
struct window_pane *wp = item->target.wp, *lastwp, *markedwp;
|
||||
struct style *sy = &wp->style;
|
||||
char *pane_title;
|
||||
const char *style;
|
||||
struct style *sy;
|
||||
struct options_entry *o;
|
||||
|
||||
if (self->entry == &cmd_last_pane_entry || args_has(args, 'l')) {
|
||||
lastwp = w->last;
|
||||
@ -144,15 +145,18 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
|
||||
|
||||
if (args_has(self->args, 'P') || args_has(self->args, 'g')) {
|
||||
if ((style = args_get(args, 'P')) != NULL) {
|
||||
style_set(sy, &grid_default_cell);
|
||||
if (style_parse(sy, &grid_default_cell, style) == -1) {
|
||||
o = options_set_style(wp->options, "window-style", 0,
|
||||
style);
|
||||
if (o == NULL) {
|
||||
cmdq_error(item, "bad style: %s", style);
|
||||
return (CMD_RETURN_ERROR);
|
||||
}
|
||||
wp->flags |= PANE_REDRAW;
|
||||
wp->flags |= (PANE_REDRAW|PANE_STYLECHANGED);
|
||||
}
|
||||
if (args_has(self->args, 'g'))
|
||||
if (args_has(self->args, 'g')) {
|
||||
sy = options_get_style(wp->options, "window-style");
|
||||
cmdq_print(item, "%s", style_tostring(sy));
|
||||
}
|
||||
return (CMD_RETURN_NORMAL);
|
||||
}
|
||||
|
||||
|
@ -43,10 +43,10 @@ const struct cmd_entry cmd_set_option_entry = {
|
||||
.name = "set-option",
|
||||
.alias = "set",
|
||||
|
||||
.args = { "aFgoqst:uw", 1, 2 },
|
||||
.usage = "[-aFgosquw] [-t target-window] option [value]",
|
||||
.args = { "aFgopqst:uw", 1, 2 },
|
||||
.usage = "[-aFgopqsuw] " CMD_TARGET_PANE_USAGE " option [value]",
|
||||
|
||||
.target = { 't', CMD_FIND_WINDOW, CMD_FIND_CANFAIL },
|
||||
.target = { 't', CMD_FIND_PANE, CMD_FIND_CANFAIL },
|
||||
|
||||
.flags = CMD_AFTERHOOK,
|
||||
.exec = cmd_set_option_exec
|
||||
@ -88,11 +88,12 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
|
||||
struct session *s = fs->s;
|
||||
struct winlink *wl = fs->wl;
|
||||
struct window *w;
|
||||
enum options_table_scope scope;
|
||||
struct window_pane *wp;
|
||||
struct options *oo;
|
||||
struct options_entry *parent, *o;
|
||||
char *name, *argument, *value = NULL, *cause;
|
||||
int window, idx, already, error, ambiguous;
|
||||
int scope;
|
||||
struct style *sy;
|
||||
|
||||
window = (self->entry == &cmd_set_window_option_entry);
|
||||
@ -249,8 +250,8 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
|
||||
alerts_reset_all();
|
||||
if (strcmp(name, "window-style") == 0 ||
|
||||
strcmp(name, "window-active-style") == 0) {
|
||||
RB_FOREACH(w, windows, &windows)
|
||||
w->flags |= WINDOW_STYLECHANGED;
|
||||
RB_FOREACH(wp, window_pane_tree, &all_window_panes)
|
||||
wp->flags |= PANE_STYLECHANGED;
|
||||
}
|
||||
if (strcmp(name, "pane-border-status") == 0) {
|
||||
RB_FOREACH(w, windows, &windows)
|
||||
|
@ -32,16 +32,16 @@ static enum cmd_retval cmd_show_options_exec(struct cmd *, struct cmdq_item *);
|
||||
static void cmd_show_options_print(struct cmd *, struct cmdq_item *,
|
||||
struct options_entry *, int, int);
|
||||
static enum cmd_retval cmd_show_options_all(struct cmd *, struct cmdq_item *,
|
||||
enum options_table_scope, struct options *);
|
||||
int, struct options *);
|
||||
|
||||
const struct cmd_entry cmd_show_options_entry = {
|
||||
.name = "show-options",
|
||||
.alias = "show",
|
||||
|
||||
.args = { "AgHqst:vw", 0, 1 },
|
||||
.usage = "[-AgHqsvw] [-t target-session|target-window] [option]",
|
||||
.args = { "AgHpqst:vw", 0, 1 },
|
||||
.usage = "[-AgHpqsvw] " CMD_TARGET_PANE_USAGE " [option]",
|
||||
|
||||
.target = { 't', CMD_FIND_WINDOW, CMD_FIND_CANFAIL },
|
||||
.target = { 't', CMD_FIND_PANE, CMD_FIND_CANFAIL },
|
||||
|
||||
.flags = CMD_AFTERHOOK,
|
||||
.exec = cmd_show_options_exec
|
||||
@ -82,9 +82,8 @@ cmd_show_options_exec(struct cmd *self, struct cmdq_item *item)
|
||||
struct session *s = item->target.s;
|
||||
struct winlink *wl = item->target.wl;
|
||||
struct options *oo;
|
||||
enum options_table_scope scope;
|
||||
char *argument, *name = NULL, *cause;
|
||||
int window, idx, ambiguous, parent;
|
||||
int window, idx, ambiguous, parent, scope;
|
||||
struct options_entry *o;
|
||||
|
||||
window = (self->entry == &cmd_show_window_options_entry);
|
||||
@ -190,17 +189,18 @@ cmd_show_options_print(struct cmd *self, struct cmdq_item *item,
|
||||
}
|
||||
|
||||
static enum cmd_retval
|
||||
cmd_show_options_all(struct cmd *self, struct cmdq_item *item,
|
||||
enum options_table_scope scope, struct options *oo)
|
||||
cmd_show_options_all(struct cmd *self, struct cmdq_item *item, int scope,
|
||||
struct options *oo)
|
||||
{
|
||||
const struct options_table_entry *oe;
|
||||
struct options_entry *o;
|
||||
struct options_array_item *a;
|
||||
const char *name;
|
||||
u_int idx;
|
||||
int parent;
|
||||
|
||||
for (oe = options_table; oe->name != NULL; oe++) {
|
||||
if (oe->scope != scope)
|
||||
if (~oe->scope & scope)
|
||||
continue;
|
||||
|
||||
if ((self->entry != &cmd_show_hooks_entry &&
|
||||
@ -227,15 +227,17 @@ cmd_show_options_all(struct cmd *self, struct cmdq_item *item,
|
||||
cmd_show_options_print(self, item, o, -1, parent);
|
||||
else if ((a = options_array_first(o)) == NULL) {
|
||||
if (!args_has(self->args, 'v')) {
|
||||
name = options_name(o);
|
||||
if (parent)
|
||||
cmdq_print(item, "%s*", options_name(o));
|
||||
cmdq_print(item, "%s*", name);
|
||||
else
|
||||
cmdq_print(item, "%s", options_name(o));
|
||||
cmdq_print(item, "%s", name);
|
||||
}
|
||||
} else {
|
||||
while (a != NULL) {
|
||||
idx = options_array_item_index(a);
|
||||
cmd_show_options_print(self, item, o, idx, parent);
|
||||
cmd_show_options_print(self, item, o, idx,
|
||||
parent);
|
||||
a = options_array_next(a);
|
||||
}
|
||||
}
|
||||
|
@ -90,7 +90,11 @@ cmd_swap_pane_exec(struct cmd *self, struct cmdq_item *item)
|
||||
src_wp->layout_cell = dst_lc;
|
||||
|
||||
src_wp->window = dst_w;
|
||||
options_set_parent(src_wp->options, dst_w->options);
|
||||
src_wp->flags |= PANE_STYLECHANGED;
|
||||
dst_wp->window = src_w;
|
||||
options_set_parent(dst_wp->options, src_w->options);
|
||||
dst_wp->flags |= PANE_STYLECHANGED;
|
||||
|
||||
sx = src_wp->sx; sy = src_wp->sy;
|
||||
xoff = src_wp->xoff; yoff = src_wp->yoff;
|
||||
|
2
format.c
2
format.c
@ -1068,6 +1068,8 @@ format_find(struct format_tree *ft, const char *key, int modifiers)
|
||||
|
||||
if (~modifiers & FORMAT_TIMESTRING) {
|
||||
o = options_parse_get(global_options, key, &idx, 0);
|
||||
if (o == NULL && ft->wp != NULL)
|
||||
o = options_parse_get(ft->wp->options, key, &idx, 0);
|
||||
if (o == NULL && ft->w != NULL)
|
||||
o = options_parse_get(ft->w->options, key, &idx, 0);
|
||||
if (o == NULL)
|
||||
|
16
input.c
16
input.c
@ -2347,12 +2347,14 @@ input_osc_10(struct input_ctx *ictx, const char *p)
|
||||
{
|
||||
struct window_pane *wp = ictx->wp;
|
||||
u_int r, g, b;
|
||||
char tmp[16];
|
||||
|
||||
if (sscanf(p, "rgb:%2x/%2x/%2x", &r, &g, &b) != 3)
|
||||
goto bad;
|
||||
|
||||
wp->style.gc.fg = colour_join_rgb(r, g, b);
|
||||
wp->flags |= PANE_REDRAW;
|
||||
xsnprintf(tmp, sizeof tmp, "fg=#%02x%02x%02x", r, g, b);
|
||||
options_set_style(wp->options, "window-style", 1, tmp);
|
||||
options_set_style(wp->options, "window-active-style", 1, tmp);
|
||||
wp->flags |= (PANE_REDRAW|PANE_STYLECHANGED);
|
||||
|
||||
return;
|
||||
|
||||
@ -2366,12 +2368,14 @@ input_osc_11(struct input_ctx *ictx, const char *p)
|
||||
{
|
||||
struct window_pane *wp = ictx->wp;
|
||||
u_int r, g, b;
|
||||
char tmp[16];
|
||||
|
||||
if (sscanf(p, "rgb:%2x/%2x/%2x", &r, &g, &b) != 3)
|
||||
goto bad;
|
||||
|
||||
wp->style.gc.bg = colour_join_rgb(r, g, b);
|
||||
wp->flags |= PANE_REDRAW;
|
||||
xsnprintf(tmp, sizeof tmp, "bg=#%02x%02x%02x", r, g, b);
|
||||
options_set_style(wp->options, "window-style", 1, tmp);
|
||||
options_set_style(wp->options, "window-active-style", 1, tmp);
|
||||
wp->flags |= (PANE_REDRAW|PANE_STYLECHANGED);
|
||||
|
||||
return;
|
||||
|
||||
|
@ -699,7 +699,7 @@ const struct options_table_entry options_table[] = {
|
||||
|
||||
{ .name = "remain-on-exit",
|
||||
.type = OPTIONS_TABLE_FLAG,
|
||||
.scope = OPTIONS_TABLE_WINDOW,
|
||||
.scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
|
||||
.default_num = 0
|
||||
},
|
||||
|
||||
@ -711,7 +711,7 @@ const struct options_table_entry options_table[] = {
|
||||
|
||||
{ .name = "window-active-style",
|
||||
.type = OPTIONS_TABLE_STYLE,
|
||||
.scope = OPTIONS_TABLE_WINDOW,
|
||||
.scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
|
||||
.default_str = "default"
|
||||
},
|
||||
|
||||
@ -724,7 +724,7 @@ const struct options_table_entry options_table[] = {
|
||||
|
||||
{ .name = "window-style",
|
||||
.type = OPTIONS_TABLE_STYLE,
|
||||
.scope = OPTIONS_TABLE_WINDOW,
|
||||
.scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
|
||||
.default_str = "default"
|
||||
},
|
||||
|
||||
|
100
options.c
100
options.c
@ -100,7 +100,7 @@ options_parent_table_entry(struct options *oo, const char *s)
|
||||
|
||||
if (oo->parent == NULL)
|
||||
fatalx("no parent options for %s", s);
|
||||
o = options_get_only(oo->parent, s);
|
||||
o = options_get(oo->parent, s);
|
||||
if (o == NULL)
|
||||
fatalx("%s not in parent options", s);
|
||||
return (o->tableentry);
|
||||
@ -178,6 +178,12 @@ options_free(struct options *oo)
|
||||
free(oo);
|
||||
}
|
||||
|
||||
void
|
||||
options_set_parent(struct options *oo, struct options *parent)
|
||||
{
|
||||
oo->parent = parent;
|
||||
}
|
||||
|
||||
struct options_entry *
|
||||
options_first(struct options *oo)
|
||||
{
|
||||
@ -545,7 +551,7 @@ options_parse_get(struct options *oo, const char *s, int *idx, int only)
|
||||
}
|
||||
|
||||
char *
|
||||
options_match(const char *s, int *idx, int* ambiguous)
|
||||
options_match(const char *s, int *idx, int *ambiguous)
|
||||
{
|
||||
const struct options_table_entry *oe, *found;
|
||||
char *name;
|
||||
@ -725,70 +731,96 @@ options_set_style(struct options *oo, const char *name, int append,
|
||||
return (o);
|
||||
}
|
||||
|
||||
enum options_table_scope
|
||||
int
|
||||
options_scope_from_name(struct args *args, int window,
|
||||
const char *name, struct cmd_find_state *fs, struct options **oo,
|
||||
char **cause)
|
||||
{
|
||||
struct session *s = fs->s;
|
||||
struct winlink *wl = fs->wl;
|
||||
const char *target = args_get(args, 't');
|
||||
enum options_table_scope scope;
|
||||
struct session *s = fs->s;
|
||||
struct winlink *wl = fs->wl;
|
||||
struct window_pane *wp = fs->wp;
|
||||
const char *target = args_get(args, 't');
|
||||
const struct options_table_entry *oe;
|
||||
int scope;
|
||||
|
||||
if (*name == '@')
|
||||
return (options_scope_from_flags(args, window, fs, oo, cause));
|
||||
|
||||
if (options_get_only(global_options, name) != NULL)
|
||||
scope = OPTIONS_TABLE_SERVER;
|
||||
else if (options_get_only(global_s_options, name) != NULL)
|
||||
scope = OPTIONS_TABLE_SESSION;
|
||||
else if (options_get_only(global_w_options, name) != NULL)
|
||||
scope = OPTIONS_TABLE_WINDOW;
|
||||
else {
|
||||
for (oe = options_table; oe->name != NULL; oe++) {
|
||||
if (strcmp(oe->name, name) == 0)
|
||||
break;
|
||||
}
|
||||
if (oe->name == NULL) {
|
||||
xasprintf(cause, "unknown option: %s", name);
|
||||
return (OPTIONS_TABLE_NONE);
|
||||
}
|
||||
scope = oe->scope;
|
||||
|
||||
if (scope == OPTIONS_TABLE_SERVER)
|
||||
switch (scope) {
|
||||
case OPTIONS_TABLE_SERVER:
|
||||
*oo = global_options;
|
||||
else if (scope == OPTIONS_TABLE_SESSION) {
|
||||
break;
|
||||
case OPTIONS_TABLE_SESSION:
|
||||
if (args_has(args, 'g'))
|
||||
*oo = global_s_options;
|
||||
else if (s == NULL) {
|
||||
if (target != NULL)
|
||||
xasprintf(cause, "no such session: %s", target);
|
||||
else
|
||||
xasprintf(cause, "no current session");
|
||||
} else
|
||||
else if (s == NULL && target != NULL)
|
||||
xasprintf(cause, "no such session: %s", target);
|
||||
else if (s == NULL)
|
||||
xasprintf(cause, "no current session");
|
||||
else
|
||||
*oo = s->options;
|
||||
} else if (scope == OPTIONS_TABLE_WINDOW) {
|
||||
break;
|
||||
case OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE:
|
||||
if (args_has(args, 'p')) {
|
||||
if (wp == NULL && target != NULL)
|
||||
xasprintf(cause, "no such pane: %s", target);
|
||||
else if (wp == NULL)
|
||||
xasprintf(cause, "no current pane");
|
||||
else
|
||||
*oo = wp->options;
|
||||
break;
|
||||
}
|
||||
scope = OPTIONS_TABLE_WINDOW;
|
||||
/* FALLTHROUGH */
|
||||
case OPTIONS_TABLE_WINDOW:
|
||||
if (args_has(args, 'g'))
|
||||
*oo = global_w_options;
|
||||
else if (wl == NULL) {
|
||||
if (target != NULL)
|
||||
xasprintf(cause, "no such window: %s", target);
|
||||
else
|
||||
xasprintf(cause, "no current window");
|
||||
} else
|
||||
else if (wl == NULL && target != NULL)
|
||||
xasprintf(cause, "no such window: %s", target);
|
||||
else if (wl == NULL)
|
||||
xasprintf(cause, "no current window");
|
||||
else
|
||||
*oo = wl->window->options;
|
||||
break;
|
||||
}
|
||||
return (scope);
|
||||
}
|
||||
|
||||
enum options_table_scope
|
||||
int
|
||||
options_scope_from_flags(struct args *args, int window,
|
||||
struct cmd_find_state *fs, struct options **oo, char **cause)
|
||||
{
|
||||
struct session *s = fs->s;
|
||||
struct winlink *wl = fs->wl;
|
||||
const char *target = args_get(args, 't');
|
||||
struct session *s = fs->s;
|
||||
struct winlink *wl = fs->wl;
|
||||
struct window_pane *wp = fs->wp;
|
||||
const char *target = args_get(args, 't');
|
||||
|
||||
if (args_has(args, 's')) {
|
||||
*oo = global_options;
|
||||
return (OPTIONS_TABLE_SERVER);
|
||||
}
|
||||
|
||||
if (window || args_has(args, 'w')) {
|
||||
if (args_has(args, 'p')) {
|
||||
if (wp == NULL) {
|
||||
if (target != NULL)
|
||||
xasprintf(cause, "no such pane: %s", target);
|
||||
else
|
||||
xasprintf(cause, "no current pane");
|
||||
return (OPTIONS_TABLE_NONE);
|
||||
}
|
||||
*oo = wp->options;
|
||||
return (OPTIONS_TABLE_PANE);
|
||||
} else if (window || args_has(args, 'w')) {
|
||||
if (args_has(args, 'g')) {
|
||||
*oo = global_w_options;
|
||||
return (OPTIONS_TABLE_WINDOW);
|
||||
|
@ -308,7 +308,7 @@ server_destroy_pane(struct window_pane *wp, int notify)
|
||||
wp->fd = -1;
|
||||
}
|
||||
|
||||
if (options_get_number(w->options, "remain-on-exit")) {
|
||||
if (options_get_number(wp->options, "remain-on-exit")) {
|
||||
if (~wp->flags & PANE_STATUSREADY)
|
||||
return;
|
||||
|
||||
|
255
tmux.1
255
tmux.1
@ -881,7 +881,7 @@ refresh-client -t/dev/ttyp2
|
||||
|
||||
rename-session -tfirst newname
|
||||
|
||||
set-window-option -t:0 monitor-activity on
|
||||
set-option -wt:0 monitor-activity on
|
||||
|
||||
new-window ; split-window -d
|
||||
|
||||
@ -2328,8 +2328,7 @@ applies the last set layout if possible (undoes the most recent layout change).
|
||||
.Fl E
|
||||
spreads the current pane and any panes next to it out evenly.
|
||||
.It Xo Ic select-pane
|
||||
.Op Fl DdegLlMmRU
|
||||
.Op Fl P Ar style
|
||||
.Op Fl DdeLlMmRU
|
||||
.Op Fl T Ar title
|
||||
.Op Fl t Ar target-pane
|
||||
.Xc
|
||||
@ -2356,6 +2355,8 @@ command.
|
||||
enables or
|
||||
.Fl d
|
||||
disables input to the pane.
|
||||
.Fl T
|
||||
sets the pane title.
|
||||
.Pp
|
||||
.Fl m
|
||||
and
|
||||
@ -2370,25 +2371,6 @@ to
|
||||
.Ic swap-pane
|
||||
and
|
||||
.Ic swap-window .
|
||||
.Pp
|
||||
Each pane has a style: by default the
|
||||
.Ic window-style
|
||||
and
|
||||
.Ic window-active-style
|
||||
options are used,
|
||||
.Ic select-pane
|
||||
.Fl P
|
||||
sets the style for a single pane.
|
||||
For example, to set the pane 1 background to red:
|
||||
.Bd -literal -offset indent
|
||||
select-pane -t:.1 -P 'bg=red'
|
||||
.Ed
|
||||
.Pp
|
||||
.Fl g
|
||||
shows the current pane style.
|
||||
.Pp
|
||||
.Fl T
|
||||
sets the pane title.
|
||||
.It Xo Ic select-window
|
||||
.Op Fl lnpT
|
||||
.Op Fl t Ar target-window
|
||||
@ -2707,16 +2689,17 @@ is present, all key bindings are removed.
|
||||
The appearance and behaviour of
|
||||
.Nm
|
||||
may be modified by changing the value of various options.
|
||||
There are three types of option:
|
||||
There are four types of option:
|
||||
.Em server options ,
|
||||
.Em session options
|
||||
.Em window options
|
||||
and
|
||||
.Em window options .
|
||||
.Em pane options .
|
||||
.Pp
|
||||
The
|
||||
.Nm
|
||||
server has a set of global options which do not apply to any particular
|
||||
window or session.
|
||||
window or session or pane.
|
||||
These are altered with the
|
||||
.Ic set-option
|
||||
.Fl s
|
||||
@ -2738,16 +2721,29 @@ The available server and session options are listed under the
|
||||
.Ic set-option
|
||||
command.
|
||||
.Pp
|
||||
Similarly, a set of window options is attached to each window, and there is
|
||||
a set of global window options from which any unset options are inherited.
|
||||
Window options are altered with the
|
||||
.Ic set-window-option
|
||||
command and can be listed with the
|
||||
.Ic show-window-options
|
||||
command.
|
||||
All window options are documented with the
|
||||
.Ic set-window-option
|
||||
command.
|
||||
Similarly, a set of window options is attached to each window and a set of pane
|
||||
options to each pane.
|
||||
Pane options inherit from window options.
|
||||
This means any pane option may be set as a window option to apply the option to
|
||||
all panes in the window without the option set, for example these commands will
|
||||
set the background colour to red for all panes except pane 0:
|
||||
.Bd -literal -offset indent
|
||||
set -w window-style bg=red
|
||||
set -pt:.0 window-style bg=blue
|
||||
.Ed
|
||||
.Pp
|
||||
There is also a set of global window options from which any unset window or
|
||||
pane options are inherited.
|
||||
Window and pane options are altered with
|
||||
.Ic set-option
|
||||
.Fl w
|
||||
and
|
||||
.Fl p
|
||||
commands and displayed with
|
||||
.Ic show-option
|
||||
.Fl w
|
||||
and
|
||||
.Fl p .
|
||||
.Pp
|
||||
.Nm
|
||||
also supports user options which are prefixed with a
|
||||
@ -2765,26 +2761,27 @@ abc123
|
||||
Commands which set options are as follows:
|
||||
.Bl -tag -width Ds
|
||||
.It Xo Ic set-option
|
||||
.Op Fl aFgoqsuw
|
||||
.Op Fl t Ar target-session | Ar target-window
|
||||
.Op Fl aFgopqsuw
|
||||
.Op Fl t Ar target-pane
|
||||
.Ar option Ar value
|
||||
.Xc
|
||||
.D1 (alias: Ic set )
|
||||
Set a window option with
|
||||
.Fl w
|
||||
(equivalent to the
|
||||
.Ic set-window-option
|
||||
command),
|
||||
Set a pane option with
|
||||
.Fl p ,
|
||||
a window option with
|
||||
.Fl w ,
|
||||
a server option with
|
||||
.Fl s ,
|
||||
otherwise a session option.
|
||||
If the option is not a user option,
|
||||
.Fl w
|
||||
and
|
||||
or
|
||||
.Fl s
|
||||
are unnecessary -
|
||||
may be unnecessary -
|
||||
.Nm
|
||||
will infer the type from the option name.
|
||||
will infer the type from the option name, assuming
|
||||
.Fl w
|
||||
for pane options.
|
||||
If
|
||||
.Fl g
|
||||
is given, the global session or window option is set.
|
||||
@ -2829,13 +2826,49 @@ blue foreground.
|
||||
Without
|
||||
.Fl a ,
|
||||
the result would be the default background and a blue foreground.
|
||||
.Pp
|
||||
Available window options are listed under
|
||||
.Ic set-window-option .
|
||||
.Pp
|
||||
.It Xo Ic show-options
|
||||
.Op Fl AgHpqsvw
|
||||
.Op Fl t Ar target-pane
|
||||
.Op Ar option
|
||||
.Xc
|
||||
.D1 (alias: Ic show )
|
||||
Show the pane options (or a single option if
|
||||
.Ar option
|
||||
is provided) with
|
||||
.Fl p ,
|
||||
the window options with
|
||||
.Fl w ,
|
||||
the server options with
|
||||
.Fl s ,
|
||||
otherwise the session options.
|
||||
If the option is not a user option,
|
||||
.Fl w
|
||||
or
|
||||
.Fl s
|
||||
may be unnecessary -
|
||||
.Nm
|
||||
will infer the type from the option name, assuming
|
||||
.Fl w
|
||||
for pane options.
|
||||
Global session or window options are listed if
|
||||
.Fl g
|
||||
is used.
|
||||
.Fl v
|
||||
shows only the option value, not the name.
|
||||
If
|
||||
.Fl q
|
||||
is set, no error will be returned if
|
||||
.Ar option
|
||||
is unset.
|
||||
.Fl H
|
||||
includes hooks (omitted by default).
|
||||
.Fl A
|
||||
includes options inherited from a parent set of options, such options are
|
||||
marked with an asterisk.
|
||||
.Ar value
|
||||
depends on the option and may be a number, a string, or a flag (on, off, or
|
||||
omitted to toggle).
|
||||
.El
|
||||
.Pp
|
||||
Available server options are:
|
||||
.Bl -tag -width Ds
|
||||
@ -3362,26 +3395,8 @@ copy mode.
|
||||
The default is
|
||||
.Ql \ -_@ .
|
||||
.El
|
||||
.It Xo Ic set-window-option
|
||||
.Op Fl aFgoqu
|
||||
.Op Fl t Ar target-window
|
||||
.Ar option Ar value
|
||||
.Xc
|
||||
.D1 (alias: Ic setw )
|
||||
Set a window option.
|
||||
The
|
||||
.Fl a ,
|
||||
.Fl F ,
|
||||
.Fl g ,
|
||||
.Fl o ,
|
||||
.Fl q
|
||||
and
|
||||
.Fl u
|
||||
flags work similarly to the
|
||||
.Ic set-option
|
||||
command.
|
||||
.Pp
|
||||
Supported window options are:
|
||||
Available window options are:
|
||||
.Pp
|
||||
.Bl -tag -width Ds -compact
|
||||
.It Xo Ic aggressive-resize
|
||||
@ -3441,7 +3456,7 @@ or later with
|
||||
or with a terminal escape sequence.
|
||||
It may be switched off globally with:
|
||||
.Bd -literal -offset indent
|
||||
set-window-option -g automatic-rename off
|
||||
set-option -wg automatic-rename off
|
||||
.Ed
|
||||
.Pp
|
||||
.It Ic automatic-rename-format Ar format
|
||||
@ -3558,29 +3573,12 @@ see the
|
||||
section.
|
||||
Attributes are ignored.
|
||||
.Pp
|
||||
.It Xo Ic remain-on-exit
|
||||
.Op Ic on | off
|
||||
.Xc
|
||||
A window with this flag set is not destroyed when the program running in it
|
||||
exits.
|
||||
The window may be reactivated with the
|
||||
.Ic respawn-window
|
||||
command.
|
||||
.Pp
|
||||
.It Xo Ic synchronize-panes
|
||||
.Op Ic on | off
|
||||
.Xc
|
||||
Duplicate input to any pane to all other panes in the same window (only
|
||||
for panes that are not in any special mode).
|
||||
.Pp
|
||||
.It Ic window-active-style Ar style
|
||||
Set the style for the window's active pane.
|
||||
For how to specify
|
||||
.Ar style ,
|
||||
see the
|
||||
.Sx STYLES
|
||||
section.
|
||||
.Pp
|
||||
.It Ic window-status-activity-style Ar style
|
||||
Set status line style for windows with an activity alert.
|
||||
For how to specify
|
||||
@ -3660,14 +3658,6 @@ command and the
|
||||
.Ic aggressive-resize
|
||||
option.
|
||||
.Pp
|
||||
.It Ic window-style Ar style
|
||||
Set the default window style.
|
||||
For how to specify
|
||||
.Ar style ,
|
||||
see the
|
||||
.Sx STYLES
|
||||
section.
|
||||
.Pp
|
||||
.It Xo Ic wrap-search
|
||||
.Op Ic on | off
|
||||
.Xc
|
||||
@ -3684,57 +3674,34 @@ will generate
|
||||
function key sequences; these have a number included to indicate modifiers such
|
||||
as Shift, Alt or Ctrl.
|
||||
.El
|
||||
.It Xo Ic show-options
|
||||
.Op Fl AgHqsvw
|
||||
.Op Fl t Ar target-session | Ar target-window
|
||||
.Op Ar option
|
||||
.Pp
|
||||
Available pane options are:
|
||||
.Pp
|
||||
.Bl -tag -width Ds -compact
|
||||
.It Xo Ic remain-on-exit
|
||||
.Op Ic on | off
|
||||
.Xc
|
||||
.D1 (alias: Ic show )
|
||||
Show the window options (or a single window option if given) with
|
||||
.Fl w
|
||||
(equivalent to
|
||||
.Ic show-window-options ) ,
|
||||
the server options with
|
||||
.Fl s ,
|
||||
otherwise the session options for
|
||||
.Ar target session .
|
||||
If
|
||||
.Ar option
|
||||
is given and is not a user option,
|
||||
.Fl w
|
||||
and
|
||||
.Fl s
|
||||
are unnecessary -
|
||||
.Nm
|
||||
will infer the type from the option name.
|
||||
Global session or window options are listed if
|
||||
.Fl g
|
||||
is used.
|
||||
.Fl v
|
||||
shows only the option value, not the name.
|
||||
If
|
||||
.Fl q
|
||||
is set, no error will be returned if
|
||||
.Ar option
|
||||
is unset.
|
||||
.Fl H
|
||||
includes hooks (omitted by default).
|
||||
.Fl A
|
||||
includes options inherited from a parent set of options, such options are
|
||||
marked with an asterisk.
|
||||
.It Xo Ic show-window-options
|
||||
.Op Fl gv
|
||||
.Op Fl t Ar target-window
|
||||
.Op Ar option
|
||||
.Xc
|
||||
.D1 (alias: Ic showw )
|
||||
List the window options or a single option for
|
||||
.Ar target-window ,
|
||||
or the global window options if
|
||||
.Fl g
|
||||
is used.
|
||||
.Fl v
|
||||
shows only the option value, not the name.
|
||||
A pane with this flag set is not destroyed when the program running in it
|
||||
exits.
|
||||
The pane may be reactivated with the
|
||||
.Ic respawn-pane
|
||||
command.
|
||||
.Pp
|
||||
.It Ic window-active-style Ar style
|
||||
Set the pane style when it is the active pane.
|
||||
For how to specify
|
||||
.Ar style ,
|
||||
see the
|
||||
.Sx STYLES
|
||||
section.
|
||||
.Pp
|
||||
.It Ic window-style Ar style
|
||||
Set the pane style.
|
||||
For how to specify
|
||||
.Ar style ,
|
||||
see the
|
||||
.Sx STYLES
|
||||
section.
|
||||
.El
|
||||
.Sh HOOKS
|
||||
.Nm
|
||||
|
6
tmux.c
6
tmux.c
@ -321,11 +321,11 @@ main(int argc, char **argv)
|
||||
global_s_options = options_create(NULL);
|
||||
global_w_options = options_create(NULL);
|
||||
for (oe = options_table; oe->name != NULL; oe++) {
|
||||
if (oe->scope == OPTIONS_TABLE_SERVER)
|
||||
if (oe->scope & OPTIONS_TABLE_SERVER)
|
||||
options_default(global_options, oe);
|
||||
if (oe->scope == OPTIONS_TABLE_SESSION)
|
||||
if (oe->scope & OPTIONS_TABLE_SESSION)
|
||||
options_default(global_s_options, oe);
|
||||
if (oe->scope == OPTIONS_TABLE_WINDOW)
|
||||
if (oe->scope & OPTIONS_TABLE_WINDOW)
|
||||
options_default(global_w_options, oe);
|
||||
}
|
||||
|
||||
|
27
tmux.h
27
tmux.h
@ -812,6 +812,7 @@ struct window_pane {
|
||||
u_int active_point;
|
||||
|
||||
struct window *window;
|
||||
struct options *options;
|
||||
|
||||
struct layout_cell *layout_cell;
|
||||
struct layout_cell *saved_layout_cell;
|
||||
@ -838,6 +839,7 @@ struct window_pane {
|
||||
#define PANE_STATUSREADY 0x200
|
||||
#define PANE_STATUSDRAWN 0x400
|
||||
#define PANE_EMPTY 0x800
|
||||
#define PANE_STYLECHANGED 0x1000
|
||||
|
||||
int argc;
|
||||
char **argv;
|
||||
@ -856,7 +858,8 @@ struct window_pane {
|
||||
|
||||
struct input_ctx *ictx;
|
||||
|
||||
struct style style;
|
||||
struct style cached_style;
|
||||
struct style cached_active_style;
|
||||
int *palette;
|
||||
|
||||
int pipe_fd;
|
||||
@ -916,7 +919,6 @@ struct window {
|
||||
#define WINDOW_ACTIVITY 0x2
|
||||
#define WINDOW_SILENCE 0x4
|
||||
#define WINDOW_ZOOMED 0x8
|
||||
#define WINDOW_STYLECHANGED 0x10
|
||||
#define WINDOW_ALERTFLAGS (WINDOW_BELL|WINDOW_ACTIVITY|WINDOW_SILENCE)
|
||||
|
||||
int alerts_queued;
|
||||
@ -924,9 +926,6 @@ struct window {
|
||||
|
||||
struct options *options;
|
||||
|
||||
struct style style;
|
||||
struct style active_style;
|
||||
|
||||
u_int references;
|
||||
TAILQ_HEAD(, winlink) winlinks;
|
||||
|
||||
@ -1607,12 +1606,11 @@ enum options_table_type {
|
||||
OPTIONS_TABLE_COMMAND
|
||||
};
|
||||
|
||||
enum options_table_scope {
|
||||
OPTIONS_TABLE_NONE,
|
||||
OPTIONS_TABLE_SERVER,
|
||||
OPTIONS_TABLE_SESSION,
|
||||
OPTIONS_TABLE_WINDOW
|
||||
};
|
||||
#define OPTIONS_TABLE_NONE 0
|
||||
#define OPTIONS_TABLE_SERVER 0x1
|
||||
#define OPTIONS_TABLE_SESSION 0x2
|
||||
#define OPTIONS_TABLE_WINDOW 0x4
|
||||
#define OPTIONS_TABLE_PANE 0x8
|
||||
|
||||
#define OPTIONS_TABLE_IS_ARRAY 0x1
|
||||
#define OPTIONS_TABLE_IS_HOOK 0x2
|
||||
@ -1620,7 +1618,7 @@ enum options_table_scope {
|
||||
struct options_table_entry {
|
||||
const char *name;
|
||||
enum options_table_type type;
|
||||
enum options_table_scope scope;
|
||||
int scope;
|
||||
int flags;
|
||||
|
||||
u_int minimum;
|
||||
@ -1782,6 +1780,7 @@ void notify_pane(const char *, struct window_pane *);
|
||||
/* options.c */
|
||||
struct options *options_create(struct options *);
|
||||
void options_free(struct options *);
|
||||
void options_set_parent(struct options *, struct options *);
|
||||
struct options_entry *options_first(struct options *);
|
||||
struct options_entry *options_next(struct options_entry *);
|
||||
struct options_entry *options_empty(struct options *,
|
||||
@ -1821,10 +1820,10 @@ struct options_entry *options_set_number(struct options *, const char *,
|
||||
long long);
|
||||
struct options_entry *options_set_style(struct options *, const char *, int,
|
||||
const char *);
|
||||
enum options_table_scope options_scope_from_name(struct args *, int,
|
||||
int options_scope_from_name(struct args *, int,
|
||||
const char *, struct cmd_find_state *, struct options **,
|
||||
char **);
|
||||
enum options_table_scope options_scope_from_flags(struct args *, int,
|
||||
int options_scope_from_flags(struct args *, int,
|
||||
struct cmd_find_state *, struct options **, char **);
|
||||
|
||||
/* options-table.c */
|
||||
|
44
tty.c
44
tty.c
@ -2132,7 +2132,7 @@ tty_attributes(struct tty *tty, const struct grid_cell *gc,
|
||||
/* Ignore cell if it is the same as the last one. */
|
||||
if (wp != NULL &&
|
||||
(int)wp->id == tty->last_wp &&
|
||||
~(wp->window->flags & WINDOW_STYLECHANGED) &&
|
||||
~(wp->flags & PANE_STYLECHANGED) &&
|
||||
gc->attr == tty->last_cell.attr &&
|
||||
gc->fg == tty->last_cell.fg &&
|
||||
gc->bg == tty->last_cell.bg)
|
||||
@ -2514,30 +2514,28 @@ fallback_256:
|
||||
static void
|
||||
tty_default_colours(struct grid_cell *gc, struct window_pane *wp)
|
||||
{
|
||||
struct window *w = wp->window;
|
||||
struct options *oo = w->options;
|
||||
struct style *active, *pane, *window;
|
||||
int c;
|
||||
struct options *oo = wp->options;
|
||||
struct style *style, *active_style;
|
||||
int c;
|
||||
|
||||
if (w->flags & WINDOW_STYLECHANGED) {
|
||||
w->flags &= ~WINDOW_STYLECHANGED;
|
||||
active = options_get_style(oo, "window-active-style");
|
||||
style_copy(&w->active_style, active);
|
||||
window = options_get_style(oo, "window-style");
|
||||
style_copy(&w->style, window);
|
||||
if (wp->flags & PANE_STYLECHANGED) {
|
||||
wp->flags &= ~PANE_STYLECHANGED;
|
||||
|
||||
active_style = options_get_style(oo, "window-active-style");
|
||||
style = options_get_style(oo, "window-style");
|
||||
|
||||
style_copy(&wp->cached_active_style, active_style);
|
||||
style_copy(&wp->cached_style, style);
|
||||
} else {
|
||||
active = &w->active_style;
|
||||
window = &w->style;
|
||||
active_style = &wp->cached_active_style;
|
||||
style = &wp->cached_style;
|
||||
}
|
||||
pane = &wp->style;
|
||||
|
||||
if (gc->fg == 8) {
|
||||
if (pane->gc.fg != 8)
|
||||
gc->fg = pane->gc.fg;
|
||||
else if (wp == w->active && active->gc.fg != 8)
|
||||
gc->fg = active->gc.fg;
|
||||
if (wp == wp->window->active && active_style->gc.fg != 8)
|
||||
gc->fg = active_style->gc.fg;
|
||||
else
|
||||
gc->fg = window->gc.fg;
|
||||
gc->fg = style->gc.fg;
|
||||
|
||||
if (gc->fg != 8) {
|
||||
c = window_pane_get_palette(wp, gc->fg);
|
||||
@ -2547,12 +2545,10 @@ tty_default_colours(struct grid_cell *gc, struct window_pane *wp)
|
||||
}
|
||||
|
||||
if (gc->bg == 8) {
|
||||
if (pane->gc.bg != 8)
|
||||
gc->bg = pane->gc.bg;
|
||||
else if (wp == w->active && active->gc.bg != 8)
|
||||
gc->bg = active->gc.bg;
|
||||
if (wp == wp->window->active && active_style->gc.bg != 8)
|
||||
gc->bg = active_style->gc.bg;
|
||||
else
|
||||
gc->bg = window->gc.bg;
|
||||
gc->bg = style->gc.bg;
|
||||
|
||||
if (gc->bg != 8) {
|
||||
c = window_pane_get_palette(wp, gc->bg);
|
||||
|
55
window.c
55
window.c
@ -311,7 +311,7 @@ window_create(u_int sx, u_int sy)
|
||||
|
||||
w = xcalloc(1, sizeof *w);
|
||||
w->name = NULL;
|
||||
w->flags = WINDOW_STYLECHANGED;
|
||||
w->flags = 0;
|
||||
|
||||
TAILQ_INIT(&w->panes);
|
||||
w->active = NULL;
|
||||
@ -448,31 +448,37 @@ window_set_active_pane(struct window *w, struct window_pane *wp, int notify)
|
||||
void
|
||||
window_redraw_active_switch(struct window *w, struct window_pane *wp)
|
||||
{
|
||||
struct style *sy;
|
||||
struct style *sy1, *sy2;
|
||||
int c1, c2;
|
||||
|
||||
if (wp == w->active)
|
||||
return;
|
||||
|
||||
/*
|
||||
* If window-style and window-active-style are the same, we don't need
|
||||
* to redraw panes when switching active panes.
|
||||
*/
|
||||
sy = options_get_style(w->options, "window-active-style");
|
||||
if (style_equal(sy, options_get_style(w->options, "window-style")))
|
||||
return;
|
||||
|
||||
/*
|
||||
* If the now active or inactive pane do not have a custom style or if
|
||||
* the palette is different, they need to be redrawn.
|
||||
*/
|
||||
if (window_pane_get_palette(w->active, w->active->style.gc.fg) != -1 ||
|
||||
window_pane_get_palette(w->active, w->active->style.gc.bg) != -1 ||
|
||||
style_is_default(&w->active->style))
|
||||
w->active->flags |= PANE_REDRAW;
|
||||
if (window_pane_get_palette(wp, wp->style.gc.fg) != -1 ||
|
||||
window_pane_get_palette(wp, wp->style.gc.bg) != -1 ||
|
||||
style_is_default(&wp->style))
|
||||
wp->flags |= PANE_REDRAW;
|
||||
for (;;) {
|
||||
/*
|
||||
* If the active and inactive styles or palettes are different,
|
||||
* need to redraw the panes.
|
||||
*/
|
||||
sy1 = &wp->cached_style;
|
||||
sy2 = &wp->cached_active_style;
|
||||
if (!style_equal(sy1, sy2))
|
||||
wp->flags |= PANE_REDRAW;
|
||||
else {
|
||||
c1 = window_pane_get_palette(wp, sy1->gc.fg);
|
||||
c2 = window_pane_get_palette(wp, sy2->gc.fg);
|
||||
if (c1 != c2)
|
||||
wp->flags |= PANE_REDRAW;
|
||||
else {
|
||||
c1 = window_pane_get_palette(wp, sy1->gc.bg);
|
||||
c2 = window_pane_get_palette(wp, sy2->gc.bg);
|
||||
if (c1 != c2)
|
||||
wp->flags |= PANE_REDRAW;
|
||||
}
|
||||
}
|
||||
if (wp == w->active)
|
||||
break;
|
||||
wp = w->active;
|
||||
}
|
||||
}
|
||||
|
||||
struct window_pane *
|
||||
@ -776,6 +782,8 @@ window_pane_create(struct window *w, u_int sx, u_int sy, u_int hlimit)
|
||||
|
||||
wp = xcalloc(1, sizeof *wp);
|
||||
wp->window = w;
|
||||
wp->options = options_create(w->options);
|
||||
wp->flags = PANE_STYLECHANGED;
|
||||
|
||||
wp->id = next_window_pane_id++;
|
||||
RB_INSERT(window_pane_tree, &all_window_panes, wp);
|
||||
@ -806,8 +814,6 @@ window_pane_create(struct window *w, u_int sx, u_int sy, u_int hlimit)
|
||||
wp->saved_cx = UINT_MAX;
|
||||
wp->saved_cy = UINT_MAX;
|
||||
|
||||
style_set(&wp->style, &grid_default_cell);
|
||||
|
||||
screen_init(&wp->base, sx, sy, hlimit);
|
||||
wp->screen = &wp->base;
|
||||
|
||||
@ -853,6 +859,7 @@ window_pane_destroy(struct window_pane *wp)
|
||||
|
||||
RB_REMOVE(window_pane_tree, &all_window_panes, wp);
|
||||
|
||||
options_free(wp->options);
|
||||
free((void *)wp->cwd);
|
||||
free(wp->shell);
|
||||
cmd_free_argv(wp->argc, wp->argv);
|
||||
|
Loading…
Reference in New Issue
Block a user