1
0
mirror of https://github.com/tmate-io/tmate-ssh-server.git synced 2020-11-18 19:53:51 -08:00

Sending raw tmux keycodes

This commit is contained in:
Nicolas Viennot 2015-12-30 13:39:36 -05:00
parent 1a48abd0be
commit 5fce53f904
7 changed files with 156 additions and 10 deletions

View File

@ -178,6 +178,7 @@ dist_tmate_slave_SOURCES = \
tmate-debug.c \
tmate-daemon-decoder.c \
tmate-daemon-encoder.c \
tmate-daemon-legacy.c \
tmate-msgpack.c \
tmate-proxy.c \
tmate-slave.c \

View File

@ -589,14 +589,12 @@ server_client_handle_key(struct client *c, key_code key)
if (c->flags & CLIENT_READONLY)
return;
#ifdef TMATE_SLAVE
wp = window_pane_at_index(w, key - '0');
if (wp != NULL && window_pane_visible(wp))
tmate_client_set_active_pane(c->id, key - '0', wp->id);
#else
window_unzoom(w);
wp = window_pane_at_index(w, key - '0');
if (wp != NULL && window_pane_visible(wp))
#ifdef TMATE_SLAVE
tmate_client_set_active_pane(c->id, key - '0', wp->id);
#else
window_set_active_pane(w, wp);
#endif
server_clear_identify(c);

View File

@ -23,7 +23,7 @@ static void tmate_header(struct tmate_session *session,
client_version = unpack_string(uk);
}
tmate_notice("new master, client version: %s, protocol version: %d",
tmate_notice("Daemon header: client version: %s, protocol version: %d",
client_version, session->client_protocol_version);
#if 0

View File

@ -81,7 +81,7 @@ void tmate_client_resize(u_int sx, u_int sy)
pack(int, sy);
}
void tmate_client_pane_key(int pane_id, int key)
void tmate_client_legacy_pane_key(__unused int pane_id, int key)
{
/*
* We don't specify the pane id because the current active pane is
@ -89,10 +89,31 @@ void tmate_client_pane_key(int pane_id, int key)
*/
pack(array, 2);
pack(int, TMATE_IN_PANE_KEY);
pack(int, TMATE_IN_LEGACY_PANE_KEY);
pack(int, key);
}
void tmate_client_pane_key(int pane_id, key_code key)
{
if (key == KEYC_NONE || key == KEYC_UNKNOWN)
return;
/* Mouse keys not supported yet */
if (KEYC_IS_MOUSE(key))
return;
if (tmate_session->client_protocol_version < 5) {
int legacy_key = tmate_translate_legacy_key(key);
tmate_client_legacy_pane_key(pane_id, legacy_key);
return;
}
pack(array, 3);
pack(int, TMATE_IN_PANE_KEY);
pack(int, pane_id);
pack(uint64, key);
}
extern const struct cmd_entry cmd_bind_key_entry;
extern const struct cmd_entry cmd_unbind_key_entry;
extern const struct cmd_entry cmd_set_option_entry;

120
tmate-daemon-legacy.c Normal file
View File

