On Mon, Nov 19, 2012 at 10:32:00AM +0000, Nicholas Marriott wrote:
> Hi
> 
> Not sure I follow, can you show me your code?

See "hook-context.diff" attached.  Please ignore any whitespace errors, as
well as any logging since I'm still in the throws of messing with things.

You should look (in that diff) at the changes to:

tmux.h
cmd.c
cmd-new-window.c
cmd-split-window.c

The changes to cmd-{new,split}-window.c just show the intent of what setting
a context may mean.

> I think check() was meant for parse time so that eg bind-key could
> reject stuff when a key was bound rather when it was pressed, but since
> it is hardly used I'm fine with removing it. Note that bind/unbind use
> it as well as new-session.

It just means that if we went with this idea of having a context to bind
to, that we can just reuse the original check() field in the struct, without
having to define a new one.

So before I go ahead and clean check() up, I'll wait for a decision on this
first.

I am still thinking that augmenting struct cmd_ctx might be a little easier
rather than having a separate struct for this.

Hope it's clear enough.

Kindly,

-- Thomas Adam
diff --git a/autogen.sh b/autogen.sh
index a3cc937..7d39f07 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -1,8 +1,8 @@
 #!/bin/sh
 # $Id$
 
-[ -z "$AUTOMAKE_VERSION" ] && export AUTOMAKE_VERSION=1.10
-[ -z "$AUTOCONF_VERSION" ] && export AUTOCONF_VERSION=2.65
+#[ -z "$AUTOMAKE_VERSION" ] && export AUTOMAKE_VERSION=1.10
+#[ -z "$AUTOCONF_VERSION" ] && export AUTOCONF_VERSION=2.65
 
 die()
 {
diff --git a/cmd-attach-session.c b/cmd-attach-session.c
index 18a2024..b4e64cb 100644
--- a/cmd-attach-session.c
+++ b/cmd-attach-session.c
@@ -35,7 +35,8 @@
 	CMD_CANTNEST|CMD_STARTSERVER|CMD_SENDENVIRON,
 	NULL,
 	NULL,
-	cmd_attach_session_exec
+	cmd_attach_session_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-bind-key.c b/cmd-bind-key.c
index 28e94e2..55042d6 100644
--- a/cmd-bind-key.c
+++ b/cmd-bind-key.c
@@ -39,7 +39,8 @@
 	0,
 	NULL,
 	cmd_bind_key_check,
-	cmd_bind_key_exec
+	cmd_bind_key_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-break-pane.c b/cmd-break-pane.c
index 637105a..9377e03 100644
--- a/cmd-break-pane.c
+++ b/cmd-break-pane.c
@@ -35,7 +35,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_break_pane_exec
+	cmd_break_pane_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c
index a94c717..6f4e642 100644
--- a/cmd-capture-pane.c
+++ b/cmd-capture-pane.c
@@ -36,7 +36,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_capture_pane_exec
+	cmd_capture_pane_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-choose-buffer.c b/cmd-choose-buffer.c
index 50505ea..e071c78 100644
--- a/cmd-choose-buffer.c
+++ b/cmd-choose-buffer.c
@@ -39,7 +39,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_choose_buffer_exec
+	cmd_choose_buffer_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-choose-client.c b/cmd-choose-client.c
index 7c3b926..a15eda9 100644
--- a/cmd-choose-client.c
+++ b/cmd-choose-client.c
@@ -39,7 +39,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_choose_client_exec
+	cmd_choose_client_exec,
+		 NULL
 };
 
 struct cmd_choose_client_data {
diff --git a/cmd-choose-list.c b/cmd-choose-list.c
index 4c32e69..6cc2e4c 100644
--- a/cmd-choose-list.c
+++ b/cmd-choose-list.c
@@ -43,7 +43,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_choose_list_exec
+	cmd_choose_list_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c
index e8da7a4..5b25da8 100644
--- a/cmd-choose-tree.c
+++ b/cmd-choose-tree.c
@@ -45,7 +45,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_choose_tree_exec
+	cmd_choose_tree_exec,
+		 NULL
 };
 
 const struct cmd_entry cmd_choose_session_entry = {
@@ -55,7 +56,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_choose_tree_exec
+	cmd_choose_tree_exec,
+		 NULL
 };
 
 const struct cmd_entry cmd_choose_window_entry = {
@@ -65,7 +67,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_choose_tree_exec
+	cmd_choose_tree_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-clear-history.c b/cmd-clear-history.c
index 27f73db..9f06b73 100644
--- a/cmd-clear-history.c
+++ b/cmd-clear-history.c
@@ -33,7 +33,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_clear_history_exec
+	cmd_clear_history_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-clock-mode.c b/cmd-clock-mode.c
index 139e715..c9e2091 100644
--- a/cmd-clock-mode.c
+++ b/cmd-clock-mode.c
@@ -33,7 +33,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_clock_mode_exec
+	cmd_clock_mode_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-command-prompt.c b/cmd-command-prompt.c
index ea38035..3352f64 100644
--- a/cmd-command-prompt.c
+++ b/cmd-command-prompt.c
@@ -43,7 +43,8 @@
 	0,
 	cmd_command_prompt_key_binding,
 	NULL,
-	cmd_command_prompt_exec
+	cmd_command_prompt_exec,
+		 NULL
 };
 
 struct cmd_command_prompt_cdata {
diff --git a/cmd-confirm-before.c b/cmd-confirm-before.c
index 329027c..146b1c0 100644
--- a/cmd-confirm-before.c
+++ b/cmd-confirm-before.c
@@ -39,7 +39,8 @@
 	0,
 	cmd_confirm_before_key_binding,
 	NULL,
-	cmd_confirm_before_exec
+	cmd_confirm_before_exec,
+		 NULL
 };
 
 struct cmd_confirm_before_data {
diff --git a/cmd-copy-mode.c b/cmd-copy-mode.c
index 8a5b5fc..470d678 100644
--- a/cmd-copy-mode.c
+++ b/cmd-copy-mode.c
@@ -34,7 +34,8 @@
 	0,
 	cmd_copy_mode_key_binding,
 	NULL,
-	cmd_copy_mode_exec
+	cmd_copy_mode_exec,
+		 NULL
 };
 
 void
