mirror of
https://github.com/tmate-io/tmate-ssh-server.git
synced 2020-11-18 19:53:51 -08:00
Replicate tmux commands instead of keys
This commit is contained in:
parent
e18b70af0b
commit
77c23c7123
@ -23,6 +23,7 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include "tmux.h"
|
#include "tmux.h"
|
||||||
|
#include "tmate.h"
|
||||||
|
|
||||||
/* Create new command queue. */
|
/* Create new command queue. */
|
||||||
struct cmd_q *
|
struct cmd_q *
|
||||||
@ -225,6 +226,14 @@ cmdq_continue(struct cmd_q *cmdq)
|
|||||||
cmdq->time = time(NULL);
|
cmdq->time = time(NULL);
|
||||||
cmdq->number++;
|
cmdq->number++;
|
||||||
|
|
||||||
|
#ifdef TMATE_SLAVE
|
||||||
|
if (!tmate_should_exec_cmd_locally(cmdq->cmd->entry)) {
|
||||||
|
tmate_client_cmd(s);
|
||||||
|
cmdq->cmd = TAILQ_NEXT(cmdq->cmd, qentry);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
guard = cmdq_guard(cmdq, "begin");
|
guard = cmdq_guard(cmdq, "begin");
|
||||||
retval = cmdq->cmd->entry->exec(cmdq->cmd, cmdq);
|
retval = cmdq->cmd->entry->exec(cmdq->cmd, cmdq);
|
||||||
if (guard) {
|
if (guard) {
|
||||||
|
@ -282,11 +282,14 @@ server_client_status_timer(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef TMATE_SLAVE
|
|
||||||
/* Check for mouse keys. */
|
/* Check for mouse keys. */
|
||||||
void
|
void
|
||||||
server_client_check_mouse(struct client *c, struct window_pane *wp)
|
server_client_check_mouse(struct client *c, struct window_pane *wp)
|
||||||
{
|
{
|
||||||
|
#ifdef TMATE_SLAVE
|
||||||
|
/* TODO Support mouse */
|
||||||
|
return;
|
||||||
|
#else
|
||||||
struct session *s = c->session;
|
struct session *s = c->session;
|
||||||
struct options *oo = &s->options;
|
struct options *oo = &s->options;
|
||||||
struct mouse_event *m = &c->tty.mouse;
|
struct mouse_event *m = &c->tty.mouse;
|
||||||
@ -334,8 +337,8 @@ server_client_check_mouse(struct client *c, struct window_pane *wp)
|
|||||||
|
|
||||||
/* Update last and pass through to client. */
|
/* Update last and pass through to client. */
|
||||||
window_pane_mouse(wp, c->session, m);
|
window_pane_mouse(wp, c->session, m);
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/* Is this fast enough to probably be a paste? */
|
/* Is this fast enough to probably be a paste? */
|
||||||
int
|
int
|
||||||
@ -357,9 +360,6 @@ server_client_assume_paste(struct session *s)
|
|||||||
void
|
void
|
||||||
server_client_handle_key(struct client *c, int key)
|
server_client_handle_key(struct client *c, int key)
|
||||||
{
|
{
|
||||||
#ifdef TMATE_SLAVE
|
|
||||||
tmate_client_key(key);
|
|
||||||
#else
|
|
||||||
struct session *s;
|
struct session *s;
|
||||||
struct window *w;
|
struct window *w;
|
||||||
struct window_pane *wp;
|
struct window_pane *wp;
|
||||||
@ -390,10 +390,17 @@ server_client_handle_key(struct client *c, int key)
|
|||||||
if (c->flags & CLIENT_IDENTIFY && key >= '0' && key <= '9') {
|
if (c->flags & CLIENT_IDENTIFY && key >= '0' && key <= '9') {
|
||||||
if (c->flags & CLIENT_READONLY)
|
if (c->flags & CLIENT_READONLY)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#ifdef TMATE_SLAVE
|
||||||
|
wp = window_pane_at_index(w, key - '0');
|
||||||
|
if (wp != NULL && window_pane_visible(wp))
|
||||||
|
tmate_client_set_active_pane(w->id, wp->id);
|
||||||
|
#else
|
||||||
window_unzoom(w);
|
window_unzoom(w);
|
||||||
wp = window_pane_at_index(w, key - '0');
|
wp = window_pane_at_index(w, key - '0');
|
||||||
if (wp != NULL && window_pane_visible(wp))
|
if (wp != NULL && window_pane_visible(wp))
|
||||||
window_set_active_pane(w, wp);
|
window_set_active_pane(w, wp);
|
||||||
|
#endif
|
||||||
server_clear_identify(c);
|
server_clear_identify(c);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -485,7 +492,6 @@ server_client_handle_key(struct client *c, int key)
|
|||||||
|
|
||||||
/* Dispatch the command. */
|
/* Dispatch the command. */
|
||||||
key_bindings_dispatch(bd, c);
|
key_bindings_dispatch(bd, c);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Client functions that need to happen every loop. */
|
/* Client functions that need to happen every loop. */
|
||||||
|
@ -20,14 +20,13 @@ void tmate_encoder_init(struct tmate_encoder *encoder)
|
|||||||
msgpack_packer_init(&encoder->pk, encoder, &msgpack_write);
|
msgpack_packer_init(&encoder->pk, encoder, &msgpack_write);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define pack(what, ...) msgpack_pack_##what(&tmate_encoder->pk, __VA_ARGS__)
|
#define msgpack_pack_string(pk, str) do { \
|
||||||
|
int __strlen = strlen(str); \
|
||||||
|
msgpack_pack_raw(pk, __strlen); \
|
||||||
|
msgpack_pack_raw_body(pk, str, __strlen); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
void tmate_client_key(int key)
|
#define pack(what, ...) msgpack_pack_##what(&tmate_encoder->pk, __VA_ARGS__)
|
||||||
{
|
|
||||||
pack(array, 2);
|
|
||||||
pack(int, TMATE_CLIENT_KEY);
|
|
||||||
pack(int, key);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tmate_client_resize(u_int sx, u_int sy)
|
void tmate_client_resize(u_int sx, u_int sy)
|
||||||
{
|
{
|
||||||
@ -37,3 +36,46 @@ void tmate_client_resize(u_int sx, u_int sy)
|
|||||||
pack(int, sx);
|
pack(int, sx);
|
||||||
pack(int, sy);
|
pack(int, sy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tmate_client_pane_key(int pane_id, int key)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* We don't specify the pane id because the current active pane is
|
||||||
|
* behind, so we'll let master send the key to its active pane.
|
||||||
|
*/
|
||||||
|
|
||||||
|
pack(array, 2);
|
||||||
|
pack(int, TMATE_CLIENT_PANE_KEY);
|
||||||
|
pack(int, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct cmd_entry *local_cmds[] = {
|
||||||
|
&cmd_detach_client_entry,
|
||||||
|
&cmd_attach_session_entry,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
int tmate_should_exec_cmd_locally(const struct cmd_entry *cmd)
|
||||||
|
{
|
||||||
|
const struct cmd_entry **ptr;
|
||||||
|
|
||||||
|
for (ptr = local_cmds; *ptr; ptr++)
|
||||||
|
if (*ptr == cmd)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tmate_client_cmd(const char *cmd)
|
||||||
|
{
|
||||||
|
pack(array, 2);
|
||||||
|
pack(int, TMATE_CLIENT_CMD);
|
||||||
|
pack(string, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tmate_client_set_active_pane(int win_id, int pane_id)
|
||||||
|
{
|
||||||
|
char cmd[1024];
|
||||||
|
|
||||||
|
sprintf(cmd, "select-pane -t %d.%d", win_id, pane_id);
|
||||||
|
tmate_client_cmd(cmd);
|
||||||
|
}
|
||||||
|
10
tmate.h
10
tmate.h
@ -14,9 +14,10 @@
|
|||||||
|
|
||||||
/* tmate-encoder.c */
|
/* tmate-encoder.c */
|
||||||
|
|
||||||
enum tmate_notifications {
|
enum tmate_client_commands {
|
||||||
TMATE_CLIENT_KEY,
|
TMATE_CLIENT_PANE_KEY,
|
||||||
TMATE_CLIENT_RESIZE,
|
TMATE_CLIENT_RESIZE,
|
||||||
|
TMATE_CLIENT_CMD,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct tmate_encoder {
|
struct tmate_encoder {
|
||||||
@ -30,8 +31,11 @@ extern void tmate_encoder_init(struct tmate_encoder *encoder);
|
|||||||
extern void tmate_write_header(void);
|
extern void tmate_write_header(void);
|
||||||
extern void tmate_write_pane(int pane, const char *data, size_t size);
|
extern void tmate_write_pane(int pane, const char *data, size_t size);
|
||||||
|
|
||||||
extern void tmate_client_key(int key);
|
|
||||||
extern void tmate_client_resize(u_int sx, u_int sy);
|
extern void tmate_client_resize(u_int sx, u_int sy);
|
||||||
|
extern void tmate_client_pane_key(int pane_id, int key);
|
||||||
|
extern void tmate_client_cmd(const char *cmd);
|
||||||
|
extern void tmate_client_set_active_pane(int win_id, int pane_id);
|
||||||
|
extern int tmate_should_exec_cmd_locally(const struct cmd_entry *cmd);
|
||||||
|
|
||||||
/* tmate-decoder.c */
|
/* tmate-decoder.c */
|
||||||
|
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "tmux.h"
|
#include "tmux.h"
|
||||||
#include "tmate.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Handle keys input from the outside terminal. tty_default_*_keys[] are a base
|
* Handle keys input from the outside terminal. tty_default_*_keys[] are a base
|
||||||
|
13
window.c
13
window.c
@ -30,6 +30,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "tmux.h"
|
#include "tmux.h"
|
||||||
|
#include "tmate.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Each window is attached to a number of panes, each of which is a pty. This
|
* Each window is attached to a number of panes, each of which is a pty. This
|
||||||
@ -1039,10 +1040,13 @@ window_pane_reset_mode(struct window_pane *wp)
|
|||||||
wp->flags |= PANE_REDRAW;
|
wp->flags |= PANE_REDRAW;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef TMATE_SLAVE
|
|
||||||
void
|
void
|
||||||
window_pane_key(struct window_pane *wp, struct session *sess, int key)
|
window_pane_key(struct window_pane *wp, struct session *sess, int key)
|
||||||
{
|
{
|
||||||
|
#ifdef TMATE_SLAVE
|
||||||
|
tmate_client_pane_key(wp->id, key);
|
||||||
|
#else
|
||||||
|
|
||||||
struct window_pane *wp2;
|
struct window_pane *wp2;
|
||||||
|
|
||||||
if (!window_pane_visible(wp))
|
if (!window_pane_visible(wp))
|
||||||
@ -1065,12 +1069,17 @@ window_pane_key(struct window_pane *wp, struct session *sess, int key)
|
|||||||
input_key(wp2, key);
|
input_key(wp2, key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
window_pane_mouse(
|
window_pane_mouse(
|
||||||
struct window_pane *wp, struct session *sess, struct mouse_event *m)
|
struct window_pane *wp, struct session *sess, struct mouse_event *m)
|
||||||
{
|
{
|
||||||
|
#ifdef TMATE_SLAVE
|
||||||
|
/* TODO Deal with mouse */
|
||||||
|
return;
|
||||||
|
#else
|
||||||
if (!window_pane_visible(wp))
|
if (!window_pane_visible(wp))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -1087,8 +1096,8 @@ window_pane_mouse(
|
|||||||
wp->mode->mouse(wp, sess, m);
|
wp->mode->mouse(wp, sess, m);
|
||||||
} else if (wp->fd != -1)
|
} else if (wp->fd != -1)
|
||||||
input_mouse(wp, sess, m);
|
input_mouse(wp, sess, m);
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
window_pane_visible(struct window_pane *wp)
|
window_pane_visible(struct window_pane *wp)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user