@ -0,0 +1,120 @@
#include "tmate.h"
#define LEGACY_KEYC_NONE 0xfff
#define LEGACY_KEYC_BASE 0x1000
#define LEGACY_KEYC_ESCAPE 0x2000
#define LEGACY_KEYC_CTRL 0x4000
#define LEGACY_KEYC_SHIFT 0x8000
#define LEGACY_KEYC_PREFIX 0x10000
enum legacy_key_code {
LEGACY_KEYC_MOUSE = LEGACY_KEYC_BASE,
LEGACY_KEYC_BSPACE,
LEGACY_KEYC_F1,
LEGACY_KEYC_F2,
LEGACY_KEYC_F3,
LEGACY_KEYC_F4,
LEGACY_KEYC_F5,
LEGACY_KEYC_F6,
LEGACY_KEYC_F7,
LEGACY_KEYC_F8,
LEGACY_KEYC_F9,
LEGACY_KEYC_F10,
LEGACY_KEYC_F11,
LEGACY_KEYC_F12,
LEGACY_KEYC_F13,
LEGACY_KEYC_F14,
LEGACY_KEYC_F15,
LEGACY_KEYC_F16,
LEGACY_KEYC_F17,
LEGACY_KEYC_F18,
LEGACY_KEYC_F19,
LEGACY_KEYC_F20,
LEGACY_KEYC_IC,
LEGACY_KEYC_DC,
LEGACY_KEYC_HOME,
LEGACY_KEYC_END,
LEGACY_KEYC_NPAGE,
LEGACY_KEYC_PPAGE,
LEGACY_KEYC_BTAB,
LEGACY_KEYC_UP,
LEGACY_KEYC_DOWN,
LEGACY_KEYC_LEFT,
LEGACY_KEYC_RIGHT,
LEGACY_KEYC_KP_SLASH,
LEGACY_KEYC_KP_STAR,
LEGACY_KEYC_KP_MINUS,
LEGACY_KEYC_KP_SEVEN,
LEGACY_KEYC_KP_EIGHT,
LEGACY_KEYC_KP_NINE,
LEGACY_KEYC_KP_PLUS,
LEGACY_KEYC_KP_FOUR,
LEGACY_KEYC_KP_FIVE,
LEGACY_KEYC_KP_SIX,
LEGACY_KEYC_KP_ONE,
LEGACY_KEYC_KP_TWO,
LEGACY_KEYC_KP_THREE,
LEGACY_KEYC_KP_ENTER,
LEGACY_KEYC_KP_ZERO,
LEGACY_KEYC_KP_PERIOD,
LEGACY_KEYC_FOCUS_IN,
LEGACY_KEYC_FOCUS_OUT,
};
int tmate_translate_legacy_key(key_code key)
{
int lkey;
switch(key & KEYC_MASK_KEY) {
case KEYC_BSPACE: lkey = LEGACY_KEYC_BSPACE; break;
case KEYC_F1: lkey = LEGACY_KEYC_F1; break;
case KEYC_F2: lkey = LEGACY_KEYC_F2; break;
case KEYC_F3: lkey = LEGACY_KEYC_F3; break;
case KEYC_F4: lkey = LEGACY_KEYC_F4; break;
case KEYC_F5: lkey = LEGACY_KEYC_F5; break;
case KEYC_F6: lkey = LEGACY_KEYC_F6; break;
case KEYC_F7: lkey = LEGACY_KEYC_F7; break;
case KEYC_F8: lkey = LEGACY_KEYC_F8; break;
case KEYC_F9: lkey = LEGACY_KEYC_F9; break;
case KEYC_F10: lkey = LEGACY_KEYC_F10; break;
case KEYC_F11: lkey = LEGACY_KEYC_F11; break;
case KEYC_F12: lkey = LEGACY_KEYC_F12; break;
case KEYC_IC: lkey = LEGACY_KEYC_IC; break;
case KEYC_DC: lkey = LEGACY_KEYC_DC; break;
case KEYC_HOME: lkey = LEGACY_KEYC_HOME; break;
case KEYC_END: lkey = LEGACY_KEYC_END; break;
case KEYC_NPAGE: lkey = LEGACY_KEYC_NPAGE; break;
case KEYC_PPAGE: lkey = LEGACY_KEYC_PPAGE; break;
case KEYC_BTAB: lkey = LEGACY_KEYC_BTAB; break;
case KEYC_UP: lkey = LEGACY_KEYC_UP; break;
case KEYC_DOWN: lkey = LEGACY_KEYC_DOWN; break;
case KEYC_LEFT: lkey = LEGACY_KEYC_LEFT; break;
case KEYC_RIGHT: lkey = LEGACY_KEYC_RIGHT; break;
case KEYC_KP_SLASH: lkey = LEGACY_KEYC_KP_SLASH; break;
case KEYC_KP_STAR: lkey = LEGACY_KEYC_KP_STAR; break;
case KEYC_KP_MINUS: lkey = LEGACY_KEYC_KP_MINUS; break;
case KEYC_KP_SEVEN: lkey = LEGACY_KEYC_KP_SEVEN; break;
case KEYC_KP_EIGHT: lkey = LEGACY_KEYC_KP_EIGHT; break;
case KEYC_KP_NINE: lkey = LEGACY_KEYC_KP_NINE; break;
case KEYC_KP_PLUS: lkey = LEGACY_KEYC_KP_PLUS; break;
case KEYC_KP_FOUR: lkey = LEGACY_KEYC_KP_FOUR; break;
case KEYC_KP_FIVE: lkey = LEGACY_KEYC_KP_FIVE; break;
case KEYC_KP_SIX: lkey = LEGACY_KEYC_KP_SIX; break;
case KEYC_KP_ONE: lkey = LEGACY_KEYC_KP_ONE; break;
case KEYC_KP_TWO: lkey = LEGACY_KEYC_KP_TWO; break;
case KEYC_KP_THREE: lkey = LEGACY_KEYC_KP_THREE; break;
case KEYC_KP_ENTER: lkey = LEGACY_KEYC_KP_ENTER; break;
case KEYC_KP_ZERO: lkey = LEGACY_KEYC_KP_ZERO; break;
case KEYC_KP_PERIOD: lkey = LEGACY_KEYC_KP_PERIOD; break;
case KEYC_FOCUS_IN: lkey = LEGACY_KEYC_FOCUS_IN; break;
case KEYC_FOCUS_OUT: lkey = LEGACY_KEYC_FOCUS_OUT; break;
default: lkey = key & KEYC_MASK_KEY;
}
if (key & KEYC_ESCAPE) lkey |= LEGACY_KEYC_ESCAPE;
if (key & KEYC_CTRL) lkey |= LEGACY_KEYC_CTRL;
if (key & KEYC_SHIFT) lkey |= LEGACY_KEYC_SHIFT;
return lkey;
}

View File

@ -69,11 +69,12 @@ enum tmate_daemon_out_msg_types {
enum tmate_daemon_in_msg_types {
TMATE_IN_NOTIFY,
TMATE_IN_PANE_KEY,
TMATE_IN_LEGACY_PANE_KEY,
TMATE_IN_RESIZE,
TMATE_IN_EXEC_CMD,
TMATE_IN_SET_ENV,
TMATE_IN_READY,
TMATE_IN_PANE_KEY,
};
/*

View File

@ -92,7 +92,8 @@ extern void printflike(1, 2) tmate_notify(const char *fmt, ...);
extern void printflike(2, 3) tmate_notify_later(int timeout, const char *fmt, ...);
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_legacy_client_pane_key(int pane_id, int key);
extern void tmate_client_pane_key(int pane_id, key_code key);
extern void tmate_client_cmd(int client_id, const char *cmd);
extern void tmate_client_set_active_pane(int client_id, int win_idx, int pane_id);
extern int tmate_should_exec_cmd_locally(const struct cmd_entry *cmd);
@ -100,6 +101,10 @@ extern void tmate_send_env(const char *name, const char *value);
extern void tmate_send_client_ready(void);
extern void tmate_send_mc_obj(msgpack_object *obj);
/* tmate-daemon-legacy.c */
extern int tmate_translate_legacy_key(key_code key);
/* tmate-daemon-decoder.c */
#define TMATE_HLIMIT 2000