diff --git a/cmd-delete-buffer.c b/cmd-delete-buffer.c
index f9d2587..4ebcde9 100644
--- a/cmd-delete-buffer.c
+++ b/cmd-delete-buffer.c
@@ -35,7 +35,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_delete_buffer_exec
+	cmd_delete_buffer_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-detach-client.c b/cmd-detach-client.c
index f75b37a..fe3bc67 100644
--- a/cmd-detach-client.c
+++ b/cmd-detach-client.c
@@ -33,7 +33,8 @@
 	CMD_READONLY,
 	NULL,
 	NULL,
-	cmd_detach_client_exec
+	cmd_detach_client_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-display-message.c b/cmd-display-message.c
index e31c110..56a7990 100644
--- a/cmd-display-message.c
+++ b/cmd-display-message.c
@@ -36,7 +36,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_display_message_exec
+	cmd_display_message_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-display-panes.c b/cmd-display-panes.c
index 2745ac5..beab873 100644
--- a/cmd-display-panes.c
+++ b/cmd-display-panes.c
@@ -33,7 +33,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_display_panes_exec
+	cmd_display_panes_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-find-window.c b/cmd-find-window.c
index 9a0a8a4..509f9da 100644
--- a/cmd-find-window.c
+++ b/cmd-find-window.c
@@ -50,7 +50,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_find_window_exec
+	cmd_find_window_exec,
+		 NULL
 };
 
 struct cmd_find_window_data {
diff --git a/cmd-has-session.c b/cmd-has-session.c
index 9f19c4d..651c2c1 100644
--- a/cmd-has-session.c
+++ b/cmd-has-session.c
@@ -33,7 +33,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_has_session_exec
+	cmd_has_session_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-if-shell.c b/cmd-if-shell.c
index 636cf80..20998b3 100644
--- a/cmd-if-shell.c
+++ b/cmd-if-shell.c
@@ -41,7 +41,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_if_shell_exec
+	cmd_if_shell_exec,
+		 NULL
 };
 
 struct cmd_if_shell_data {
diff --git a/cmd-join-pane.c b/cmd-join-pane.c
index a2e7a2d..c9d93d2 100644
--- a/cmd-join-pane.c
+++ b/cmd-join-pane.c
@@ -40,7 +40,8 @@
 	0,
 	cmd_join_pane_key_binding,
 	NULL,
-	cmd_join_pane_exec
+	cmd_join_pane_exec,
+		 NULL
 };
 
 const struct cmd_entry cmd_move_pane_entry = {
@@ -50,7 +51,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_join_pane_exec
+	cmd_join_pane_exec,
+		 NULL
 };
 
 void
