mirror of
https://github.com/tmux/tmux.git
synced 2026-06-20 09:25:12 +00:00
Merge branch 'obsd-master'
This commit is contained in:
@@ -58,9 +58,14 @@ cmd_break_pane_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
struct session *dst_s = target->s;
|
struct session *dst_s = target->s;
|
||||||
struct window_pane *wp = source->wp;
|
struct window_pane *wp = source->wp;
|
||||||
struct window *w = wl->window;
|
struct window *w = wl->window;
|
||||||
char *name, *cause, *cp;
|
char *newname, *cause, *cp;
|
||||||
int idx = target->idx, before;
|
int idx = target->idx, before;
|
||||||
const char *template;
|
const char *template, *name = args_get(args, 'n');
|
||||||
|
|
||||||
|
if (name != NULL && !check_name(name, WINDOW_NAME_FORBID)) {
|
||||||
|
cmdq_error(item, "invalid window name: %s", name);
|
||||||
|
return (CMD_RETURN_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
before = args_has(args, 'b');
|
before = args_has(args, 'b');
|
||||||
if (args_has(args, 'a') || before) {
|
if (args_has(args, 'a') || before) {
|
||||||
@@ -80,8 +85,8 @@ cmd_break_pane_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
free(cause);
|
free(cause);
|
||||||
return (CMD_RETURN_ERROR);
|
return (CMD_RETURN_ERROR);
|
||||||
}
|
}
|
||||||
if (args_has(args, 'n')) {
|
if (name != NULL) {
|
||||||
window_set_name(w, args_get(args, 'n'));
|
window_set_name(w, name, WINDOW_NAME_FORBID);
|
||||||
options_set_number(w->options, "automatic-rename", 0);
|
options_set_number(w->options, "automatic-rename", 0);
|
||||||
}
|
}
|
||||||
server_unlink_window(src_s, wl);
|
server_unlink_window(src_s, wl);
|
||||||
@@ -109,12 +114,12 @@ cmd_break_pane_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
w->active = wp;
|
w->active = wp;
|
||||||
w->latest = tc;
|
w->latest = tc;
|
||||||
|
|
||||||
if (!args_has(args, 'n')) {
|
if (name != NULL) {
|
||||||
name = default_window_name(w);
|
newname = default_window_name(w);
|
||||||
window_set_name(w, name);
|
window_set_name(w, newname, WINDOW_NAME_FORBID);
|
||||||
free(name);
|
free(newname);
|
||||||
} else {
|
} else {
|
||||||
window_set_name(w, args_get(args, 'n'));
|
window_set_name(w, name, 0);
|
||||||
options_set_number(w->options, "automatic-rename", 0);
|
options_set_number(w->options, "automatic-rename", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ cmd_display_panes_draw(struct client *c, __unused void *data,
|
|||||||
log_debug("%s: %s @%u", __func__, c->name, w->id);
|
log_debug("%s: %s @%u", __func__, c->name, w->id);
|
||||||
|
|
||||||
TAILQ_FOREACH(wp, &w->panes, entry) {
|
TAILQ_FOREACH(wp, &w->panes, entry) {
|
||||||
if (window_pane_visible(wp))
|
if (window_pane_is_visible(wp))
|
||||||
cmd_display_panes_draw_pane(ctx, wp);
|
cmd_display_panes_draw_pane(ctx, wp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,8 +77,8 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
struct termios tio, *tiop;
|
struct termios tio, *tiop;
|
||||||
struct session_group *sg = NULL;
|
struct session_group *sg = NULL;
|
||||||
const char *errstr, *template, *group, *tmp;
|
const char *errstr, *template, *group, *tmp;
|
||||||
char *cause, *cwd = NULL, *cp, *newname = NULL;
|
char *cause, *cwd = NULL, *cp, *ename;
|
||||||
char *name, *prefix = NULL;
|
char *wname = NULL, *sname = NULL, *prefix = NULL;
|
||||||
int detached, already_attached, is_control = 0;
|
int detached, already_attached, is_control = 0;
|
||||||
u_int sx, sy, dsx, dsy, count = args_count(args);
|
u_int sx, sy, dsx, dsy, count = args_count(args);
|
||||||
struct spawn_context sc = { 0 };
|
struct spawn_context sc = { 0 };
|
||||||
@@ -99,20 +99,29 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
return (CMD_RETURN_ERROR);
|
return (CMD_RETURN_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp = args_get(args, 's');
|
if ((tmp = args_get(args, 'n')) != NULL) {
|
||||||
if (tmp != NULL) {
|
ename = format_single(item, tmp, c, NULL, NULL, NULL);
|
||||||
name = format_single(item, tmp, c, NULL, NULL, NULL);
|
if (!check_name(ename, WINDOW_NAME_FORBID)) {
|
||||||
newname = clean_name(name, "#:.");
|
cmdq_error(item, "invalid window name: %s", ename);
|
||||||
if (newname == NULL) {
|
free(ename);
|
||||||
cmdq_error(item, "invalid session: %s", name);
|
|
||||||
free(name);
|
|
||||||
return (CMD_RETURN_ERROR);
|
return (CMD_RETURN_ERROR);
|
||||||
}
|
}
|
||||||
free(name);
|
wname = clean_name(ename, WINDOW_NAME_FORBID);
|
||||||
|
free(ename);
|
||||||
|
}
|
||||||
|
if ((tmp = args_get(args, 's')) != NULL) {
|
||||||
|
ename = format_single(item, tmp, c, NULL, NULL, NULL);
|
||||||
|
if (!check_name(ename, SESSION_NAME_FORBID)) {
|
||||||
|
cmdq_error(item, "invalid session name: %s", ename);
|
||||||
|
free(ename);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
sname = clean_name(ename, SESSION_NAME_FORBID);
|
||||||
|
free(ename);
|
||||||
}
|
}
|
||||||
if (args_has(args, 'A')) {
|
if (args_has(args, 'A')) {
|
||||||
if (newname != NULL)
|
if (sname != NULL)
|
||||||
as = session_find(newname);
|
as = session_find(sname);
|
||||||
else
|
else
|
||||||
as = target->s;
|
as = target->s;
|
||||||
if (as != NULL) {
|
if (as != NULL) {
|
||||||
@@ -120,12 +129,13 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
args_has(args, 'D'), args_has(args, 'X'), 0,
|
args_has(args, 'D'), args_has(args, 'X'), 0,
|
||||||
args_get(args, 'c'), args_has(args, 'E'),
|
args_get(args, 'c'), args_has(args, 'E'),
|
||||||
args_get(args, 'f'));
|
args_get(args, 'f'));
|
||||||
free(newname);
|
free(wname);
|
||||||
|
free(sname);
|
||||||
return (retval);
|
return (retval);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (newname != NULL && session_find(newname) != NULL) {
|
if (sname != NULL && session_find(sname) != NULL) {
|
||||||
cmdq_error(item, "duplicate session: %s", newname);
|
cmdq_error(item, "duplicate session: %s", sname);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,12 +152,12 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
else if (groupwith != NULL)
|
else if (groupwith != NULL)
|
||||||
prefix = xstrdup(groupwith->name);
|
prefix = xstrdup(groupwith->name);
|
||||||
else {
|
else {
|
||||||
prefix = clean_name(group, "#:.");
|
if (!check_name(group, SESSION_NAME_FORBID)) {
|
||||||
if (prefix == NULL) {
|
cmdq_error(item,
|
||||||
cmdq_error(item, "invalid session group: %s",
|
"invalid session group name: %s", group);
|
||||||
group);
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
prefix = clean_name(group, SESSION_NAME_FORBID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,7 +286,7 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
environ_put(env, av->string, 0);
|
environ_put(env, av->string, 0);
|
||||||
av = args_next_value(av);
|
av = args_next_value(av);
|
||||||
}
|
}
|
||||||
s = session_create(prefix, newname, cwd, env, oo, tiop);
|
s = session_create(prefix, sname, cwd, env, oo, tiop);
|
||||||
|
|
||||||
/* Spawn the initial window. */
|
/* Spawn the initial window. */
|
||||||
sc.item = item;
|
sc.item = item;
|
||||||
@@ -284,7 +294,7 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
if (!detached)
|
if (!detached)
|
||||||
sc.tc = c;
|
sc.tc = c;
|
||||||
|
|
||||||
sc.name = args_get(args, 'n');
|
sc.name = wname;
|
||||||
args_to_vector(args, &sc.argc, &sc.argv);
|
args_to_vector(args, &sc.argc, &sc.argv);
|
||||||
|
|
||||||
sc.idx = -1;
|
sc.idx = -1;
|
||||||
@@ -357,7 +367,8 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
if (sc.argv != NULL)
|
if (sc.argv != NULL)
|
||||||
cmd_free_argv(sc.argc, sc.argv);
|
cmd_free_argv(sc.argc, sc.argv);
|
||||||
free(cwd);
|
free(cwd);
|
||||||
free(newname);
|
free(wname);
|
||||||
|
free(sname);
|
||||||
free(prefix);
|
free(prefix);
|
||||||
return (CMD_RETURN_NORMAL);
|
return (CMD_RETURN_NORMAL);
|
||||||
|
|
||||||
@@ -365,7 +376,8 @@ fail:
|
|||||||
if (sc.argv != NULL)
|
if (sc.argv != NULL)
|
||||||
cmd_free_argv(sc.argc, sc.argv);
|
cmd_free_argv(sc.argc, sc.argv);
|
||||||
free(cwd);
|
free(cwd);
|
||||||
free(newname);
|
free(wname);
|
||||||
|
free(sname);
|
||||||
free(prefix);
|
free(prefix);
|
||||||
return (CMD_RETURN_ERROR);
|
return (CMD_RETURN_ERROR);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
struct session *s = target->s;
|
struct session *s = target->s;
|
||||||
struct winlink *wl = target->wl, *new_wl = NULL;
|
struct winlink *wl = target->wl, *new_wl = NULL;
|
||||||
int idx = target->idx, before;
|
int idx = target->idx, before;
|
||||||
char *cause = NULL, *cp, *expanded;
|
char *cause = NULL, *cp, *expanded, *wname;
|
||||||
const char *template, *name;
|
const char *template, *name;
|
||||||
struct cmd_find_state fs;
|
struct cmd_find_state fs;
|
||||||
struct args_value *av;
|
struct args_value *av;
|
||||||
@@ -71,8 +71,18 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
* name already exists, select it.
|
* name already exists, select it.
|
||||||
*/
|
*/
|
||||||
name = args_get(args, 'n');
|
name = args_get(args, 'n');
|
||||||
if (args_has(args, 'S') && name != NULL && target->idx == -1) {
|
if (name != NULL) {
|
||||||
expanded = format_single(item, name, c, s, NULL, NULL);
|
expanded = format_single(item, name, c, s, NULL, NULL);
|
||||||
|
if (!check_name(expanded, WINDOW_NAME_FORBID)) {
|
||||||
|
cmdq_error(item, "invalid window name: %s", expanded);
|
||||||
|
free(expanded);
|
||||||
|
return (CMD_RETURN_ERROR);
|
||||||
|
}
|
||||||
|
wname = clean_name(expanded, WINDOW_NAME_FORBID);
|
||||||
|
free(expanded);
|
||||||
|
}
|
||||||
|
if (args_has(args, 'S') && wname != NULL && target->idx == -1) {
|
||||||
|
expanded = format_single(item, wname, c, s, NULL, NULL);
|
||||||
RB_FOREACH(wl, winlinks, &s->windows) {
|
RB_FOREACH(wl, winlinks, &s->windows) {
|
||||||
if (strcmp(wl->window->name, expanded) != 0)
|
if (strcmp(wl->window->name, expanded) != 0)
|
||||||
continue;
|
continue;
|
||||||
@@ -80,12 +90,14 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
new_wl = wl;
|
new_wl = wl;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
cmdq_error(item, "multiple windows named %s", name);
|
cmdq_error(item, "multiple windows named %s", wname);
|
||||||
|
free(wname);
|
||||||
free(expanded);
|
free(expanded);
|
||||||
return (CMD_RETURN_ERROR);
|
return (CMD_RETURN_ERROR);
|
||||||
}
|
}
|
||||||
free(expanded);
|
free(expanded);
|
||||||
if (new_wl != NULL) {
|
if (new_wl != NULL) {
|
||||||
|
free(wname);
|
||||||
if (args_has(args, 'd'))
|
if (args_has(args, 'd'))
|
||||||
return (CMD_RETURN_NORMAL);
|
return (CMD_RETURN_NORMAL);
|
||||||
if (session_set_current(s, new_wl) == 0)
|
if (session_set_current(s, new_wl) == 0)
|
||||||
@@ -108,7 +120,7 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
sc.s = s;
|
sc.s = s;
|
||||||
sc.tc = tc;
|
sc.tc = tc;
|
||||||
|
|
||||||
sc.name = args_get(args, 'n');
|
sc.name = wname;
|
||||||
args_to_vector(args, &sc.argc, &sc.argv);
|
args_to_vector(args, &sc.argc, &sc.argv);
|
||||||
sc.environ = environ_create();
|
sc.environ = environ_create();
|
||||||
|
|
||||||
@@ -130,10 +142,7 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
if ((new_wl = spawn_window(&sc, &cause)) == NULL) {
|
if ((new_wl = spawn_window(&sc, &cause)) == NULL) {
|
||||||
cmdq_error(item, "create window failed: %s", cause);
|
cmdq_error(item, "create window failed: %s", cause);
|
||||||
free(cause);
|
free(cause);
|
||||||
if (sc.argv != NULL)
|
goto fail;
|
||||||
cmd_free_argv(sc.argc, sc.argv);
|
|
||||||
environ_free(sc.environ);
|
|
||||||
return (CMD_RETURN_ERROR);
|
|
||||||
}
|
}
|
||||||
if (!args_has(args, 'd') || new_wl == s->curw) {
|
if (!args_has(args, 'd') || new_wl == s->curw) {
|
||||||
cmd_find_from_winlink(current, new_wl, 0);
|
cmd_find_from_winlink(current, new_wl, 0);
|
||||||
@@ -156,5 +165,13 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
if (sc.argv != NULL)
|
if (sc.argv != NULL)
|
||||||
cmd_free_argv(sc.argc, sc.argv);
|
cmd_free_argv(sc.argc, sc.argv);
|
||||||
environ_free(sc.environ);
|
environ_free(sc.environ);
|
||||||
|
free(wname);
|
||||||
return (CMD_RETURN_NORMAL);
|
return (CMD_RETURN_NORMAL);
|
||||||
|
|
||||||
|
fail:
|
||||||
|
if (sc.argv != NULL)
|
||||||
|
cmd_free_argv(sc.argc, sc.argv);
|
||||||
|
environ_free(sc.environ);
|
||||||
|
free(wname);
|
||||||
|
return (CMD_RETURN_ERROR);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,12 +52,12 @@ cmd_rename_session_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
char *newname, *tmp;
|
char *newname, *tmp;
|
||||||
|
|
||||||
tmp = format_single_from_target(item, args_string(args, 0));
|
tmp = format_single_from_target(item, args_string(args, 0));
|
||||||
newname = clean_name(tmp, "#:.");
|
if (!check_name(tmp, SESSION_NAME_FORBID)) {
|
||||||
if (newname == NULL) {
|
cmdq_error(item, "invalid session name: %s", tmp);
|
||||||
cmdq_error(item, "invalid session: %s", tmp);
|
|
||||||
free(tmp);
|
free(tmp);
|
||||||
return (CMD_RETURN_ERROR);
|
return (CMD_RETURN_ERROR);
|
||||||
}
|
}
|
||||||
|
newname = clean_name(tmp, SESSION_NAME_FORBID);
|
||||||
free(tmp);
|
free(tmp);
|
||||||
if (strcmp(newname, s->name) == 0) {
|
if (strcmp(newname, s->name) == 0) {
|
||||||
free(newname);
|
free(newname);
|
||||||
|
|||||||
@@ -48,15 +48,21 @@ cmd_rename_window_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
struct args *args = cmd_get_args(self);
|
struct args *args = cmd_get_args(self);
|
||||||
struct cmd_find_state *target = cmdq_get_target(item);
|
struct cmd_find_state *target = cmdq_get_target(item);
|
||||||
struct winlink *wl = target->wl;
|
struct winlink *wl = target->wl;
|
||||||
char *newname;
|
char *name;
|
||||||
|
|
||||||
newname = format_single_from_target(item, args_string(args, 0));
|
name = format_single_from_target(item, args_string(args, 0));
|
||||||
window_set_name(wl->window, newname);
|
if (!check_name(name, WINDOW_NAME_FORBID)) {
|
||||||
|
cmdq_error(item, "invalid window name: %s", name);
|
||||||
|
free(name);
|
||||||
|
return (CMD_RETURN_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
window_set_name(wl->window, name, WINDOW_NAME_FORBID);
|
||||||
options_set_number(wl->window->options, "automatic-rename", 0);
|
options_set_number(wl->window->options, "automatic-rename", 0);
|
||||||
|
free(name);
|
||||||
|
|
||||||
server_redraw_window_borders(wl->window);
|
server_redraw_window_borders(wl->window);
|
||||||
server_status_window(wl->window);
|
server_status_window(wl->window);
|
||||||
free(newname);
|
|
||||||
|
|
||||||
return (CMD_RETURN_NORMAL);
|
return (CMD_RETURN_NORMAL);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (args_has(args, 'm') || args_has(args, 'M')) {
|
if (args_has(args, 'm') || args_has(args, 'M')) {
|
||||||
if (args_has(args, 'm') && !window_pane_visible(wp))
|
if (args_has(args, 'm') && !window_pane_is_visible(wp))
|
||||||
return (CMD_RETURN_NORMAL);
|
return (CMD_RETURN_NORMAL);
|
||||||
if (server_check_marked())
|
if (server_check_marked())
|
||||||
lastwp = marked_pane.wp;
|
lastwp = marked_pane.wp;
|
||||||
@@ -217,7 +217,7 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
|
|
||||||
if (args_has(args, 'T')) {
|
if (args_has(args, 'T')) {
|
||||||
title = format_single_from_target(item, args_get(args, 'T'));
|
title = format_single_from_target(item, args_get(args, 'T'));
|
||||||
if (screen_set_title(&wp->base, title)) {
|
if (screen_set_title(&wp->base, title, 0)) {
|
||||||
notify_pane("pane-title-changed", wp);
|
notify_pane("pane-title-changed", wp);
|
||||||
server_redraw_window_borders(wp->window);
|
server_redraw_window_borders(wp->window);
|
||||||
server_status_window(wp->window);
|
server_status_window(wp->window);
|
||||||
|
|||||||
@@ -213,7 +213,7 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
}
|
}
|
||||||
if (args_has(args, 'T')) {
|
if (args_has(args, 'T')) {
|
||||||
title = format_single_from_target(item, args_get(args, 'T'));
|
title = format_single_from_target(item, args_get(args, 'T'));
|
||||||
screen_set_title(&new_wp->base, title);
|
screen_set_title(&new_wp->base, title, 0);
|
||||||
notify_pane("pane-title-changed", new_wp);
|
notify_pane("pane-title-changed", new_wp);
|
||||||
free(title);
|
free(title);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -806,7 +806,7 @@ input_key_mouse(struct window_pane *wp, struct mouse_event *m)
|
|||||||
return;
|
return;
|
||||||
if (cmd_mouse_at(wp, m, &x, &y, 0) != 0)
|
if (cmd_mouse_at(wp, m, &x, &y, 0) != 0)
|
||||||
return;
|
return;
|
||||||
if (!window_pane_visible(wp))
|
if (!window_pane_is_visible(wp))
|
||||||
return;
|
return;
|
||||||
if (!input_key_get_mouse(s, m, x, y, &buf, &len))
|
if (!input_key_get_mouse(s, m, x, y, &buf, &len))
|
||||||
return;
|
return;
|
||||||
|
|||||||
10
input.c
10
input.c
@@ -2701,7 +2701,7 @@ input_exit_osc(struct input_ctx *ictx)
|
|||||||
case 2:
|
case 2:
|
||||||
if (wp != NULL &&
|
if (wp != NULL &&
|
||||||
options_get_number(wp->options, "allow-set-title") &&
|
options_get_number(wp->options, "allow-set-title") &&
|
||||||
screen_set_title(sctx->s, p)) {
|
screen_set_title(sctx->s, p, 1)) {
|
||||||
notify_pane("pane-title-changed", wp);
|
notify_pane("pane-title-changed", wp);
|
||||||
server_redraw_window_borders(wp->window);
|
server_redraw_window_borders(wp->window);
|
||||||
server_status_window(wp->window);
|
server_status_window(wp->window);
|
||||||
@@ -2711,7 +2711,7 @@ input_exit_osc(struct input_ctx *ictx)
|
|||||||
input_osc_4(ictx, p);
|
input_osc_4(ictx, p);
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
if (screen_set_path(sctx->s, p) && wp != NULL) {
|
if (wp != NULL && screen_set_path(sctx->s, p, 1)) {
|
||||||
server_redraw_window_borders(wp->window);
|
server_redraw_window_borders(wp->window);
|
||||||
server_status_window(wp->window);
|
server_status_window(wp->window);
|
||||||
}
|
}
|
||||||
@@ -2779,7 +2779,7 @@ input_exit_apc(struct input_ctx *ictx)
|
|||||||
|
|
||||||
if (wp != NULL &&
|
if (wp != NULL &&
|
||||||
options_get_number(wp->options, "allow-set-title") &&
|
options_get_number(wp->options, "allow-set-title") &&
|
||||||
screen_set_title(sctx->s, ictx->input_buf)) {
|
screen_set_title(sctx->s, ictx->input_buf, 1)) {
|
||||||
notify_pane("pane-title-changed", wp);
|
notify_pane("pane-title-changed", wp);
|
||||||
server_redraw_window_borders(wp->window);
|
server_redraw_window_borders(wp->window);
|
||||||
server_status_window(wp->window);
|
server_status_window(wp->window);
|
||||||
@@ -2822,10 +2822,10 @@ input_exit_rename(struct input_ctx *ictx)
|
|||||||
if (o != NULL)
|
if (o != NULL)
|
||||||
options_remove_or_default(o, -1, NULL);
|
options_remove_or_default(o, -1, NULL);
|
||||||
if (!options_get_number(w->options, "automatic-rename"))
|
if (!options_get_number(w->options, "automatic-rename"))
|
||||||
window_set_name(w, "");
|
window_set_name(w, "", WINDOW_NAME_FORBID_EXT);
|
||||||
} else {
|
} else {
|
||||||
options_set_number(w->options, "automatic-rename", 0);
|
options_set_number(w->options, "automatic-rename", 0);
|
||||||
window_set_name(w, ictx->input_buf);
|
window_set_name(w, ictx->input_buf, WINDOW_NAME_FORBID_EXT);
|
||||||
}
|
}
|
||||||
server_redraw_window_borders(w);
|
server_redraw_window_borders(w);
|
||||||
server_status_window(w);
|
server_status_window(w);
|
||||||
|
|||||||
4
names.c
4
names.c
@@ -95,7 +95,7 @@ check_window_name(struct window *w)
|
|||||||
name = format_window_name(w);
|
name = format_window_name(w);
|
||||||
if (strcmp(name, w->name) != 0) {
|
if (strcmp(name, w->name) != 0) {
|
||||||
log_debug("@%u new name %s (was %s)", w->id, name, w->name);
|
log_debug("@%u new name %s (was %s)", w->id, name, w->name);
|
||||||
window_set_name(w, name);
|
window_set_name(w, name, WINDOW_NAME_FORBID_EXT);
|
||||||
server_redraw_window_borders(w);
|
server_redraw_window_borders(w);
|
||||||
server_status_window(w);
|
server_status_window(w);
|
||||||
} else
|
} else
|
||||||
@@ -166,7 +166,7 @@ parse_window_name(const char *in)
|
|||||||
|
|
||||||
if (*name == '/')
|
if (*name == '/')
|
||||||
name = basename(name);
|
name = basename(name);
|
||||||
name = clean_name(name, "#");
|
name = clean_name(name, WINDOW_NAME_FORBID);
|
||||||
free(copy);
|
free(copy);
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
return (xstrdup(""));
|
return (xstrdup(""));
|
||||||
|
|||||||
2
paste.c
2
paste.c
@@ -176,7 +176,6 @@ paste_add(const char *prefix, char *data, size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pb = xmalloc(sizeof *pb);
|
pb = xmalloc(sizeof *pb);
|
||||||
|
|
||||||
pb->name = NULL;
|
pb->name = NULL;
|
||||||
do {
|
do {
|
||||||
free(pb->name);
|
free(pb->name);
|
||||||
@@ -296,7 +295,6 @@ paste_set(char *data, size_t size, const char *name, char **cause)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pb = xmalloc(sizeof *pb);
|
pb = xmalloc(sizeof *pb);
|
||||||
|
|
||||||
pb->name = newname;
|
pb->name = newname;
|
||||||
|
|
||||||
pb->data = data;
|
pb->data = data;
|
||||||
|
|||||||
2
popup.c
2
popup.c
@@ -437,7 +437,7 @@ popup_make_pane(struct popup_data *pd, enum layout_type type)
|
|||||||
pd->job = NULL;
|
pd->job = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
screen_set_title(&pd->s, new_wp->base.title);
|
screen_set_title(&pd->s, new_wp->base.title, 0);
|
||||||
screen_free(&new_wp->base);
|
screen_free(&new_wp->base);
|
||||||
memcpy(&new_wp->base, &pd->s, sizeof wp->base);
|
memcpy(&new_wp->base, &pd->s, sizeof wp->base);
|
||||||
screen_resize(&new_wp->base, new_wp->sx, new_wp->sy, 1);
|
screen_resize(&new_wp->base, new_wp->sx, new_wp->sy, 1);
|
||||||
|
|||||||
@@ -316,7 +316,7 @@ screen_redraw_cell_border(struct screen_redraw_ctx *ctx, struct window_pane *wp,
|
|||||||
* single z-index.
|
* single z-index.
|
||||||
*/
|
*/
|
||||||
TAILQ_FOREACH(wp2, &w->z_index, zentry) {
|
TAILQ_FOREACH(wp2, &w->z_index, zentry) {
|
||||||
if (!window_pane_visible(wp2) || window_pane_is_floating(wp2))
|
if (!window_pane_is_visible(wp2) || window_pane_is_floating(wp2))
|
||||||
continue;
|
continue;
|
||||||
n = screen_redraw_cell_border1(ctx, sb_pos, sb_w, wp2, px, py);
|
n = screen_redraw_cell_border1(ctx, sb_pos, sb_w, wp2, px, py);
|
||||||
if (n != -1)
|
if (n != -1)
|
||||||
@@ -493,7 +493,7 @@ screen_redraw_check_cell(struct screen_redraw_ctx *ctx, int px, int py,
|
|||||||
if (!window_pane_is_floating(wp))
|
if (!window_pane_is_floating(wp))
|
||||||
tiled_only = 1;
|
tiled_only = 1;
|
||||||
do { /* loop until back to wp == start */
|
do { /* loop until back to wp == start */
|
||||||
if (!window_pane_visible(wp))
|
if (!window_pane_is_visible(wp))
|
||||||
goto next;
|
goto next;
|
||||||
if (tiled_only && window_pane_is_floating(wp))
|
if (tiled_only && window_pane_is_floating(wp))
|
||||||
goto next;
|
goto next;
|
||||||
@@ -692,7 +692,7 @@ screen_redraw_draw_pane_status(struct screen_redraw_ctx *ctx)
|
|||||||
log_debug("%s: %s @%u", __func__, c->name, w->id);
|
log_debug("%s: %s @%u", __func__, c->name, w->id);
|
||||||
|
|
||||||
TAILQ_FOREACH(wp, &w->panes, entry) {
|
TAILQ_FOREACH(wp, &w->panes, entry) {
|
||||||
if (!window_pane_visible(wp))
|
if (!window_pane_is_visible(wp))
|
||||||
continue;
|
continue;
|
||||||
s = &wp->status_screen;
|
s = &wp->status_screen;
|
||||||
|
|
||||||
@@ -866,7 +866,7 @@ screen_redraw_pane(struct client *c, struct window_pane *wp,
|
|||||||
{
|
{
|
||||||
struct screen_redraw_ctx ctx;
|
struct screen_redraw_ctx ctx;
|
||||||
|
|
||||||
if (!window_pane_visible(wp))
|
if (!window_pane_is_visible(wp))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
screen_redraw_set_context(c, &ctx);
|
screen_redraw_set_context(c, &ctx);
|
||||||
@@ -1101,7 +1101,7 @@ screen_redraw_draw_panes(struct screen_redraw_ctx *ctx)
|
|||||||
log_debug("%s: %s @%u", __func__, c->name, w->id);
|
log_debug("%s: %s @%u", __func__, c->name, w->id);
|
||||||
|
|
||||||
TAILQ_FOREACH(wp, &w->panes, entry) {
|
TAILQ_FOREACH(wp, &w->panes, entry) {
|
||||||
if (window_pane_visible(wp))
|
if (window_pane_is_visible(wp))
|
||||||
screen_redraw_draw_pane(ctx, wp);
|
screen_redraw_draw_pane(ctx, wp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1221,7 +1221,7 @@ screen_redraw_get_visible_ranges(struct window_pane *base_wp, int px,
|
|||||||
bb = wp->yoff + (int)wp->sy;
|
bb = wp->yoff + (int)wp->sy;
|
||||||
}
|
}
|
||||||
if (!found_self ||
|
if (!found_self ||
|
||||||
!window_pane_visible(wp) ||
|
!window_pane_is_visible(wp) ||
|
||||||
py < tb ||
|
py < tb ||
|
||||||
py > bb)
|
py > bb)
|
||||||
continue;
|
continue;
|
||||||
@@ -1451,7 +1451,7 @@ screen_redraw_draw_pane_scrollbars(struct screen_redraw_ctx *ctx)
|
|||||||
|
|
||||||
TAILQ_FOREACH(wp, &w->panes, entry) {
|
TAILQ_FOREACH(wp, &w->panes, entry) {
|
||||||
if (window_pane_show_scrollbar(wp, ctx->pane_scrollbars) &&
|
if (window_pane_show_scrollbar(wp, ctx->pane_scrollbars) &&
|
||||||
window_pane_visible(wp))
|
window_pane_is_visible(wp))
|
||||||
screen_redraw_draw_pane_scrollbar(ctx, wp);
|
screen_redraw_draw_pane_scrollbar(ctx, wp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
14
screen.c
14
screen.c
@@ -245,11 +245,14 @@ screen_set_cursor_colour(struct screen *s, int colour)
|
|||||||
|
|
||||||
/* Set screen title. */
|
/* Set screen title. */
|
||||||
int
|
int
|
||||||
screen_set_title(struct screen *s, const char *title)
|
screen_set_title(struct screen *s, const char *title, int untrusted)
|
||||||
{
|
{
|
||||||
char *new_title;
|
char *new_title;
|
||||||
|
|
||||||
new_title = clean_name(title, "#");
|
if (untrusted)
|
||||||
|
new_title = clean_name(title, "#");
|
||||||
|
else
|
||||||
|
new_title = clean_name(title, "");
|
||||||
if (new_title == NULL)
|
if (new_title == NULL)
|
||||||
return (0);
|
return (0);
|
||||||
free(s->title);
|
free(s->title);
|
||||||
@@ -259,11 +262,14 @@ screen_set_title(struct screen *s, const char *title)
|
|||||||
|
|
||||||
/* Set screen path. */
|
/* Set screen path. */
|
||||||
int
|
int
|
||||||
screen_set_path(struct screen *s, const char *path)
|
screen_set_path(struct screen *s, const char *path, int untrusted)
|
||||||
{
|
{
|
||||||
char *new_path;
|
char *new_path;
|
||||||
|
|
||||||
new_path = clean_name(path, "#");
|
if (untrusted)
|
||||||
|
new_path = clean_name(path, "#");
|
||||||
|
else
|
||||||
|
new_path = clean_name(path, "");
|
||||||
if (new_path == NULL)
|
if (new_path == NULL)
|
||||||
return (0);
|
return (0);
|
||||||
free(s->path);
|
free(s->path);
|
||||||
|
|||||||
@@ -116,7 +116,6 @@ session_create(const char *prefix, const char *name, const char *cwd,
|
|||||||
s = xcalloc(1, sizeof *s);
|
s = xcalloc(1, sizeof *s);
|
||||||
s->references = 1;
|
s->references = 1;
|
||||||
s->flags = 0;
|
s->flags = 0;
|
||||||
|
|
||||||
s->cwd = xstrdup(cwd);
|
s->cwd = xstrdup(cwd);
|
||||||
|
|
||||||
TAILQ_INIT(&s->lastw);
|
TAILQ_INIT(&s->lastw);
|
||||||
|
|||||||
16
spawn.c
16
spawn.c
@@ -74,15 +74,12 @@ spawn_log(const char *from, struct spawn_context *sc)
|
|||||||
struct winlink *
|
struct winlink *
|
||||||
spawn_window(struct spawn_context *sc, char **cause)
|
spawn_window(struct spawn_context *sc, char **cause)
|
||||||
{
|
{
|
||||||
struct cmdq_item *item = sc->item;
|
|
||||||
struct client *c = cmdq_get_client(item);
|
|
||||||
struct session *s = sc->s;
|
struct session *s = sc->s;
|
||||||
struct window *w;
|
struct window *w;
|
||||||
struct window_pane *wp;
|
struct window_pane *wp;
|
||||||
struct winlink *wl;
|
struct winlink *wl;
|
||||||
int idx = sc->idx;
|
int idx = sc->idx;
|
||||||
u_int sx, sy, xpixel, ypixel;
|
u_int sx, sy, xpixel, ypixel;
|
||||||
char *name;
|
|
||||||
|
|
||||||
spawn_log(__func__, sc);
|
spawn_log(__func__, sc);
|
||||||
|
|
||||||
@@ -180,15 +177,12 @@ spawn_window(struct spawn_context *sc, char **cause)
|
|||||||
/* Set the name of the new window. */
|
/* Set the name of the new window. */
|
||||||
if (~sc->flags & SPAWN_RESPAWN) {
|
if (~sc->flags & SPAWN_RESPAWN) {
|
||||||
free(w->name);
|
free(w->name);
|
||||||
if (sc->name != NULL) {
|
if (sc->name == NULL || *sc->name == '\0')
|
||||||
name = format_single(item, sc->name, c, s, NULL, NULL);
|
|
||||||
w->name = clean_name(name, "#");
|
|
||||||
free(name);
|
|
||||||
if (w->name == NULL)
|
|
||||||
w->name = xstrdup("");
|
|
||||||
options_set_number(w->options, "automatic-rename", 0);
|
|
||||||
} else
|
|
||||||
w->name = default_window_name(w);
|
w->name = default_window_name(w);
|
||||||
|
else {
|
||||||
|
w->name = xstrdup(sc->name);
|
||||||
|
options_set_number(w->options, "automatic-rename", 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Switch to the new window if required. */
|
/* Switch to the new window if required. */
|
||||||
|
|||||||
19
tmux.c
19
tmux.c
@@ -298,6 +298,25 @@ clean_name(const char *name, const char* forbid)
|
|||||||
return (new_name);
|
return (new_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check a name given by a command: reject it if it is empty, not valid UTF-8,
|
||||||
|
* or contains a forbidden character. Other characters that clean_name would
|
||||||
|
* change (for example with utf8_stravis) are allowed and fixed silently.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
check_name(const char *name, const char *forbid)
|
||||||
|
{
|
||||||
|
const char *cp;
|
||||||
|
|
||||||
|
if (*name == '\0' || !utf8_isvalid(name))
|
||||||
|
return (0);
|
||||||
|
for (cp = name; *cp != '\0'; cp++) {
|
||||||
|
if (strchr(forbid, *cp) != NULL)
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
sig2name(int signo)
|
sig2name(int signo)
|
||||||
{
|
{
|
||||||
|
|||||||
15
tmux.h
15
tmux.h
@@ -96,6 +96,12 @@ struct winlink;
|
|||||||
#define TMUX_LOCK_CMD "lock -np"
|
#define TMUX_LOCK_CMD "lock -np"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Forbidden characters in names. */
|
||||||
|
#define WINDOW_NAME_FORBID ":."
|
||||||
|
#define WINDOW_NAME_FORBID_EXT ":.#"
|
||||||
|
#define SESSION_NAME_FORBID ":."
|
||||||
|
#define SESSION_NAME_FORBID_EXT ":.#"
|
||||||
|
|
||||||
/* Minimum and maximum layout cell size, NOT including border lines. */
|
/* Minimum and maximum layout cell size, NOT including border lines. */
|
||||||
#define PANE_MINIMUM 1
|
#define PANE_MINIMUM 1
|
||||||
#define PANE_MAXIMUM 10000
|
#define PANE_MAXIMUM 10000
|
||||||
@@ -2423,6 +2429,7 @@ void setblocking(int, int);
|
|||||||
char *shell_argv0(const char *, int);
|
char *shell_argv0(const char *, int);
|
||||||
uint64_t get_timer(void);
|
uint64_t get_timer(void);
|
||||||
char *clean_name(const char *, const char *);
|
char *clean_name(const char *, const char *);
|
||||||
|
int check_name(const char *, const char *);
|
||||||
const char *sig2name(int);
|
const char *sig2name(int);
|
||||||
const char *find_cwd(void);
|
const char *find_cwd(void);
|
||||||
const char *find_home(void);
|
const char *find_home(void);
|
||||||
@@ -3394,8 +3401,8 @@ void screen_reset_hyperlinks(struct screen *);
|
|||||||
void screen_set_default_cursor(struct screen *, struct options *);
|
void screen_set_default_cursor(struct screen *, struct options *);
|
||||||
void screen_set_cursor_style(u_int, enum screen_cursor_style *, int *);
|
void screen_set_cursor_style(u_int, enum screen_cursor_style *, int *);
|
||||||
void screen_set_cursor_colour(struct screen *, int);
|
void screen_set_cursor_colour(struct screen *, int);
|
||||||
int screen_set_title(struct screen *, const char *);
|
int screen_set_title(struct screen *, const char *, int);
|
||||||
int screen_set_path(struct screen *, const char *);
|
int screen_set_path(struct screen *, const char *, int);
|
||||||
void screen_push_title(struct screen *);
|
void screen_push_title(struct screen *);
|
||||||
void screen_pop_title(struct screen *);
|
void screen_pop_title(struct screen *);
|
||||||
void screen_set_progress_bar(struct screen *, enum progress_bar_state, int);
|
void screen_set_progress_bar(struct screen *, enum progress_bar_state, int);
|
||||||
@@ -3488,7 +3495,7 @@ int window_pane_key(struct window_pane *, struct client *,
|
|||||||
struct mouse_event *);
|
struct mouse_event *);
|
||||||
void window_pane_paste(struct window_pane *, key_code, char *,
|
void window_pane_paste(struct window_pane *, key_code, char *,
|
||||||
size_t);
|
size_t);
|
||||||
int window_pane_visible(struct window_pane *);
|
int window_pane_is_visible(struct window_pane *);
|
||||||
int window_pane_exited(struct window_pane *);
|
int window_pane_exited(struct window_pane *);
|
||||||
u_int window_pane_search(struct window_pane *, const char *, int,
|
u_int window_pane_search(struct window_pane *, const char *, int,
|
||||||
int);
|
int);
|
||||||
@@ -3502,7 +3509,7 @@ void window_pane_stack_push(struct window_panes *,
|
|||||||
struct window_pane *);
|
struct window_pane *);
|
||||||
void window_pane_stack_remove(struct window_panes *,
|
void window_pane_stack_remove(struct window_panes *,
|
||||||
struct window_pane *);
|
struct window_pane *);
|
||||||
void window_set_name(struct window *, const char *);
|
void window_set_name(struct window *, const char *, const char *);
|
||||||
void window_add_ref(struct window *, const char *);
|
void window_add_ref(struct window *, const char *);
|
||||||
void window_remove_ref(struct window *, const char *);
|
void window_remove_ref(struct window *, const char *);
|
||||||
void winlink_clear_flags(struct winlink *);
|
void winlink_clear_flags(struct winlink *);
|
||||||
|
|||||||
16
window.c
16
window.c
@@ -409,11 +409,11 @@ window_remove_ref(struct window *w, const char *from)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
window_set_name(struct window *w, const char *new_name)
|
window_set_name(struct window *w, const char *new_name, const char *forbid)
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
name = clean_name(new_name, "#");
|
name = clean_name(new_name, forbid);
|
||||||
if (name != NULL) {
|
if (name != NULL) {
|
||||||
free(w->name);
|
free(w->name);
|
||||||
w->name = name;
|
w->name = name;
|
||||||
@@ -642,7 +642,7 @@ window_get_active_at(struct window *w, u_int x, u_int y)
|
|||||||
* bottom border.
|
* bottom border.
|
||||||
*/
|
*/
|
||||||
TAILQ_FOREACH(wp, &w->z_index, zentry) {
|
TAILQ_FOREACH(wp, &w->z_index, zentry) {
|
||||||
if (!window_pane_visible(wp) ||
|
if (!window_pane_is_visible(wp) ||
|
||||||
window_pane_is_floating(wp))
|
window_pane_is_floating(wp))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -656,7 +656,7 @@ window_get_active_at(struct window *w, u_int x, u_int y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
TAILQ_FOREACH(wp, &w->z_index, zentry) {
|
TAILQ_FOREACH(wp, &w->z_index, zentry) {
|
||||||
if (!window_pane_visible(wp))
|
if (!window_pane_is_visible(wp))
|
||||||
continue;
|
continue;
|
||||||
window_pane_full_size_offset(wp, &xoff, &yoff, &sx, &sy);
|
window_pane_full_size_offset(wp, &xoff, &yoff, &sx, &sy);
|
||||||
if (!window_pane_is_floating(wp)) {
|
if (!window_pane_is_floating(wp)) {
|
||||||
@@ -1096,7 +1096,7 @@ window_pane_create(struct window *w, u_int sx, u_int sy, u_int hlimit)
|
|||||||
style_ranges_init(&wp->border_status_line.ranges);
|
style_ranges_init(&wp->border_status_line.ranges);
|
||||||
|
|
||||||
if (gethostname(host, sizeof host) == 0)
|
if (gethostname(host, sizeof host) == 0)
|
||||||
screen_set_title(&wp->base, host);
|
screen_set_title(&wp->base, host, 0);
|
||||||
|
|
||||||
return (wp);
|
return (wp);
|
||||||
}
|
}
|
||||||
@@ -1363,7 +1363,7 @@ window_pane_copy_paste(struct window_pane *wp, char *buf, size_t len)
|
|||||||
TAILQ_EMPTY(&loop->modes) &&
|
TAILQ_EMPTY(&loop->modes) &&
|
||||||
loop->fd != -1 &&
|
loop->fd != -1 &&
|
||||||
(~loop->flags & PANE_INPUTOFF) &&
|
(~loop->flags & PANE_INPUTOFF) &&
|
||||||
window_pane_visible(loop) &&
|
window_pane_is_visible(loop) &&
|
||||||
options_get_number(loop->options, "synchronize-panes")) {
|
options_get_number(loop->options, "synchronize-panes")) {
|
||||||
log_debug("%s: %.*s", __func__, (int)len, buf);
|
log_debug("%s: %.*s", __func__, (int)len, buf);
|
||||||
bufferevent_write(loop->event, buf, len);
|
bufferevent_write(loop->event, buf, len);
|
||||||
@@ -1381,7 +1381,7 @@ window_pane_copy_key(struct window_pane *wp, key_code key)
|
|||||||
TAILQ_EMPTY(&loop->modes) &&
|
TAILQ_EMPTY(&loop->modes) &&
|
||||||
loop->fd != -1 &&
|
loop->fd != -1 &&
|
||||||
(~loop->flags & PANE_INPUTOFF) &&
|
(~loop->flags & PANE_INPUTOFF) &&
|
||||||
window_pane_visible(loop) &&
|
window_pane_is_visible(loop) &&
|
||||||
options_get_number(loop->options, "synchronize-panes"))
|
options_get_number(loop->options, "synchronize-panes"))
|
||||||
input_key_pane(loop, key, NULL);
|
input_key_pane(loop, key, NULL);
|
||||||
}
|
}
|
||||||
@@ -1438,7 +1438,7 @@ window_pane_key(struct window_pane *wp, struct client *c, struct session *s,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
window_pane_visible(struct window_pane *wp)
|
window_pane_is_visible(struct window_pane *wp)
|
||||||
{
|
{
|
||||||
if (~wp->window->flags & WINDOW_ZOOMED)
|
if (~wp->window->flags & WINDOW_ZOOMED)
|
||||||
return (1);
|
return (1);
|
||||||
|
|||||||
Reference in New Issue
Block a user