kill-pane command.

pull/1/head
Nicholas Marriott 2009-01-13 06:50:10 +00:00
parent 98c85cf989
commit f85559144f
9 changed files with 102 additions and 19 deletions

View File

@ -1,3 +1,7 @@
13 January 2009
* kill-pane command.
12 January 2009
* command-prompt now accepts a single argument, a template string. Any
@ -7,7 +11,7 @@
bind , command-prompt "rename-window %%"
or my favourite:
Or my favourite:
bind x command-prompt "split-window 'man %%'"
@ -898,7 +902,7 @@
(including mutt, emacs). No status bar yet and no key remapping or other
customisation.
$Id: CHANGES,v 1.200 2009-01-13 01:08:40 nicm Exp $
$Id: CHANGES,v 1.201 2009-01-13 06:50:10 nicm Exp $
LocalWords: showw utf UTF fulvio ciriaco joshe OSC APC gettime abc DEF OA clr
LocalWords: rivo nurges lscm Erdely eol smysession mysession ek dstname RB

View File

@ -1,4 +1,4 @@
# $Id: GNUmakefile,v 1.51 2009-01-11 23:31:46 nicm Exp $
# $Id: GNUmakefile,v 1.52 2009-01-13 06:50:10 nicm Exp $
.PHONY: clean
@ -34,6 +34,7 @@ SRCS= tmux.c server.c server-msg.c server-fn.c buffer.c buffer-poll.c status.c \
cmd-respawn-window.c cmd-source-file.c cmd-server-info.c \
cmd-clock-mode.c cmd-lock-server.c cmd-set-password.c \
cmd-save-buffer.c cmd-switch-pane.c cmd-split-window.c \
cmd-resize-pane-up.c cmd-resize-pane-down.c cmd-kill-pane.c \
window-clock.c window-scroll.c window-more.c window-copy.c \
options.c options-cmd.c paste.c colour.c utf8.c clock.c \
tty.c tty-term.c tty-keys.c tty-write.c

View File

@ -1,4 +1,4 @@
# $Id: Makefile,v 1.90 2009-01-12 19:23:14 nicm Exp $
# $Id: Makefile,v 1.91 2009-01-13 06:50:10 nicm Exp $
.SUFFIXES: .c .o .y .h
.PHONY: clean update-index.html upload-index.html
@ -38,7 +38,7 @@ SRCS= tmux.c server.c server-msg.c server-fn.c buffer.c buffer-poll.c status.c \
cmd-respawn-window.c cmd-source-file.c cmd-server-info.c \
cmd-clock-mode.c cmd-lock-server.c cmd-set-password.c \
cmd-save-buffer.c cmd-switch-pane.c cmd-split-window.c \
cmd-resize-pane-up.c cmd-resize-pane-down.c \
cmd-resize-pane-up.c cmd-resize-pane-down.c cmd-kill-pane.c \
window-clock.c window-scroll.c window-more.c window-copy.c \
options.c options-cmd.c paste.c colour.c utf8.c clock.c \
tty.c tty-term.c tty-keys.c tty-write.c

71
cmd-kill-pane.c Normal file
View File

@ -0,0 +1,71 @@
/* $Id: cmd-kill-pane.c,v 1.1 2009-01-13 06:50:10 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <stdlib.h>
#include "tmux.h"
/*
* Kill pane.
*/
void cmd_kill_pane_exec(struct cmd *, struct cmd_ctx *);
const struct cmd_entry cmd_kill_pane_entry = {
"kill-pane", "killp",
CMD_PANE_WINDOW_USAGE,
0,
cmd_pane_init,
cmd_pane_parse,
cmd_kill_pane_exec,
cmd_pane_send,
cmd_pane_recv,
cmd_pane_free,
cmd_pane_print
};
void
cmd_kill_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_pane_data *data = self->data;
struct winlink *wl;
struct window_pane *wp;
if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL)
return;
if (data->pane == -1)
wp = wl->window->active;
else {
if (data->pane > 1 || wl->window->panes[data->pane] == NULL) {
ctx->error(ctx, "no pane: %d", data->pane);
return;
}
wp = wl->window->panes[data->pane];
}
if (window_remove_pane(wl->window, wp) != 0) {
ctx->error(ctx, "can't kill pane: %d", data->pane);
return;
}
server_redraw_window(wl->window);
if (ctx->cmdclient != NULL)
server_write_client(ctx->cmdclient, MSG_EXIT, NULL, 0);
}

View File