diff --git a/cmd-kill-pane.c b/cmd-kill-pane.c
index 4f7af2e..86179e7 100644
--- a/cmd-kill-pane.c
+++ b/cmd-kill-pane.c
@@ -35,7 +35,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_kill_pane_exec
+	cmd_kill_pane_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-kill-server.c b/cmd-kill-server.c
index 6eb39c4..79bab23 100644
--- a/cmd-kill-server.c
+++ b/cmd-kill-server.c
@@ -36,7 +36,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_kill_server_exec
+	cmd_kill_server_exec,
+		 NULL
 };
 
 /* ARGSUSED */
diff --git a/cmd-kill-session.c b/cmd-kill-session.c
index 145f77e..1a280b3 100644
--- a/cmd-kill-session.c
+++ b/cmd-kill-session.c
@@ -36,7 +36,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_kill_session_exec
+	cmd_kill_session_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-kill-window.c b/cmd-kill-window.c
index 88f8dd5..72cf6a4 100644
--- a/cmd-kill-window.c
+++ b/cmd-kill-window.c
@@ -33,7 +33,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_kill_window_exec
+	cmd_kill_window_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-link-window.c b/cmd-link-window.c
index 0e9c55e..611c510 100644
--- a/cmd-link-window.c
+++ b/cmd-link-window.c
@@ -35,7 +35,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_link_window_exec
+	cmd_link_window_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-list-buffers.c b/cmd-list-buffers.c
index f0d1787..b787249 100644
--- a/cmd-list-buffers.c
+++ b/cmd-list-buffers.c
@@ -36,7 +36,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_list_buffers_exec
+	cmd_list_buffers_exec,
+		 NULL
 };
 
 /* ARGSUSED */
diff --git a/cmd-list-clients.c b/cmd-list-clients.c
index 19976cf..45b8fe0 100644
--- a/cmd-list-clients.c
+++ b/cmd-list-clients.c
@@ -37,7 +37,8 @@
 	CMD_READONLY,
 	NULL,
 	NULL,
-	cmd_list_clients_exec
+	cmd_list_clients_exec,
+		 NULL
 };
 
 /* ARGSUSED */
diff --git a/cmd-list-commands.c b/cmd-list-commands.c
index 68e0e80..62c4fcb 100644
--- a/cmd-list-commands.c
+++ b/cmd-list-commands.c
@@ -33,7 +33,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_list_commands_exec
+	cmd_list_commands_exec,
+		 NULL
 };
 
 /* ARGSUSED */
