mirror of
https://github.com/tmate-io/tmate.git
synced 2024-11-08 01:04:06 +01:00
Pass in the session, rather than the client, to window modes' key()
function. We were only ever using the client to find the session anyway. This allows send-key to work properly for manipulating copy mode from outside tmux. From Micah Cowan.
This commit is contained in:
parent
0ed727a012
commit
4f5c5b37b8
@ -105,16 +105,17 @@ cmd_send_keys_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
{
|
{
|
||||||
struct cmd_send_keys_data *data = self->data;
|
struct cmd_send_keys_data *data = self->data;
|
||||||
struct window_pane *wp;
|
struct window_pane *wp;
|
||||||
|
struct session *s;
|
||||||
u_int i;
|
u_int i;
|
||||||
|
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
if (cmd_find_pane(ctx, data->target, NULL, &wp) == NULL)
|
if (cmd_find_pane(ctx, data->target, &s, &wp) == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
for (i = 0; i < data->nkeys; i++)
|
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);
|
return (0);
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ cmd_send_prefix_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
keylist = options_get_data(&s->options, "prefix");
|
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);
|
return (0);
|
||||||
}
|
}
|
||||||
|
@ -300,7 +300,7 @@ server_client_handle_key(int key, struct mouse_event *mouse, void *data)
|
|||||||
server_redraw_window_borders(w);
|
server_redraw_window_borders(w);
|
||||||
wp = w->active;
|
wp = w->active;
|
||||||
}
|
}
|
||||||
window_pane_mouse(wp, c, mouse);
|
window_pane_mouse(wp, c->session, mouse);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,7 +322,7 @@ server_client_handle_key(int key, struct mouse_event *mouse, void *data)
|
|||||||
/* Try as a non-prefix key binding. */
|
/* Try as a non-prefix key binding. */
|
||||||
if ((bd = key_bindings_lookup(key)) == NULL) {
|
if ((bd = key_bindings_lookup(key)) == NULL) {
|
||||||
if (!(c->flags & CLIENT_READONLY))
|
if (!(c->flags & CLIENT_READONLY))
|
||||||
window_pane_key(wp, c, key);
|
window_pane_key(wp, c->session, key);
|
||||||
} else
|
} else
|
||||||
key_bindings_dispatch(bd, c);
|
key_bindings_dispatch(bd, c);
|
||||||
}
|
}
|
||||||
@ -338,7 +338,7 @@ server_client_handle_key(int key, struct mouse_event *mouse, void *data)
|
|||||||
if (isprefix)
|
if (isprefix)
|
||||||
c->flags |= CLIENT_PREFIX;
|
c->flags |= CLIENT_PREFIX;
|
||||||
else if (!(c->flags & CLIENT_READONLY))
|
else if (!(c->flags & CLIENT_READONLY))
|
||||||
window_pane_key(wp, c, key);
|
window_pane_key(wp, c->session, key);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -349,7 +349,7 @@ server_client_handle_key(int key, struct mouse_event *mouse, void *data)
|
|||||||
if (isprefix)
|
if (isprefix)
|
||||||
c->flags |= CLIENT_PREFIX;
|
c->flags |= CLIENT_PREFIX;
|
||||||
else if (!(c->flags & CLIENT_READONLY))
|
else if (!(c->flags & CLIENT_READONLY))
|
||||||
window_pane_key(wp, c, key);
|
window_pane_key(wp, c->session, key);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
10
tmux.h
10
tmux.h
@ -760,16 +760,16 @@ struct input_ctx {
|
|||||||
* Window mode. Windows can be in several modes and this is used to call the
|
* Window mode. Windows can be in several modes and this is used to call the
|
||||||
* right function to handle input and output.
|
* right function to handle input and output.
|
||||||
*/
|
*/
|
||||||
struct client;
|
struct session;
|
||||||
struct window;
|
struct window;
|
||||||
struct mouse_event;
|
struct mouse_event;
|
||||||
struct window_mode {
|
struct window_mode {
|
||||||
struct screen *(*init)(struct window_pane *);
|
struct screen *(*init)(struct window_pane *);
|
||||||
void (*free)(struct window_pane *);
|
void (*free)(struct window_pane *);
|
||||||
void (*resize)(struct window_pane *, u_int, u_int);
|
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 *,
|
void (*mouse)(struct window_pane *,
|
||||||
struct client *, struct mouse_event *);
|
struct session *, struct mouse_event *);
|
||||||
void (*timer)(struct window_pane *);
|
void (*timer)(struct window_pane *);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1828,9 +1828,9 @@ void window_pane_alternate_off(
|
|||||||
int window_pane_set_mode(
|
int window_pane_set_mode(
|
||||||
struct window_pane *, const struct window_mode *);
|
struct window_pane *, const struct window_mode *);
|
||||||
void window_pane_reset_mode(struct window_pane *);
|
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 *,
|
void window_pane_mouse(struct window_pane *,
|
||||||
struct client *, struct mouse_event *);
|
struct session *, struct mouse_event *);
|
||||||
int window_pane_visible(struct window_pane *);
|
int window_pane_visible(struct window_pane *);
|
||||||
char *window_pane_search(
|
char *window_pane_search(
|
||||||
struct window_pane *, const char *, u_int *);
|
struct window_pane *, const char *, u_int *);
|
||||||
|
@ -25,9 +25,9 @@
|
|||||||
struct screen *window_choose_init(struct window_pane *);
|
struct screen *window_choose_init(struct window_pane *);
|
||||||
void window_choose_free(struct window_pane *);
|
void window_choose_free(struct window_pane *);
|
||||||
void window_choose_resize(struct window_pane *, u_int, u_int);
|
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(
|
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_redraw_screen(struct window_pane *);
|
||||||
void window_choose_write_line(
|
void window_choose_write_line(
|
||||||
@ -171,7 +171,7 @@ window_choose_resize(struct window_pane *wp, u_int sx, u_int sy)
|
|||||||
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
void
|
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 window_choose_mode_data *data = wp->modedata;
|
||||||
struct screen *s = &data->screen;
|
struct screen *s = &data->screen;
|
||||||
@ -304,7 +304,7 @@ window_choose_key(struct window_pane *wp, unused struct client *c, int key)
|
|||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
void
|
void
|
||||||
window_choose_mouse(
|
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 window_choose_mode_data *data = wp->modedata;
|
||||||
struct screen *s = &data->screen;
|
struct screen *s = &data->screen;
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
struct screen *window_clock_init(struct window_pane *);
|
struct screen *window_clock_init(struct window_pane *);
|
||||||
void window_clock_free(struct window_pane *);
|
void window_clock_free(struct window_pane *);
|
||||||
void window_clock_resize(struct window_pane *, u_int, u_int);
|
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_timer(struct window_pane *);
|
||||||
|
|
||||||
void window_clock_draw_screen(struct window_pane *);
|
void window_clock_draw_screen(struct window_pane *);
|
||||||
@ -85,7 +85,7 @@ window_clock_resize(struct window_pane *wp, u_int sx, u_int sy)
|
|||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
void
|
void
|
||||||
window_clock_key(
|
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);
|
window_pane_reset_mode(wp);
|
||||||
}
|
}
|
||||||
|
@ -26,11 +26,11 @@
|
|||||||
struct screen *window_copy_init(struct window_pane *);
|
struct screen *window_copy_init(struct window_pane *);
|
||||||
void window_copy_free(struct window_pane *);
|
void window_copy_free(struct window_pane *);
|
||||||
void window_copy_resize(struct window_pane *, u_int, u_int);
|
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_input(struct window_pane *, int);
|
||||||
int window_copy_key_numeric_prefix(struct window_pane *, int);
|
int window_copy_key_numeric_prefix(struct window_pane *, int);
|
||||||
void window_copy_mouse(
|
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_lines(struct window_pane *, u_int, u_int);
|
||||||
void window_copy_redraw_screen(struct window_pane *);
|
void window_copy_redraw_screen(struct window_pane *);
|
||||||
@ -52,7 +52,7 @@ void window_copy_goto_line(struct window_pane *, const char *);
|
|||||||
void window_copy_update_cursor(struct window_pane *, u_int, u_int);
|
void window_copy_update_cursor(struct window_pane *, u_int, u_int);
|
||||||
void window_copy_start_selection(struct window_pane *);
|
void window_copy_start_selection(struct window_pane *);
|
||||||
int window_copy_update_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_clear_selection(struct window_pane *);
|
||||||
void window_copy_copy_line(
|
void window_copy_copy_line(
|
||||||
struct window_pane *, char **, size_t *, u_int, u_int, u_int);
|
struct window_pane *, char **, size_t *, u_int, u_int, u_int);
|
||||||
@ -340,8 +340,6 @@ window_copy_resize(struct window_pane *wp, u_int sx, u_int sy)
|
|||||||
data->cy = sy - 1;
|
data->cy = sy - 1;
|
||||||
if (data->cx > sx)
|
if (data->cx > sx)
|
||||||
data->cx = sx;
|
data->cx = sx;
|
||||||
if (data->oy > screen_hsize(data->backing))
|
|
||||||
data->oy = screen_hsize(data->backing);
|
|
||||||
|
|
||||||
window_copy_clear_selection(wp);
|
window_copy_clear_selection(wp);
|
||||||
|
|
||||||
@ -353,7 +351,7 @@ window_copy_resize(struct window_pane *wp, u_int sx, u_int sy)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
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;
|
const char *word_separators;
|
||||||
struct window_copy_mode_data *data = wp->modedata;
|
struct window_copy_mode_data *data = wp->modedata;
|
||||||
@ -503,8 +501,8 @@ window_copy_key(struct window_pane *wp, struct client *c, int key)
|
|||||||
window_copy_redraw_screen(wp);
|
window_copy_redraw_screen(wp);
|
||||||
break;
|
break;
|
||||||
case MODEKEYCOPY_COPYSELECTION:
|
case MODEKEYCOPY_COPYSELECTION:
|
||||||
if (c != NULL && c->session != NULL) {
|
if (sess != NULL) {
|
||||||
window_copy_copy_selection(wp, c);
|
window_copy_copy_selection(wp, sess);
|
||||||
window_pane_reset_mode(wp);
|
window_pane_reset_mode(wp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -758,7 +756,7 @@ window_copy_key_numeric_prefix(struct window_pane *wp, int key)
|
|||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
void
|
void
|
||||||
window_copy_mouse(
|
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 window_copy_mode_data *data = wp->modedata;
|
||||||
struct screen *s = &data->screen;
|
struct screen *s = &data->screen;
|
||||||
@ -1169,7 +1167,7 @@ window_copy_update_selection(struct window_pane *wp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
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 window_copy_mode_data *data = wp->modedata;
|
||||||
struct screen *s = &data->screen;
|
struct screen *s = &data->screen;
|
||||||
@ -1264,8 +1262,8 @@ window_copy_copy_selection(struct window_pane *wp, struct client *c)
|
|||||||
off--; /* remove final \n */
|
off--; /* remove final \n */
|
||||||
|
|
||||||
/* Add the buffer to the stack. */
|
/* Add the buffer to the stack. */
|
||||||
limit = options_get_number(&c->session->options, "buffer-limit");
|
limit = options_get_number(&sess->options, "buffer-limit");
|
||||||
paste_add(&c->session->buffers, buf, off, limit);
|
paste_add(&sess->buffers, buf, off, limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
8
window.c
8
window.c
@ -721,7 +721,7 @@ window_pane_reset_mode(struct window_pane *wp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
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;
|
struct window_pane *wp2;
|
||||||
|
|
||||||
@ -730,7 +730,7 @@ window_pane_key(struct window_pane *wp, struct client *c, int key)
|
|||||||
|
|
||||||
if (wp->mode != NULL) {
|
if (wp->mode != NULL) {
|
||||||
if (wp->mode->key != NULL)
|
if (wp->mode->key != NULL)
|
||||||
wp->mode->key(wp, c, key);
|
wp->mode->key(wp, sess, key);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -749,7 +749,7 @@ window_pane_key(struct window_pane *wp, struct client *c, int key)
|
|||||||
|
|
||||||
void
|
void
|
||||||
window_pane_mouse(
|
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))
|
if (!window_pane_visible(wp))
|
||||||
return;
|
return;
|
||||||
@ -763,7 +763,7 @@ window_pane_mouse(
|
|||||||
|
|
||||||
if (wp->mode != NULL) {
|
if (wp->mode != NULL) {
|
||||||
if (wp->mode->mouse != NULL)
|
if (wp->mode->mouse != NULL)
|
||||||
wp->mode->mouse(wp, c, m);
|
wp->mode->mouse(wp, sess, m);
|
||||||
} else if (wp->fd != -1)
|
} else if (wp->fd != -1)
|
||||||
input_mouse(wp, m);
|
input_mouse(wp, m);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user