summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm>2014-01-31 11:17:20 +0000
committernicm <nicm>2014-01-31 11:17:20 +0000
commit1935eb5c1ea697762a142ca5353ade82d9a372a1 (patch)
tree4c4c35686af8d27a138b1ca79cee32fefbc4f58d
parent62e0ed5d7eac5470e4ad2fbde5034d3fa72343c0 (diff)
Add \033[18t window operations from J Raynor.
-rw-r--r--input.c57
1 files changed, 56 insertions, 1 deletions
diff --git a/input.c b/input.c
index e27250ed..58064ddd 100644
--- a/input.c
+++ b/input.c
@@ -74,6 +74,7 @@ void input_csi_dispatch_rm(struct input_ctx *);
void input_csi_dispatch_rm_private(struct input_ctx *);
void input_csi_dispatch_sm(struct input_ctx *);
void input_csi_dispatch_sm_private(struct input_ctx *);
+void input_csi_dispatch_winops(struct input_ctx *);
void input_csi_dispatch_sgr(struct input_ctx *);
int input_dcs_dispatch(struct input_ctx *);
int input_utf8_open(struct input_ctx *);
@@ -154,6 +155,7 @@ enum input_csi_type {
INPUT_CSI_SM_PRIVATE,
INPUT_CSI_TBC,
INPUT_CSI_VPA,
+ INPUT_CSI_WINOPS,
};
/* Control (CSI) command table. */
@@ -188,6 +190,7 @@ const struct input_table_entry input_csi_table[] = {
{ 'q', " ", INPUT_CSI_DECSCUSR },
{ 'r', "", INPUT_CSI_DECSTBM },
{ 's', "", INPUT_CSI_SCP },
+ { 't', "", INPUT_CSI_WINOPS },
{ 'u', "", INPUT_CSI_RCP },
};
@@ -1077,7 +1080,7 @@ input_csi_dispatch(struct input_ctx *ictx)
struct screen_write_ctx *sctx = &ictx->ctx;
struct screen *s = sctx->s;
struct input_table_entry *entry;
- int n, m;
+ int n, m;
if (ictx->flags & INPUT_DISCARD)
return (0);
@@ -1117,6 +1120,9 @@ input_csi_dispatch(struct input_ctx *ictx)
m = input_get(ictx, 1, 1, 1);
screen_write_cursormove(sctx, m - 1, n - 1);
break;
+ case INPUT_CSI_WINOPS:
+ input_csi_dispatch_winops(ictx);
+ break;
case INPUT_CSI_CUU:
screen_write_cursorup(sctx, input_get(ictx, 0, 1, 1));
break;
@@ -1430,6 +1436,55 @@ input_csi_dispatch_sm_private(struct input_ctx *ictx)
}
}
+/* Handle CSI window operations. */
+void
+input_csi_dispatch_winops(struct input_ctx *ictx)
+{
+ struct window_pane *wp = ictx->wp;
+ int n, m;
+
+ m = 0;
+ while ((n = input_get(ictx, m, 0, -1)) != -1) {
+ switch (n) {
+ case 1:
+ case 2:
+ case 5:
+ case 6:
+ case 7:
+ case 11:
+ case 13:
+ case 14:
+ case 19:
+ case 20:
+ case 21:
+ case 24:
+ break;
+ case 3:
+ case 4:
+ case 8:
+ m++;
+ if (input_get(ictx, m, 0, -1) == -1)
+ return;
+ /* FALLTHROUGH */
+ case 9:
+ case 10:
+ case 22:
+ case 23:
+ m++;
+ if (input_get(ictx, m, 0, -1) == -1)
+ return;
+ break;
+ case 18:
+ input_reply(ictx, "\033[8;%u;%u", wp->sy, wp->sx);
+ break;
+ default:
+ log_debug("%s: unknown '%c'", __func__, ictx->ch);
+ break;
+ }
+ m++;
+ }
+}
+
/* Handle CSI SGR. */
void
input_csi_dispatch_sgr(struct input_ctx *ictx)