diff --git a/cmd-list-keys.c b/cmd-list-keys.c
index 51eeb67..6ee5224 100644
--- a/cmd-list-keys.c
+++ b/cmd-list-keys.c
@@ -36,7 +36,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_list_keys_exec
+	cmd_list_keys_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-list-panes.c b/cmd-list-panes.c
index 0934645..4002124 100644
--- a/cmd-list-panes.c
+++ b/cmd-list-panes.c
@@ -42,7 +42,8 @@ void	cmd_list_panes_window(struct cmd *,
 	0,
 	NULL,
 	NULL,
-	cmd_list_panes_exec
+	cmd_list_panes_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-list-sessions.c b/cmd-list-sessions.c
index e8db83e..76b4077 100644
--- a/cmd-list-sessions.c
+++ b/cmd-list-sessions.c
@@ -37,7 +37,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_list_sessions_exec
+	cmd_list_sessions_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-list-windows.c b/cmd-list-windows.c
index b36b5ee..76e37ba 100644
--- a/cmd-list-windows.c
+++ b/cmd-list-windows.c
@@ -40,7 +40,8 @@ void	cmd_list_windows_session(
 	0,
 	NULL,
 	NULL,
-	cmd_list_windows_exec
+	cmd_list_windows_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-load-buffer.c b/cmd-load-buffer.c
index aaf23d9..bf50833 100644
--- a/cmd-load-buffer.c
+++ b/cmd-load-buffer.c
@@ -40,7 +40,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_load_buffer_exec
+	cmd_load_buffer_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-lock-server.c b/cmd-lock-server.c
index 9d65027..75c625d 100644
--- a/cmd-lock-server.c
+++ b/cmd-lock-server.c
@@ -37,7 +37,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_lock_server_exec
+	cmd_lock_server_exec,
+		 NULL
 };
 
 const struct cmd_entry cmd_lock_session_entry = {
@@ -47,7 +48,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_lock_server_exec
+	cmd_lock_server_exec,
+		 NULL
 };
 
 const struct cmd_entry cmd_lock_client_entry = {
@@ -57,7 +59,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_lock_server_exec
+	cmd_lock_server_exec,
+		 NULL
 };
 
 /* ARGSUSED */
diff --git a/cmd-move-window.c b/cmd-move-window.c
index 8bd9ffe..5a0daa7 100644
--- a/cmd-move-window.c
+++ b/cmd-move-window.c
@@ -35,7 +35,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_move_window_exec
+	cmd_move_window_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-new-session.c b/cmd-new-session.c
index 8477d9b..cf9f2df 100644
--- a/cmd-new-session.c
+++ b/cmd-new-session.c
@@ -41,7 +41,8 @@
 	CMD_STARTSERVER|CMD_CANTNEST|CMD_SENDENVIRON,
 	NULL,
 	cmd_new_session_check,
-	cmd_new_session_exec
+	cmd_new_session_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-new-window.c b/cmd-new-window.c
index f8a7612..780238d 100644
--- a/cmd-new-window.c
+++ b/cmd-new-window.c
@@ -27,6 +27,7 @@
  */
 
 enum cmd_retval	cmd_new_window_exec(struct cmd *, struct cmd_ctx *);
+void cmd_new_window_context(struct cmd *, struct cmd_ctx *);
 
 const struct cmd_entry cmd_new_window_entry = {
 	"new-window", "neww",
@@ -36,9 +37,29 @@
 	0,
 	NULL,
 	NULL,
-	cmd_new_window_exec
+	cmd_new_window_exec,
+	cmd_new_window_context
 };
 
+void
+cmd_new_window_context(struct cmd *self, struct cmd_ctx *ctx)
+{
+	struct args	*args = self->args;
+	struct session	*s;
+	struct winlink	*wl;
+	int		 idx;
+
+	if (args_has(args, 'a')) {
+		wl = cmd_find_window(ctx, args_get(args, 't'), &s);
+
+		self->context->ctx_session = s;
+		self->context->ctx_wl = wl;
+	} else {
+		cmd_find_index(ctx, args_get(args, 't'), &s);
+		self->context->ctx_session = s;
+	}
+}
+
 enum cmd_retval
 cmd_new_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 {
diff --git a/cmd-paste-buffer.c b/cmd-paste-buffer.c
index ff92783..b93b409 100644
--- a/cmd-paste-buffer.c
+++ b/cmd-paste-buffer.c
@@ -39,7 +39,8 @@ void	cmd_paste_buffer_filter(struct window_pane *,
 	0,
 	NULL,
 	NULL,
-	cmd_paste_buffer_exec
+	cmd_paste_buffer_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-pipe-pane.c b/cmd-pipe-pane.c
index d2d8500..65c13a6 100644
--- a/cmd-pipe-pane.c
+++ b/cmd-pipe-pane.c
@@ -42,7 +42,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_pipe_pane_exec
+	cmd_pipe_pane_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-refresh-client.c b/cmd-refresh-client.c
index 5251812..6cae57d 100644
--- a/cmd-refresh-client.c
+++ b/cmd-refresh-client.c
@@ -33,7 +33,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_refresh_client_exec
+	cmd_refresh_client_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-rename-session.c b/cmd-rename-session.c
index 74443bc..c4bca9b 100644
--- a/cmd-rename-session.c
+++ b/cmd-rename-session.c
@@ -35,7 +35,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_rename_session_exec
+	cmd_rename_session_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-rename-window.c b/cmd-rename-window.c
index e42dd52..a001aaa 100644
--- a/cmd-rename-window.c
+++ b/cmd-rename-window.c
@@ -35,7 +35,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_rename_window_exec
+	cmd_rename_window_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-resize-pane.c b/cmd-resize-pane.c
index 19ff0e9..dd3a00b 100644
--- a/cmd-resize-pane.c
+++ b/cmd-resize-pane.c
@@ -36,7 +36,8 @@
 	0,
 	cmd_resize_pane_key_binding,
 	NULL,
-	cmd_resize_pane_exec
+	cmd_resize_pane_exec,
+		 NULL
 };
 
 void
diff --git a/cmd-respawn-pane.c b/cmd-respawn-pane.c
index cf3d930..42e95cf 100644
--- a/cmd-respawn-pane.c
+++ b/cmd-respawn-pane.c
@@ -37,7 +37,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_respawn_pane_exec
+	cmd_respawn_pane_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-respawn-window.c b/cmd-respawn-window.c
index 46d6b0d..482ba46 100644
--- a/cmd-respawn-window.c
+++ b/cmd-respawn-window.c
@@ -36,7 +36,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_respawn_window_exec
+	cmd_respawn_window_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-rotate-window.c b/cmd-rotate-window.c
index 74f4c06..a963405 100644
--- a/cmd-rotate-window.c
+++ b/cmd-rotate-window.c
@@ -34,7 +34,8 @@
 	0,
 	cmd_rotate_window_key_binding,
 	NULL,
-	cmd_rotate_window_exec
+	cmd_rotate_window_exec,
+		 NULL
 };
 
 void
diff --git a/cmd-run-shell.c b/cmd-run-shell.c
index 130a541..cd29f4b 100644
--- a/cmd-run-shell.c
+++ b/cmd-run-shell.c
@@ -40,7 +40,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_run_shell_exec
+	cmd_run_shell_exec,
+		 NULL
 };
 
 struct cmd_run_shell_data {
diff --git a/cmd-save-buffer.c b/cmd-save-buffer.c
index 638c574..2c07997 100644
--- a/cmd-save-buffer.c
+++ b/cmd-save-buffer.c
@@ -38,7 +38,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_save_buffer_exec
+	cmd_save_buffer_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-select-layout.c b/cmd-select-layout.c
index 5b234ab..bfbfe44 100644
--- a/cmd-select-layout.c
+++ b/cmd-select-layout.c
@@ -34,7 +34,8 @@
 	0,
 	cmd_select_layout_key_binding,
 	NULL,
-	cmd_select_layout_exec
+	cmd_select_layout_exec,
+		 NULL
 };
 
 const struct cmd_entry cmd_next_layout_entry = {
@@ -44,7 +45,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_select_layout_exec
+	cmd_select_layout_exec,
+		 NULL
 };
 
 const struct cmd_entry cmd_previous_layout_entry = {
@@ -54,7 +56,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_select_layout_exec
+	cmd_select_layout_exec,
+		 NULL
 };
 
 void
