On 05/20/2010 08:17 PM, Micah Cowan wrote:
> Okay, I now understand why that is: copy-selection needs to know which
> session's paste buffers should be affected, and it gets this information
> from the passed-in instance of "struct client", which of course is NULL
> for direct shell commands. So I need it to get it the session
> information from elsewhere; probably the TMUX env var.

Attached is my patch, against current SF CVS HEAD.

-- 
Micah J. Cowan
http://micah.cowan.name/
Index: sf/cmd-send-keys.c
===================================================================
--- sf.orig/cmd-send-keys.c	2010-05-21 00:58:28.254680324 -0700
+++ sf/cmd-send-keys.c	2010-05-21 01:02:11.434691012 -0700
@@ -105,16 +105,17 @@ cmd_send_keys_exec(struct cmd *self, str
 {
 	struct cmd_send_keys_data	*data = self->data;
 	struct window_pane		*wp;
+	struct session			*s;
 	u_int				 i;
 
 	if (data == NULL)
 		return (-1);
 
-	if (cmd_find_pane(ctx, data->target, NULL, &wp) == NULL)
+	if (cmd_find_pane(ctx, data->target, &s, &wp) == NULL)
 		return (-1);
 
 	for (i = 0; i < data->nkeys; i++)
-		window_pane_key(wp, ctx->curclient, data->keys[i]);
+		window_pane_key(wp, s, data->keys[i]);
 
 	return (0);
 }
Index: sf/cmd-send-prefix.c
===================================================================
--- sf.orig/cmd-send-prefix.c	2010-05-21 00:58:27.338683528 -0700
+++ sf/cmd-send-prefix.c	2010-05-21 00:51:04.978946851 -0700
@@ -49,7 +49,7 @@ cmd_send_prefix_exec(struct cmd *self, s
 		return (-1);
 
 	keylist = options_get_data(&s->options, "prefix");
-	window_pane_key(wp, ctx->curclient, ARRAY_FIRST(keylist));
+	window_pane_key(wp, s, ARRAY_FIRST(keylist));
 
 	return (0);
 }
Index: sf/server-client.c
===================================================================
--- sf.orig/server-client.c	2010-05-21 00:58:27.890682248 -0700
+++ sf/server-client.c	2010-05-21 00:58:03.991519751 -0700
@@ -299,7 +299,7 @@ server_client_handle_key(int key, struct
 			server_redraw_window_borders(w);
 			wp = w->active;
 		}
-		window_pane_mouse(wp, c, mouse);
+		window_pane_mouse(wp, c->session, mouse);
 		return;
 	}
 
@@ -321,7 +321,7 @@ server_client_handle_key(int key, struct
 			/* Try as a non-prefix key binding. */
 			if ((bd = key_bindings_lookup(key)) == NULL) {
 				if (!(c->flags & CLIENT_READONLY))
-					window_pane_key(wp, c, key);
+					window_pane_key(wp, c->session, key);
 			} else
 				key_bindings_dispatch(bd, c);
 		}
@@ -337,7 +337,7 @@ server_client_handle_key(int key, struct
 			if (isprefix)
 				c->flags |= CLIENT_PREFIX;
 			else if (!(c->flags & CLIENT_READONLY))
-				window_pane_key(wp, c, key);
+				window_pane_key(wp, c->session, key);
 		}
 		return;
 	}
@@ -348,7 +348,7 @@ server_client_handle_key(int key, struct
 		if (isprefix)
 			c->flags |= CLIENT_PREFIX;
 		else if (!(c->flags & CLIENT_READONLY))
-			window_pane_key(wp, c, key);
+			window_pane_key(wp, c->session, key);
 		return;
 	}
 
Index: sf/tmux.h
===================================================================
--- sf.orig/tmux.h	2010-05-21 00:34:45.274681719 -0700
+++ sf/tmux.h	2010-05-21 01:08:10.542696161 -0700
@@ -759,16 +759,16 @@ struct input_ctx {
  * Window mode. Windows can be in several modes and this is used to call the
  * right function to handle input and output.
  */
-struct client;
+struct session;
 struct window;
 struct mouse_event;
 struct window_mode {
 	struct screen *(*init)(struct window_pane *);
 	void	(*free)(struct window_pane *);
 	void	(*resize)(struct window_pane *, u_int, u_int);
-	void	(*key)(struct window_pane *, struct client *, int);
+	void	(*key)(struct window_pane *, struct session *, int);
 	void	(*mouse)(struct window_pane *,
-		    struct client *, struct mouse_event *);
+		    struct session *, struct mouse_event *);
 	void	(*timer)(struct window_pane *);
 };
 
