aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--input-keys.c2
-rw-r--r--input.c17
-rw-r--r--tmux.h5
3 files changed, 22 insertions, 2 deletions
diff --git a/input-keys.c b/input-keys.c
index b7c02ccd..07f102b8 100644
--- a/input-keys.c
+++ b/input-keys.c
@@ -496,6 +496,8 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key)
}
/* No builtin key sequence; construct an extended key sequence. */
+ if (~s->mode & MODE_KEXTENDED)
+ goto missing;
outkey = (key & KEYC_MASK_KEY);
if (outkey >= KEYC_BASE) {
switch (outkey) {
diff --git a/input.c b/input.c
index 70681e61..a8ca9478 100644
--- a/input.c
+++ b/input.c
@@ -241,6 +241,8 @@ enum input_csi_type {
INPUT_CSI_HPA,
INPUT_CSI_ICH,
INPUT_CSI_IL,
+ INPUT_CSI_MODOFF,
+ INPUT_CSI_MODSET,
INPUT_CSI_RCP,
INPUT_CSI_REP,
INPUT_CSI_RM,
@@ -288,7 +290,9 @@ static const struct input_table_entry input_csi_table[] = {
{ 'h', "?", INPUT_CSI_SM_PRIVATE },
{ 'l', "", INPUT_CSI_RM },
{ 'l', "?", INPUT_CSI_RM_PRIVATE },
+ { 'm', ">", INPUT_CSI_MODSET },
{ 'm', "", INPUT_CSI_SGR },
+ { 'n', ">", INPUT_CSI_MODOFF },
{ 'n', "", INPUT_CSI_DSR },
{ 'q', " ", INPUT_CSI_DECSCUSR },
{ 'q', ">", INPUT_CSI_XDA },
@@ -1380,6 +1384,19 @@ input_csi_dispatch(struct input_ctx *ictx)
if (n != -1 && m != -1)
screen_write_cursormove(sctx, m - 1, n - 1, 1);
break;
+ case INPUT_CSI_MODSET:
+ n = input_get(ictx, 0, 1, 1);
+ m = input_get(ictx, 1, 1, 1);
+ if (n == 0 || (n == 4 && m == 0))
+ screen_write_mode_clear(sctx, MODE_KEXTENDED);
+ else if (n == 4 && (m == 1 || m == 2))
+ screen_write_mode_set(sctx, MODE_KEXTENDED);
+ break;
+ case INPUT_CSI_MODOFF:
+ n = input_get(ictx, 0, 1, 1);
+ if (n == 4)
+ screen_write_mode_clear(sctx, MODE_KEXTENDED);
+ break;
case INPUT_CSI_WINOPS:
input_csi_dispatch_winops(ictx);
break;
diff --git a/tmux.h b/tmux.h
index d814aa6c..65164ccc 100644
--- a/tmux.h
+++ b/tmux.h
@@ -579,8 +579,8 @@ struct msg_write_close {
#define MODE_CURSOR 0x1
#define MODE_INSERT 0x2
#define MODE_KCURSOR 0x4
-#define MODE_KKEYPAD 0x8 /* set = application, clear = number */
-#define MODE_WRAP 0x10 /* whether lines wrap */
+#define MODE_KKEYPAD 0x8
+#define MODE_WRAP 0x10
#define MODE_MOUSE_STANDARD 0x20
#define MODE_MOUSE_BUTTON 0x40
#define MODE_BLINKING 0x80
@@ -591,6 +591,7 @@ struct msg_write_close {
#define MODE_MOUSE_ALL 0x1000
#define MODE_ORIGIN 0x2000
#define MODE_CRLF 0x4000
+#define MODE_KEXTENDED 0x8000
#define ALL_MODES 0xffffff
#define ALL_MOUSE_MODES (MODE_MOUSE_STANDARD|MODE_MOUSE_BUTTON|MODE_MOUSE_ALL)