diff --git a/cmd-select-pane.c b/cmd-select-pane.c
index 8ebae5f..42e91b6 100644
--- a/cmd-select-pane.c
+++ b/cmd-select-pane.c
@@ -34,7 +34,8 @@
 	0,
 	cmd_select_pane_key_binding,
 	NULL,
-	cmd_select_pane_exec
+	cmd_select_pane_exec,
+		 NULL
 };
 
 const struct cmd_entry cmd_last_pane_entry = {
@@ -44,7 +45,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_select_pane_exec
+	cmd_select_pane_exec,
+		 NULL
 };
 
 void
diff --git a/cmd-select-window.c b/cmd-select-window.c
index 5d87e59..8f601b2 100644
--- a/cmd-select-window.c
+++ b/cmd-select-window.c
@@ -36,7 +36,8 @@
 	0,
 	cmd_select_window_key_binding,
 	NULL,
-	cmd_select_window_exec
+	cmd_select_window_exec,
+		 NULL
 };
 
 const struct cmd_entry cmd_next_window_entry = {
@@ -46,7 +47,8 @@
 	0,
 	cmd_select_window_key_binding,
 	NULL,
-	cmd_select_window_exec
+	cmd_select_window_exec,
+		 NULL
 };
 
 const struct cmd_entry cmd_previous_window_entry = {
@@ -56,7 +58,8 @@
 	0,
 	cmd_select_window_key_binding,
 	NULL,
-	cmd_select_window_exec
+	cmd_select_window_exec,
+		 NULL
 };
 
 const struct cmd_entry cmd_last_window_entry = {
@@ -66,7 +69,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_select_window_exec
+	cmd_select_window_exec,
+		 NULL
 };
 
 void
diff --git a/cmd-send-keys.c b/cmd-send-keys.c
index ec1007b..1335080 100644
--- a/cmd-send-keys.c
+++ b/cmd-send-keys.c
@@ -36,7 +36,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_send_keys_exec
+	cmd_send_keys_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-send-prefix.c b/cmd-send-prefix.c
index 5dded95..0d19922 100644
--- a/cmd-send-prefix.c
+++ b/cmd-send-prefix.c
@@ -33,7 +33,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_send_prefix_exec
+	cmd_send_prefix_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-server-info.c b/cmd-server-info.c
index e2e3364..9950a0f 100644
--- a/cmd-server-info.c
+++ b/cmd-server-info.c
@@ -39,7 +39,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_server_info_exec
+	cmd_server_info_exec,
+		 NULL
 };
 
 /* ARGSUSED */
