Handle splitw -I correctly when used from an attached client, GitHub

issue 2917.
pull/2924/head
nicm 2021-10-07 07:52:13 +00:00
parent 5359b76619
commit 9574496333
3 changed files with 27 additions and 13 deletions

View File

@ -75,12 +75,16 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item)
if (args_has(args, 'I')) { if (args_has(args, 'I')) {
if (wp == NULL) if (wp == NULL)
return (CMD_RETURN_NORMAL); return (CMD_RETURN_NORMAL);
if (window_pane_start_input(wp, item, &cause) != 0) { switch (window_pane_start_input(wp, item, &cause)) {
case -1:
cmdq_error(item, "%s", cause); cmdq_error(item, "%s", cause);
free(cause); free(cause);
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);
case 1:
return (CMD_RETURN_NORMAL);
case 0:
return (CMD_RETURN_WAIT);
} }
return (CMD_RETURN_WAIT);
} }
if (args_has(args, 'F') && count != 0) { if (args_has(args, 'F') && count != 0) {

View File

@ -163,16 +163,22 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
environ_free(sc.environ); environ_free(sc.environ);
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);
} }
if (input && window_pane_start_input(new_wp, item, &cause) != 0) { if (input) {
server_client_remove_pane(new_wp); switch (window_pane_start_input(new_wp, item, &cause)) {
layout_close_pane(new_wp); case -1:
window_remove_pane(wp->window, new_wp); server_client_remove_pane(new_wp);
cmdq_error(item, "%s", cause); layout_close_pane(new_wp);
free(cause); window_remove_pane(wp->window, new_wp);
if (sc.argv != NULL) cmdq_error(item, "%s", cause);
cmd_free_argv(sc.argc, sc.argv); free(cause);
environ_free(sc.environ); if (sc.argv != NULL)
return (CMD_RETURN_ERROR); cmd_free_argv(sc.argc, sc.argv);
environ_free(sc.environ);
return (CMD_RETURN_ERROR);
case 1:
input = 0;
break;
}
} }
if (!args_has(args, 'd')) if (!args_has(args, 'd'))
cmd_find_from_winlink_pane(current, wl, new_wp, 0); cmd_find_from_winlink_pane(current, wl, new_wp, 0);

View File

@ -1527,7 +1527,7 @@ window_pane_input_callback(struct client *c, __unused const char *path,
size_t len = EVBUFFER_LENGTH(buffer); size_t len = EVBUFFER_LENGTH(buffer);
wp = window_pane_find_by_id(cdata->wp); wp = window_pane_find_by_id(cdata->wp);
if (wp == NULL || closed || error != 0 || c->flags & CLIENT_DEAD) { if (wp == NULL || closed || error != 0 || (c->flags & CLIENT_DEAD)) {
if (wp == NULL) if (wp == NULL)
c->flags |= CLIENT_EXIT; c->flags |= CLIENT_EXIT;
@ -1553,6 +1553,10 @@ window_pane_start_input(struct window_pane *wp, struct cmdq_item *item,
*cause = xstrdup("pane is not empty"); *cause = xstrdup("pane is not empty");
return (-1); return (-1);
} }
if (c->flags & (CLIENT_DEAD|CLIENT_EXITED))
return (1);
if (c->session != NULL)
return (1);
cdata = xmalloc(sizeof *cdata); cdata = xmalloc(sizeof *cdata);
cdata->item = item; cdata->item = item;