@ -1,4 +1,4 @@
/* $Id: cmd-respawn-window.c,v 1.8 2009-01-12 18:22:47 nicm Exp $ */
/* $Id: cmd-respawn-window.c,v 1.9 2009-01-13 06:50:10 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@ -68,7 +68,7 @@ cmd_respawn_window_exec(struct cmd *self, struct cmd_ctx *ctx)
env[0] = buf;
if (w->panes[1] != NULL)
window_remove_pane(w, 1);
window_remove_pane(w, w->panes[1]);
if (window_pane_spawn(w->panes[0], data->arg, NULL, env) != 0) {
ctx->error(ctx, "respawn failed: %s:%d", s->name, wl->idx);

3
cmd.c
View File

@ -1,4 +1,4 @@
/* $Id: cmd.c,v 1.75 2009-01-12 19:23:14 nicm Exp $ */
/* $Id: cmd.c,v 1.76 2009-01-13 06:50:10 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -34,6 +34,7 @@ const struct cmd_entry *cmd_table[] = {
&cmd_delete_buffer_entry,
&cmd_detach_client_entry,
&cmd_has_session_entry,
&cmd_kill_pane_entry,
&cmd_kill_server_entry,
&cmd_kill_session_entry,
&cmd_kill_window_entry,

View File

@ -1,4 +1,4 @@
/* $Id: server.c,v 1.98 2009-01-12 23:37:02 nicm Exp $ */
/* $Id: server.c,v 1.99 2009-01-13 06:50:10 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -566,7 +566,7 @@ void
server_handle_client(struct client *c)
{
struct winlink *wl = c->session->curw;
struct window_pane *wp = wl->window->active;
struct window_pane *wp;
struct timeval tv;
int key, prefix, status, xtimeout;
@ -590,6 +590,7 @@ server_handle_client(struct client *c)
}
if (server_locked)
continue;
wp = wl->window->active; /* could die - do each loop */
if (key == prefix || c->flags & CLIENT_PREFIX) {
memcpy(&c->command_timer, &tv, sizeof c->command_timer);
@ -606,6 +607,7 @@ server_handle_client(struct client *c)
} else
window_pane_key(wp, c, key);
}
wp = wl->window->active; /* could die - reset again */
/* Ensure the cursor is in the right place and correctly on or off. */
status = options_get_number(&c->session->options, "status");
@ -731,7 +733,7 @@ server_lost_window(struct window *w, int pane)
wp = w->panes[pane];
log_debug("lost window %d (%s pane %d)", wp->fd, w->name, pane);
if (window_remove_pane(w, pane) == 0) {
if (window_remove_pane(w, wp) == 0) {
server_redraw_window(w);
return (0);
}

5
tmux.h
View File

@ -1,4 +1,4 @@
/* $Id: tmux.h,v 1.228 2009-01-12 23:37:02 nicm Exp $ */
/* $Id: tmux.h,v 1.229 2009-01-13 06:50:10 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -1081,6 +1081,7 @@ extern const struct cmd_entry cmd_copy_mode_entry;
extern const struct cmd_entry cmd_delete_buffer_entry;
extern const struct cmd_entry cmd_detach_client_entry;
extern const struct cmd_entry cmd_has_session_entry;
extern const struct cmd_entry cmd_kill_pane_entry;
extern const struct cmd_entry cmd_kill_server_entry;
extern const struct cmd_entry cmd_kill_session_entry;
extern const struct cmd_entry cmd_kill_window_entry;
@ -1383,7 +1384,7 @@ void window_destroy(struct window *);
int window_resize(struct window *, u_int, u_int);
int window_add_pane(struct window *,
u_int, const char *, const char *, const char **, u_int);
int window_remove_pane(struct window *, int);
int window_remove_pane(struct window *, struct window_pane *);
struct window_pane *window_pane_create(struct window *, u_int, u_int, u_int);
void window_pane_destroy(struct window_pane *);
int window_pane_spawn(struct window_pane *,

View File

@ -1,4 +1,4 @@
/* $Id: window.c,v 1.56 2009-01-12 18:22:47 nicm Exp $ */
/* $Id: window.c,v 1.57 2009-01-13 06:50:10 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -355,18 +355,21 @@ window_add_pane(struct window *w, u_int y1,
}
if (window_pane_spawn(wp, cmd, cwd, envp) != 0) {
if (wp == w->panes[0])
window_remove_pane(w, 0);
else
window_remove_pane(w, 1);
window_remove_pane(w, wp);
return (-1);
}
return (0);
}
int
window_remove_pane(struct window *w, int pane)
window_remove_pane(struct window *w, struct window_pane *wp)
{
int pane;
pane = 0;
if (wp == w->panes[1])
pane = 1;
if (w->panes[1] != NULL) {
window_pane_destroy(w->panes[pane]);
w->panes[pane] = NULL;