diff --git a/cmd-set-buffer.c b/cmd-set-buffer.c
index 1eeaead..a32799f 100644
--- a/cmd-set-buffer.c
+++ b/cmd-set-buffer.c
@@ -36,7 +36,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_set_buffer_exec
+	cmd_set_buffer_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-set-environment.c b/cmd-set-environment.c
index 9533626..7906436 100644
--- a/cmd-set-environment.c
+++ b/cmd-set-environment.c
@@ -36,7 +36,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_set_environment_exec
+	cmd_set_environment_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-set-hook.c b/cmd-set-hook.c
index d42ead7..9f27c64 100644
--- a/cmd-set-hook.c
+++ b/cmd-set-hook.c
@@ -34,7 +34,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_set_hook_exec
+	cmd_set_hook_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-set-option.c b/cmd-set-option.c
index ca99a97..5501b77 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -65,7 +65,8 @@ struct options_entry *cmd_set_option_choice(struct cmd *, struct cmd_ctx *,
 	0,
 	NULL,
 	NULL,
-	cmd_set_option_exec
+	cmd_set_option_exec,
+		 NULL
 };
 
 const struct cmd_entry cmd_set_window_option_entry = {
@@ -75,7 +76,8 @@ struct options_entry *cmd_set_option_choice(struct cmd *, struct cmd_ctx *,
 	0,
 	NULL,
 	NULL,
-	cmd_set_option_exec
+	cmd_set_option_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-show-buffer.c b/cmd-show-buffer.c
index b345ebc..aad29a6 100644
--- a/cmd-show-buffer.c
+++ b/cmd-show-buffer.c
@@ -35,7 +35,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_show_buffer_exec
+	cmd_show_buffer_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-show-environment.c b/cmd-show-environment.c
index 679d5d4..2cdd2bf 100644
--- a/cmd-show-environment.c
+++ b/cmd-show-environment.c
@@ -36,7 +36,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_show_environment_exec
+	cmd_show_environment_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-show-hooks.c b/cmd-show-hooks.c
index 08e646e..ea17fa3 100644
--- a/cmd-show-hooks.c
+++ b/cmd-show-hooks.c
@@ -34,7 +34,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_show_hooks_exec
+	cmd_show_hooks_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-show-messages.c b/cmd-show-messages.c
index d8c1851..8815878 100644
--- a/cmd-show-messages.c
+++ b/cmd-show-messages.c
@@ -36,7 +36,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_show_messages_exec
+	cmd_show_messages_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-show-options.c b/cmd-show-options.c
index d37b791..a063096 100644
--- a/cmd-show-options.c
+++ b/cmd-show-options.c
@@ -36,7 +36,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_show_options_exec
+	cmd_show_options_exec,
+		 NULL
 };
 
 const struct cmd_entry cmd_show_window_options_entry = {
@@ -46,7 +47,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_show_options_exec
+	cmd_show_options_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-source-file.c b/cmd-source-file.c
index 12ed3de..bc6ae7d 100644
--- a/cmd-source-file.c
+++ b/cmd-source-file.c
@@ -35,7 +35,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_source_file_exec
+	cmd_source_file_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-split-window.c b/cmd-split-window.c
index b40b574..d466015 100644
--- a/cmd-split-window.c
+++ b/cmd-split-window.c
@@ -27,8 +27,9 @@
  * Split a window (add a new pane).
  */
 
-void		 cmd_split_window_key_binding(struct cmd *, int);
-enum cmd_retval	 cmd_split_window_exec(struct cmd *, struct cmd_ctx *);
+void		cmd_split_window_key_binding(struct cmd *, int);
+void		cmd_split_window_context(struct cmd *, struct cmd_ctx *);
+enum cmd_retval	cmd_split_window_exec(struct cmd *, struct cmd_ctx *);
 
 const struct cmd_entry cmd_split_window_entry = {
 	"split-window", "splitw",
@@ -38,10 +39,26 @@
 	0,
 	cmd_split_window_key_binding,
 	NULL,
-	cmd_split_window_exec
+	cmd_split_window_exec,
+	cmd_split_window_context
 };
 
 void
+cmd_split_window_context(struct cmd *self, struct cmd_ctx *ctx)
+{
+	struct session		*s;
+	struct window_pane	*wp;
+	struct winlink		*wl;
+	struct args		*args = self->args;
+
+	wl = cmd_find_pane(ctx, args_get(args, 't'), &s, &wp);
+	log_debug("I GOT HERE");
+	self->context->ctx_session = s;
+	self->context->ctx_window_pane = wp;
+	self->context->ctx_wl = wl;
+}
+
+void
 cmd_split_window_key_binding(struct cmd *self, int key)
 {
 	self->args = args_create(0);
diff --git a/cmd-start-server.c b/cmd-start-server.c
index 7da1337..39767d6 100644
--- a/cmd-start-server.c
+++ b/cmd-start-server.c
@@ -33,7 +33,8 @@
 	CMD_STARTSERVER,
 	NULL,
 	NULL,
-	cmd_start_server_exec
+	cmd_start_server_exec,
+		 NULL
 };
 
 /* ARGSUSED */
diff --git a/cmd-suspend-client.c b/cmd-suspend-client.c
index 95278f9..82f91e9 100644
--- a/cmd-suspend-client.c
+++ b/cmd-suspend-client.c
@@ -36,7 +36,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_suspend_client_exec
+	cmd_suspend_client_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-swap-pane.c b/cmd-swap-pane.c
index 42fe2fc..971db52 100644
--- a/cmd-swap-pane.c
+++ b/cmd-swap-pane.c
@@ -36,7 +36,8 @@
 	0,
 	cmd_swap_pane_key_binding,
 	NULL,
-	cmd_swap_pane_exec
+	cmd_swap_pane_exec,
+		 NULL
 };
 
 void
diff --git a/cmd-swap-window.c b/cmd-swap-window.c
index f0c9ffe..61509c5 100644
--- a/cmd-swap-window.c
+++ b/cmd-swap-window.c
@@ -35,7 +35,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_swap_window_exec
+	cmd_swap_window_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-switch-client.c b/cmd-switch-client.c
index 1ca0c41..3f44e12 100644
--- a/cmd-switch-client.c
+++ b/cmd-switch-client.c
@@ -37,7 +37,8 @@
 	CMD_READONLY,
 	cmd_switch_client_key_binding,
 	NULL,
-	cmd_switch_client_exec
+	cmd_switch_client_exec,
+		 NULL
 };
 
 void
