mirror of
https://github.com/tmux/tmux.git
synced 2025-09-06 19:38:21 +00:00
Merge branch 'obsd-master'
This commit is contained in:
5
file.c
5
file.c
@@ -361,7 +361,7 @@ file_read(struct client *c, const char *path, client_file_cb cb, void *cbdata)
|
|||||||
size_t msglen;
|
size_t msglen;
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
u_int stream = file_next_stream++;
|
u_int stream = file_next_stream++;
|
||||||
FILE *f;
|
FILE *f = NULL;
|
||||||
size_t size;
|
size_t size;
|
||||||
char buffer[BUFSIZ];
|
char buffer[BUFSIZ];
|
||||||
|
|
||||||
@@ -401,7 +401,6 @@ file_read(struct client *c, const char *path, client_file_cb cb, void *cbdata)
|
|||||||
cf->error = EIO;
|
cf->error = EIO;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
fclose(f);
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -424,6 +423,8 @@ skip:
|
|||||||
return cf;
|
return cf;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
if (f != NULL)
|
||||||
|
fclose(f);
|
||||||
file_fire_done(cf);
|
file_fire_done(cf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
24
input.c
24
input.c
@@ -747,6 +747,20 @@ input_table_compare(const void *key, const void *value)
|
|||||||
return (strcmp(ictx->interm_buf, entry->interm));
|
return (strcmp(ictx->interm_buf, entry->interm));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Stop UTF-8 and enter an invalid character. */
|
||||||
|
static void
|
||||||
|
input_stop_utf8(struct input_ctx *ictx)
|
||||||
|
{
|
||||||
|
struct screen_write_ctx *sctx = &ictx->ctx;
|
||||||
|
static struct utf8_data rc = { "\357\277\275", 3, 3, 1 };
|
||||||
|
|
||||||
|
if (ictx->utf8started) {
|
||||||
|
utf8_copy(&ictx->cell.cell.data, &rc);
|
||||||
|
screen_write_collect_add(sctx, &ictx->cell.cell);
|
||||||
|
}
|
||||||
|
ictx->utf8started = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Timer - if this expires then have been waiting for a terminator for too
|
* Timer - if this expires then have been waiting for a terminator for too
|
||||||
* long, so reset to ground.
|
* long, so reset to ground.
|
||||||
@@ -1144,7 +1158,7 @@ input_print(struct input_ctx *ictx)
|
|||||||
struct screen_write_ctx *sctx = &ictx->ctx;
|
struct screen_write_ctx *sctx = &ictx->ctx;
|
||||||
int set;
|
int set;
|
||||||
|
|
||||||
ictx->utf8started = 0; /* can't be valid UTF-8 */
|
input_stop_utf8(ictx); /* can't be valid UTF-8 */
|
||||||
|
|
||||||
set = ictx->cell.set == 0 ? ictx->cell.g0set : ictx->cell.g1set;
|
set = ictx->cell.set == 0 ? ictx->cell.g0set : ictx->cell.g1set;
|
||||||
if (set == 1)
|
if (set == 1)
|
||||||
@@ -1224,7 +1238,7 @@ input_c0_dispatch(struct input_ctx *ictx)
|
|||||||
u_int width;
|
u_int width;
|
||||||
int has_content = 0;
|
int has_content = 0;
|
||||||
|
|
||||||
ictx->utf8started = 0; /* can't be valid UTF-8 */
|
input_stop_utf8(ictx); /* can't be valid UTF-8 */
|
||||||
|
|
||||||
log_debug("%s: '%c'", __func__, ictx->ch);
|
log_debug("%s: '%c'", __func__, ictx->ch);
|
||||||
|
|
||||||
@@ -2588,9 +2602,9 @@ input_top_bit_set(struct input_ctx *ictx)
|
|||||||
ictx->flags &= ~INPUT_LAST;
|
ictx->flags &= ~INPUT_LAST;
|
||||||
|
|
||||||
if (!ictx->utf8started) {
|
if (!ictx->utf8started) {
|
||||||
if (utf8_open(ud, ictx->ch) != UTF8_MORE)
|
|
||||||
return (0);
|
|
||||||
ictx->utf8started = 1;
|
ictx->utf8started = 1;
|
||||||
|
if (utf8_open(ud, ictx->ch) != UTF8_MORE)
|
||||||
|
input_stop_utf8(ictx);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2598,7 +2612,7 @@ input_top_bit_set(struct input_ctx *ictx)
|
|||||||
case UTF8_MORE:
|
case UTF8_MORE:
|
||||||
return (0);
|
return (0);
|
||||||
case UTF8_ERROR:
|
case UTF8_ERROR:
|
||||||
ictx->utf8started = 0;
|
input_stop_utf8(ictx);
|
||||||
return (0);
|
return (0);
|
||||||
case UTF8_DONE:
|
case UTF8_DONE:
|
||||||
break;
|
break;
|
||||||
|
@@ -437,7 +437,6 @@ key_bindings_init(void)
|
|||||||
"bind -N 'Display window menu' < { display-menu -xW -yW -T '#[align=centre]#{window_index}:#{window_name}' " DEFAULT_WINDOW_MENU " }",
|
"bind -N 'Display window menu' < { display-menu -xW -yW -T '#[align=centre]#{window_index}:#{window_name}' " DEFAULT_WINDOW_MENU " }",
|
||||||
"bind -N 'Display pane menu' > { display-menu -xP -yP -T '#[align=centre]#{pane_index} (#{pane_id})' " DEFAULT_PANE_MENU " }",
|
"bind -N 'Display pane menu' > { display-menu -xP -yP -T '#[align=centre]#{pane_index} (#{pane_id})' " DEFAULT_PANE_MENU " }",
|
||||||
|
|
||||||
|
|
||||||
/* Mouse button 1 down on pane. */
|
/* Mouse button 1 down on pane. */
|
||||||
"bind -n MouseDown1Pane { select-pane -t=; send -M }",
|
"bind -n MouseDown1Pane { select-pane -t=; send -M }",
|
||||||
|
|
||||||
@@ -460,7 +459,7 @@ key_bindings_init(void)
|
|||||||
"bind -n MouseDrag1Border { resize-pane -M }",
|
"bind -n MouseDrag1Border { resize-pane -M }",
|
||||||
|
|
||||||
/* Mouse button 1 down on status line. */
|
/* Mouse button 1 down on status line. */
|
||||||
"bind -n MouseDown1Status { select-window -t= }",
|
"bind -n MouseDown1Status { switch-client -t= }",
|
||||||
|
|
||||||
/* Mouse wheel down on status line. */
|
/* Mouse wheel down on status line. */
|
||||||
"bind -n WheelDownStatus { next-window }",
|
"bind -n WheelDownStatus { next-window }",
|
||||||
|
3
menu.c
3
menu.c
@@ -298,6 +298,7 @@ menu_key_cb(struct client *c, void *data, struct key_event *event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch (event->key & ~KEYC_MASK_FLAGS) {
|
switch (event->key & ~KEYC_MASK_FLAGS) {
|
||||||
|
case KEYC_BTAB:
|
||||||
case KEYC_UP:
|
case KEYC_UP:
|
||||||
case 'k':
|
case 'k':
|
||||||
if (old == -1)
|
if (old == -1)
|
||||||
@@ -363,7 +364,7 @@ menu_key_cb(struct client *c, void *data, struct key_event *event)
|
|||||||
name = menu->items[md->choice].name;
|
name = menu->items[md->choice].name;
|
||||||
if (md->choice != count - 1 &&
|
if (md->choice != count - 1 &&
|
||||||
(name != NULL && *name != '-'))
|
(name != NULL && *name != '-'))
|
||||||
i++;
|
i--;
|
||||||
else if (md->choice == count - 1)
|
else if (md->choice == count - 1)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -76,7 +76,7 @@ static const char *options_table_pane_border_indicators_list[] = {
|
|||||||
"off", "colour", "arrows", "both", NULL
|
"off", "colour", "arrows", "both", NULL
|
||||||
};
|
};
|
||||||
static const char *options_table_pane_border_lines_list[] = {
|
static const char *options_table_pane_border_lines_list[] = {
|
||||||
"single", "double", "heavy", "simple", "number", NULL
|
"single", "double", "heavy", "simple", "number", "spaces", NULL
|
||||||
};
|
};
|
||||||
static const char *options_table_popup_border_lines_list[] = {
|
static const char *options_table_popup_border_lines_list[] = {
|
||||||
"single", "double", "heavy", "simple", "rounded", "padded", "none", NULL
|
"single", "double", "heavy", "simple", "rounded", "padded", "none", NULL
|
||||||
@@ -173,10 +173,60 @@ static const char *options_table_allow_passthrough_list[] = {
|
|||||||
"#[pop-default]" \
|
"#[pop-default]" \
|
||||||
"#[norange default]"
|
"#[norange default]"
|
||||||
#define OPTIONS_TABLE_STATUS_FORMAT2 \
|
#define OPTIONS_TABLE_STATUS_FORMAT2 \
|
||||||
"#[align=centre]#{P:#{?pane_active,#[reverse],}" \
|
"#[align=left]#{R: ,#{n:#{session_name}}}P: " \
|
||||||
"#{pane_index}[#{pane_width}x#{pane_height}]#[default] }"
|
"#[norange default]" \
|
||||||
|
"#[list=on align=#{status-justify}]" \
|
||||||
|
"#[list=left-marker]<#[list=right-marker]>#[list=on]" \
|
||||||
|
"#{P:" \
|
||||||
|
"#[range=pane|#{pane_id} " \
|
||||||
|
"#{E:pane-status-style}" \
|
||||||
|
"]" \
|
||||||
|
"#[push-default]" \
|
||||||
|
"#P[#{pane_width}x#{pane_height}]" \
|
||||||
|
"#[pop-default]" \
|
||||||
|
"#[norange list=on default] " \
|
||||||
|
"," \
|
||||||
|
"#[range=pane|#{pane_id} list=focus " \
|
||||||
|
"#{?#{!=:#{E:pane-status-current-style},default}," \
|
||||||
|
"#{E:pane-status-current-style}," \
|
||||||
|
"#{E:pane-status-style}" \
|
||||||
|
"}" \
|
||||||
|
"]" \
|
||||||
|
"#[push-default]" \
|
||||||
|
"#P[#{pane_width}x#{pane_height}]*" \
|
||||||
|
"#[pop-default]" \
|
||||||
|
"#[norange list=on default] " \
|
||||||
|
"}"
|
||||||
|
#define OPTIONS_TABLE_STATUS_FORMAT3 \
|
||||||
|
"#[align=left]#{R: ,#{n:#{session_name}}}S: " \
|
||||||
|
"#[norange default]" \
|
||||||
|
"#[list=on align=#{status-justify}]" \
|
||||||
|
"#[list=left-marker]<#[list=right-marker]>#[list=on]" \
|
||||||
|
"#{S:" \
|
||||||
|
"#[range=session|#{session_id} " \
|
||||||
|
"#{E:session-status-style}" \
|
||||||
|
"]" \
|
||||||
|
"#[push-default]" \
|
||||||
|
"#S#{session_alert}" \
|
||||||
|
"#[pop-default]" \
|
||||||
|
"#[norange list=on default] " \
|
||||||
|
"," \
|
||||||
|
"#[range=session|#{session_id} list=focus " \
|
||||||
|
"#{?#{!=:#{E:session-status-current-style},default}," \
|
||||||
|
"#{E:session-status-current-style}," \
|
||||||
|
"#{E:session-status-style}" \
|
||||||
|
"}" \
|
||||||
|
"]" \
|
||||||
|
"#[push-default]" \
|
||||||
|
"#S*#{session_alert}" \
|
||||||
|
"#[pop-default]" \
|
||||||
|
"#[norange list=on default] " \
|
||||||
|
"}"
|
||||||
static const char *options_table_status_format_default[] = {
|
static const char *options_table_status_format_default[] = {
|
||||||
OPTIONS_TABLE_STATUS_FORMAT1, OPTIONS_TABLE_STATUS_FORMAT2, NULL
|
OPTIONS_TABLE_STATUS_FORMAT1,
|
||||||
|
OPTIONS_TABLE_STATUS_FORMAT2,
|
||||||
|
OPTIONS_TABLE_STATUS_FORMAT3,
|
||||||
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Helpers for hook options. */
|
/* Helpers for hook options. */
|
||||||
@@ -871,6 +921,25 @@ const struct options_table_entry options_table[] = {
|
|||||||
.text = "Style of the status line."
|
.text = "Style of the status line."
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ .name = "pane-status-current-style",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.scope = OPTIONS_TABLE_WINDOW,
|
||||||
|
.default_str = "default",
|
||||||
|
.flags = OPTIONS_TABLE_IS_STYLE,
|
||||||
|
.separator = ",",
|
||||||
|
.text = "Style of the current pane in the status line."
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "pane-status-style",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.scope = OPTIONS_TABLE_WINDOW,
|
||||||
|
.default_str = "default",
|
||||||
|
.flags = OPTIONS_TABLE_IS_STYLE,
|
||||||
|
.separator = ",",
|
||||||
|
.text = "Style of panes in the status line, except the current "
|
||||||
|
"pane."
|
||||||
|
},
|
||||||
|
|
||||||
{ .name = "prompt-cursor-colour",
|
{ .name = "prompt-cursor-colour",
|
||||||
.type = OPTIONS_TABLE_COLOUR,
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
.scope = OPTIONS_TABLE_SESSION,
|
.scope = OPTIONS_TABLE_SESSION,
|
||||||
@@ -886,6 +955,25 @@ const struct options_table_entry options_table[] = {
|
|||||||
.text = "Style of the cursor when in the command prompt."
|
.text = "Style of the cursor when in the command prompt."
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ .name = "session-status-current-style",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.scope = OPTIONS_TABLE_WINDOW,
|
||||||
|
.default_str = "default",
|
||||||
|
.flags = OPTIONS_TABLE_IS_STYLE,
|
||||||
|
.separator = ",",
|
||||||
|
.text = "Style of the current session in the status line."
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "session-status-style",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.scope = OPTIONS_TABLE_WINDOW,
|
||||||
|
.default_str = "default",
|
||||||
|
.flags = OPTIONS_TABLE_IS_STYLE,
|
||||||
|
.separator = ",",
|
||||||
|
.text = "Style of sessions in the status line, except the current "
|
||||||
|
"session."
|
||||||
|
},
|
||||||
|
|
||||||
{ .name = "update-environment",
|
{ .name = "update-environment",
|
||||||
.type = OPTIONS_TABLE_STRING,
|
.type = OPTIONS_TABLE_STRING,
|
||||||
.scope = OPTIONS_TABLE_SESSION,
|
.scope = OPTIONS_TABLE_SESSION,
|
||||||
|
2
popup.c
2
popup.c
@@ -348,6 +348,8 @@ popup_make_pane(struct popup_data *pd, enum layout_type type)
|
|||||||
window_unzoom(w, 1);
|
window_unzoom(w, 1);
|
||||||
|
|
||||||
lc = layout_split_pane(wp, type, -1, 0);
|
lc = layout_split_pane(wp, type, -1, 0);
|
||||||
|
if (lc == NULL)
|
||||||
|
return;
|
||||||
hlimit = options_get_number(s->options, "history-limit");
|
hlimit = options_get_number(s->options, "history-limit");
|
||||||
new_wp = window_add_pane(wp->window, NULL, hlimit, 0);
|
new_wp = window_add_pane(wp->window, NULL, hlimit, 0);
|
||||||
layout_assign_pane(lc, new_wp, 0);
|
layout_assign_pane(lc, new_wp, 0);
|
||||||
|
@@ -87,6 +87,10 @@ screen_redraw_border_set(struct window *w, struct window_pane *wp,
|
|||||||
gc->attr &= ~GRID_ATTR_CHARSET;
|
gc->attr &= ~GRID_ATTR_CHARSET;
|
||||||
utf8_set(&gc->data, SIMPLE_BORDERS[cell_type]);
|
utf8_set(&gc->data, SIMPLE_BORDERS[cell_type]);
|
||||||
break;
|
break;
|
||||||
|
case PANE_LINES_SPACES:
|
||||||
|
gc->attr &= ~GRID_ATTR_CHARSET;
|
||||||
|
utf8_set(&gc->data, ' ');
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
gc->attr |= GRID_ATTR_CHARSET;
|
gc->attr |= GRID_ATTR_CHARSET;
|
||||||
utf8_set(&gc->data, CELL_BORDERS[cell_type]);
|
utf8_set(&gc->data, CELL_BORDERS[cell_type]);
|
||||||
|
@@ -880,8 +880,7 @@ have_event:
|
|||||||
m->wp = wp->id;
|
m->wp = wp->id;
|
||||||
m->w = wp->window->id;
|
m->w = wp->window->id;
|
||||||
}
|
}
|
||||||
} else
|
}
|
||||||
m->wp = -1;
|
|
||||||
|
|
||||||
/* Stop dragging if needed. */
|
/* Stop dragging if needed. */
|
||||||
if (type != DRAG &&
|
if (type != DRAG &&
|
||||||
|
1
server.c
1
server.c
@@ -70,6 +70,7 @@ server_set_marked(struct session *s, struct winlink *wl, struct window_pane *wp)
|
|||||||
cmd_find_clear_state(&marked_pane, 0);
|
cmd_find_clear_state(&marked_pane, 0);
|
||||||
marked_pane.s = s;
|
marked_pane.s = s;
|
||||||
marked_pane.wl = wl;
|
marked_pane.wl = wl;
|
||||||
|
if (wl != NULL)
|
||||||
marked_pane.w = wl->window;
|
marked_pane.w = wl->window;
|
||||||
marked_pane.wp = wp;
|
marked_pane.wp = wp;
|
||||||
}
|
}
|
||||||
|
34
tmux.1
34
tmux.1
@@ -5080,6 +5080,8 @@ heavy lines using UTF-8 characters
|
|||||||
simple ASCII characters
|
simple ASCII characters
|
||||||
.It number
|
.It number
|
||||||
the pane number
|
the pane number
|
||||||
|
.It spaces
|
||||||
|
space characters
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
.Ql double
|
.Ql double
|
||||||
@@ -5188,6 +5190,38 @@ Other attributes are ignored.
|
|||||||
.Xc
|
.Xc
|
||||||
Sets which side of the pane to display pane scrollbars on.
|
Sets which side of the pane to display pane scrollbars on.
|
||||||
.Pp
|
.Pp
|
||||||
|
.It Ic pane-status-current-style Ar style
|
||||||
|
Set status line style for the currently active pane.
|
||||||
|
For how to specify
|
||||||
|
.Ar style ,
|
||||||
|
see the
|
||||||
|
.Sx STYLES
|
||||||
|
section.
|
||||||
|
.Pp
|
||||||
|
.It Ic pane-status-style Ar style
|
||||||
|
Set status line style for a single pane.
|
||||||
|
For how to specify
|
||||||
|
.Ar style ,
|
||||||
|
see the
|
||||||
|
.Sx STYLES
|
||||||
|
section.
|
||||||
|
.Pp
|
||||||
|
.It Ic session-status-current-style Ar style
|
||||||
|
Set status line style for the currently active session.
|
||||||
|
For how to specify
|
||||||
|
.Ar style ,
|
||||||
|
see the
|
||||||
|
.Sx STYLES
|
||||||
|
section.
|
||||||
|
.Pp
|
||||||
|
.It Ic session-status-style Ar style
|
||||||
|
Set status line style for a single session.
|
||||||
|
For how to specify
|
||||||
|
.Ar style ,
|
||||||
|
see the
|
||||||
|
.Sx STYLES
|
||||||
|
section.
|
||||||
|
.Pp
|
||||||
.It Ic window-status-activity-style Ar style
|
.It Ic window-status-activity-style Ar style
|
||||||
Set status line style for windows with an activity alert.
|
Set status line style for windows with an activity alert.
|
||||||
For how to specify
|
For how to specify
|
||||||
|
3
tmux.h
3
tmux.h
@@ -1025,7 +1025,8 @@ enum pane_lines {
|
|||||||
PANE_LINES_DOUBLE,
|
PANE_LINES_DOUBLE,
|
||||||
PANE_LINES_HEAVY,
|
PANE_LINES_HEAVY,
|
||||||
PANE_LINES_SIMPLE,
|
PANE_LINES_SIMPLE,
|
||||||
PANE_LINES_NUMBER
|
PANE_LINES_NUMBER,
|
||||||
|
PANE_LINES_SPACES
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Pane border indicator option. */
|
/* Pane border indicator option. */
|
||||||
|
@@ -859,9 +859,11 @@ window_tree_search(__unused void *modedata, void *itemdata, const char *ss)
|
|||||||
case WINDOW_TREE_PANE:
|
case WINDOW_TREE_PANE:
|
||||||
if (s == NULL || wl == NULL || wp == NULL)
|
if (s == NULL || wl == NULL || wp == NULL)
|
||||||
break;
|
break;
|
||||||
cmd = osdep_get_name(wp->fd, wp->tty);
|
cmd = get_proc_name(wp->fd, wp->tty);
|
||||||
if (cmd == NULL || *cmd == '\0')
|
if (cmd == NULL || *cmd == '\0') {
|
||||||
|
free(cmd);
|
||||||
return (0);
|
return (0);
|
||||||
|
}
|
||||||
retval = (strstr(cmd, ss) != NULL);
|
retval = (strstr(cmd, ss) != NULL);
|
||||||
free(cmd);
|
free(cmd);
|
||||||
return (retval);
|
return (retval);
|
||||||
|
Reference in New Issue
Block a user