@@ -1827,9 +1827,9 @@ void		 window_pane_alternate_off(
 int		 window_pane_set_mode(
 		     struct window_pane *, const struct window_mode *);
 void		 window_pane_reset_mode(struct window_pane *);
-void		 window_pane_key(struct window_pane *, struct client *, int);
+void		 window_pane_key(struct window_pane *, struct session *, int);
 void		 window_pane_mouse(struct window_pane *,
-		     struct client *, struct mouse_event *);
+		     struct session *, struct mouse_event *);
 int		 window_pane_visible(struct window_pane *);
 char		*window_pane_search(
 		     struct window_pane *, const char *, u_int *);
Index: sf/window-choose.c
===================================================================
--- sf.orig/window-choose.c	2010-05-21 00:34:45.330681089 -0700
+++ sf/window-choose.c	2010-05-21 00:58:08.832501912 -0700
@@ -25,9 +25,9 @@
 struct screen *window_choose_init(struct window_pane *);
 void	window_choose_free(struct window_pane *);
 void	window_choose_resize(struct window_pane *, u_int, u_int);
-void	window_choose_key(struct window_pane *, struct client *, int);
+void	window_choose_key(struct window_pane *, struct session *, int);
 void	window_choose_mouse(
-	    struct window_pane *, struct client *, struct mouse_event *);
+	    struct window_pane *, struct session *, struct mouse_event *);
 
 void	window_choose_redraw_screen(struct window_pane *);
 void	window_choose_write_line(
@@ -171,7 +171,7 @@ window_choose_resize(struct window_pane 
 
 /* ARGSUSED */
 void
-window_choose_key(struct window_pane *wp, unused struct client *c, int key)
+window_choose_key(struct window_pane *wp, unused struct session *sess, int key)
 {
 	struct window_choose_mode_data	*data = wp->modedata;
 	struct screen			*s = &data->screen;
@@ -304,7 +304,7 @@ window_choose_key(struct window_pane *wp
 /* ARGSUSED */
 void
 window_choose_mouse(
-    struct window_pane *wp, unused struct client *c, struct mouse_event *m)
+    struct window_pane *wp, unused struct session *sess, struct mouse_event *m)
 {
 	struct window_choose_mode_data	*data = wp->modedata;
 	struct screen			*s = &data->screen;
Index: sf/window-clock.c
===================================================================
--- sf.orig/window-clock.c	2010-05-21 00:34:45.738681984 -0700
+++ sf/window-clock.c	2010-05-21 00:45:26.331783106 -0700
@@ -26,7 +26,7 @@
 struct screen *window_clock_init(struct window_pane *);
 void	window_clock_free(struct window_pane *);
 void	window_clock_resize(struct window_pane *, u_int, u_int);
-void	window_clock_key(struct window_pane *, struct client *, int);
+void	window_clock_key(struct window_pane *, struct session *, int);
 void	window_clock_timer(struct window_pane *);
 
 void	window_clock_draw_screen(struct window_pane *);
@@ -85,7 +85,7 @@ window_clock_resize(struct window_pane *
 /* ARGSUSED */
 void
 window_clock_key(
-    struct window_pane *wp, unused struct client *c, unused int key)
+    struct window_pane *wp, unused struct session *sess, unused int key)
 {
 	window_pane_reset_mode(wp);
 }
Index: sf/window-copy.c
===================================================================
--- sf.orig/window-copy.c	2010-05-21 00:34:45.690682382 -0700
+++ sf/window-copy.c	2010-05-21 00:44:16.095873872 -0700
@@ -26,11 +26,11 @@
 struct screen *window_copy_init(struct window_pane *);
 void	window_copy_free(struct window_pane *);
 void	window_copy_resize(struct window_pane *, u_int, u_int);
-void	window_copy_key(struct window_pane *, struct client *, int);
+void	window_copy_key(struct window_pane *, struct session *, int);
 int	window_copy_key_input(struct window_pane *, int);
 int	window_copy_key_numeric_prefix(struct window_pane *, int);
 void	window_copy_mouse(
-	    struct window_pane *, struct client *, struct mouse_event *);
+	    struct window_pane *, struct session *, struct mouse_event *);
 
 void	window_copy_redraw_lines(struct window_pane *, u_int, u_int);
 void	window_copy_redraw_screen(struct window_pane *);
@@ -52,7 +52,7 @@ void	window_copy_goto_line(struct window
 void	window_copy_update_cursor(struct window_pane *, u_int, u_int);
 void	window_copy_start_selection(struct window_pane *);
 int	window_copy_update_selection(struct window_pane *);
-void	window_copy_copy_selection(struct window_pane *, struct client *);
+void	window_copy_copy_selection(struct window_pane *, struct session *);
 void	window_copy_clear_selection(struct window_pane *);
 void	window_copy_copy_line(
 	    struct window_pane *, char **, size_t *, u_int, u_int, u_int);
@@ -351,7 +351,7 @@ window_copy_resize(struct window_pane *w
 }
 
 void
-window_copy_key(struct window_pane *wp, struct client *c, int key)
+window_copy_key(struct window_pane *wp, struct session *sess, int key)
 {
 	const char			*word_separators;
 	struct window_copy_mode_data	*data = wp->modedata;
@@ -501,8 +501,8 @@ window_copy_key(struct window_pane *wp, 
 		window_copy_redraw_screen(wp);
 		break;
 	case MODEKEYCOPY_COPYSELECTION:
-		if (c != NULL && c->session != NULL) {
-			window_copy_copy_selection(wp, c);
+		if (sess != NULL) {
+			window_copy_copy_selection(wp, sess);
 			window_pane_reset_mode(wp);
 			return;
 		}
@@ -756,7 +756,7 @@ window_copy_key_numeric_prefix(struct wi
 /* ARGSUSED */
 void
 window_copy_mouse(
-    struct window_pane *wp, unused struct client *c, struct mouse_event *m)
+    struct window_pane *wp, unused struct session *sess, struct mouse_event *m)
 {
 	struct window_copy_mode_data	*data = wp->modedata;
 	struct screen			*s = &data->screen;
@@ -1167,7 +1167,7 @@ window_copy_update_selection(struct wind
 }
 
 void
-window_copy_copy_selection(struct window_pane *wp, struct client *c)
+window_copy_copy_selection(struct window_pane *wp, struct session *sess)
 {
 	struct window_copy_mode_data	*data = wp->modedata;
 	struct screen			*s = &data->screen;
@@ -1262,8 +1262,8 @@ window_copy_copy_selection(struct window
 	off--;	/* remove final \n */
 
 	/* Add the buffer to the stack. */
-	limit = options_get_number(&c->session->options, "buffer-limit");
-	paste_add(&c->session->buffers, buf, off, limit);
+	limit = options_get_number(&sess->options, "buffer-limit");
+	paste_add(&sess->buffers, buf, off, limit);
 }
 
 void
Index: sf/window.c
===================================================================
--- sf.orig/window.c	2010-05-21 00:58:27.006683382 -0700
+++ sf/window.c	2010-05-21 00:47:34.501379031 -0700
@@ -728,7 +728,7 @@ window_pane_reset_mode(struct window_pan
 }
 
 void
-window_pane_key(struct window_pane *wp, struct client *c, int key)
+window_pane_key(struct window_pane *wp, struct session *sess, int key)
 {
 	struct window_pane	*wp2;
 
@@ -737,7 +737,7 @@ window_pane_key(struct window_pane *wp, 
 
 	if (wp->mode != NULL) {
 		if (wp->mode->key != NULL)
-			wp->mode->key(wp, c, key);
+			wp->mode->key(wp, sess, key);
 		return;
 	}
 
@@ -756,7 +756,7 @@ window_pane_key(struct window_pane *wp, 
 
 void
 window_pane_mouse(
-    struct window_pane *wp, struct client *c, struct mouse_event *m)
+    struct window_pane *wp, struct session *sess, struct mouse_event *m)
 {
 	if (!window_pane_visible(wp))
 		return;
@@ -770,7 +770,7 @@ window_pane_mouse(
 
 	if (wp->mode != NULL) {
 		if (wp->mode->mouse != NULL)
-			wp->mode->mouse(wp, c, m);
+			wp->mode->mouse(wp, sess, m);
 	} else if (wp->fd != -1)
 		input_mouse(wp, m);
 }
------------------------------------------------------------------------------

_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to