diff --git a/cmd-unbind-key.c b/cmd-unbind-key.c
index 261ded4..8b6c9d2 100644
--- a/cmd-unbind-key.c
+++ b/cmd-unbind-key.c
@@ -37,7 +37,8 @@
 	0,
 	NULL,
 	cmd_unbind_key_check,
-	cmd_unbind_key_exec
+	cmd_unbind_key_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd-unlink-window.c b/cmd-unlink-window.c
index 19731ba..f95f454 100644
--- a/cmd-unlink-window.c
+++ b/cmd-unlink-window.c
@@ -33,7 +33,8 @@
 	0,
 	NULL,
 	NULL,
-	cmd_unlink_window_exec
+	cmd_unlink_window_exec,
+		 NULL
 };
 
 enum cmd_retval
diff --git a/cmd.c b/cmd.c
index f88c071..b872c97 100644
--- a/cmd.c
+++ b/cmd.c
@@ -209,6 +209,22 @@ enum cmd_retval	 run_hook_after(struct hooks *, struct cmd *,
 	free(argv);
 }
 
+struct cmd_context *
+cmd_context_create(struct cmd_ctx *ctx)
+{
+	struct cmd_context	*cmd_context;
+
+	cmd_context = xmalloc(sizeof *cmd_context);
+	cmd_context->ctx_client = (ctx->curclient != NULL) ?
+			ctx->curclient : NULL;
+	cmd_context->ctx_session = (ctx->curclient != NULL) ?
+			ctx->curclient->session : NULL;
+	cmd_context->ctx_window = NULL;
+	cmd_context->ctx_window_pane = NULL;
+
+	return (cmd_context);
+}
+
 struct cmd *
 cmd_parse(int argc, char **argv, char **cause)
 {
@@ -263,6 +279,7 @@ struct cmd *
 	cmd = xmalloc(sizeof *cmd);
 	cmd->entry = entry;
 	cmd->args = args;
+
 	return (cmd);
 
 ambiguous:
@@ -295,6 +312,10 @@ enum cmd_retval
 
 	memcpy(&hook_ctx, ctx, sizeof hook_ctx);
 	hook_ctx.cmdclient = NULL;
+	if (hooks != &global_hooks && cmd->context != NULL && cmd->context->ctx_client != NULL) {
+		log_debug("SETTING CLIENT");
+		hook_ctx.curclient = cmd->context->ctx_client;
+	}
 	xasprintf(&hook_name, "before-%s", cmd->entry->name);
 
 	retval = hooks_call(hooks, hook_name, &hook_ctx);
@@ -314,6 +335,8 @@ enum cmd_retval
 
 	memcpy(&hook_ctx, ctx, sizeof hook_ctx);
 	hook_ctx.cmdclient = NULL;
+	if (hooks != &global_hooks && cmd->context != NULL && cmd->context->ctx_client != NULL)
+		hook_ctx.curclient = cmd->context->ctx_client;
 	xasprintf(&hook_name, "after-%s", cmd->entry->name);
 
 	retval = hooks_call(hooks, hook_name, &hook_ctx);
@@ -331,10 +354,28 @@ enum cmd_retval
 	struct hooks	*hooks;
 	enum cmd_retval	 retval, hooks_retval;
 
-	if (ctx->curclient != NULL)
-		s = ctx->curclient->session;
+	hooks = &global_hooks;
+	cmd->context = cmd_context_create(ctx);
+	if (cmd->entry->context != NULL) {
+		log_debug("Setting CONTEXT hooks");
+		cmd->entry->context(cmd, ctx);
+
+		/*
+		 * Set the hooks to be the session the hooks will run
+		 * in, which is derived from parsing the command
+		 * flags, and setting the context.
+		 */
+		if (cmd->context != NULL && cmd->context->ctx_session != NULL) {
+			log_debug("HOOKS:  SETTING TO SESSION <<%s>>",
+					cmd->context->ctx_session->name);
+			hooks = &cmd->context->ctx_session->hooks;
+		}
+	}
+	if (hooks == &global_hooks)
+		log_debug("HOOKS:  USING GLOBAL HOOKS");
+	else if (cmd->context != NULL && hooks == &cmd->context->ctx_session->hooks)
+		log_debug("HOOKS:  USING SESSION HOOK");
 
-	hooks = (s == NULL) ? &global_hooks : &s->hooks;
 
 	/* Call any hooks set to run before the intended command. */
 	hooks_retval = run_hook_before(hooks, cmd, ctx);
diff --git a/tmux.h b/tmux.h
index 34f9616..f48c129 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1400,6 +1400,7 @@ struct cmd_ctx {
 struct cmd {
 	const struct cmd_entry	*entry;
 	struct args		*args;
+	struct cmd_context	*context;
 
 	TAILQ_ENTRY(cmd)	 qentry;
 };
@@ -1415,25 +1416,34 @@ enum cmd_retval {
 	CMD_RETURN_ATTACH
 };
 
+struct cmd_context {
+	struct client		*ctx_client;
+	struct session		*ctx_session;
+	struct window		*ctx_window;
+	struct winlink		*ctx_wl;
+	struct window_pane	*ctx_window_pane;
+};
+
 struct cmd_entry {
-	const char	*name;
-	const char	*alias;
+	const char		*name;
+	const char		*alias;
 
-	const char	*args_template;
-	int		 args_lower;
-	int		 args_upper;
+	const char		*args_template;
+	int			args_lower;
+	int			args_upper;
 
-	const char	*usage;
+	const char		*usage;
 
 #define CMD_STARTSERVER 0x1
 #define CMD_CANTNEST 0x2
 #define CMD_SENDENVIRON 0x4
 #define CMD_READONLY 0x8
-	int		 flags;
+	int			flags;
 
-	void		 (*key_binding)(struct cmd *, int);
-	int		 (*check)(struct args *);
-	enum cmd_retval	 (*exec)(struct cmd *, struct cmd_ctx *);
+	void			(*key_binding)(struct cmd *, int);
+	int			(*check)(struct args *);
+	enum cmd_retval		(*exec)(struct cmd *, struct cmd_ctx *);
+	void			(*context)(struct cmd *, struct cmd_ctx *);
 };
 
 /* Key binding. */
@@ -1739,6 +1749,7 @@ long long	 args_strtonum(
 int		 cmd_unpack_argv(char *, size_t, int, char ***);
 char	       **cmd_copy_argv(int, char *const *);
 void		 cmd_free_argv(int, char **);
+struct cmd_context *cmd_context_create(struct cmd_ctx *);
 struct cmd	*cmd_parse(int, char **, char **);
 enum cmd_retval	 cmd_exec(struct cmd *, struct cmd_ctx *);
 void		 cmd_free(struct cmd *);
------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to