Update of /cvsroot/tmux/tmux
In directory vz-cvs-2.sog:/tmp/cvs-serv17438

Modified Files:
        input.c screen-write.c tmux.h tty.c 
Log Message:
Sync OpenBSD patchset 866:

Support passing through escape sequences to the underlying terminal by
using DCS with a "tmux;" prefix. Escape characters in the sequences must
be doubled. For example:

$ printf '\033Ptmux;\033\033]12;red\007\033\\'

Will pass \033]12;red\007 to the terminal (and change the cursor colour
in xterm). From Kevin Goodsell.


Index: tty.c
===================================================================
RCS file: /cvsroot/tmux/tmux/tty.c,v
retrieving revision 1.203
retrieving revision 1.204
diff -u -d -r1.203 -r1.204
--- tty.c       15 Feb 2011 15:24:00 -0000      1.203
+++ tty.c       19 Mar 2011 23:30:37 -0000      1.204
@@ -932,6 +932,16 @@
 }
 
 void
+tty_cmd_rawstring(struct tty *tty, const struct tty_ctx *ctx)
+{
+       u_int    i;
+       u_char  *str = ctx->ptr;
+
+       for (i = 0; i < ctx->num; i++)
+               tty_putc(tty, str[i]);
+}
+
+void
 tty_cell(
     struct tty *tty, const struct grid_cell *gc, const struct grid_utf8 *gu)
 {

Index: input.c
===================================================================
RCS file: /cvsroot/tmux/tmux/input.c,v
retrieving revision 1.116
retrieving revision 1.117
diff -u -d -r1.116 -r1.117
--- input.c     19 Mar 2011 23:28:30 -0000      1.116
+++ input.c     19 Mar 2011 23:30:37 -0000      1.117
@@ -41,6 +41,9 @@
  *
  * - A state for the screen \033k...\033\\ sequence to rename a window. This is
  *   pretty stupid but not supporting it is more trouble than it is worth.
+ *
+ * - Special handling for ESC inside a DCS to allow arbitrary byte sequences to
+ *   be passed to the underlying teminal(s).
  */
 
 /* Helper functions. */
@@ -50,8 +53,6 @@
 
 /* Transition entry/exit handlers. */
 void   input_clear(struct input_ctx *);
-void   input_enter_dcs(struct input_ctx *);
-void   input_exit_dcs(struct input_ctx *);
 void   input_enter_osc(struct input_ctx *);
 void   input_exit_osc(struct input_ctx *);
 void   input_enter_apc(struct input_ctx *);
@@ -68,6 +69,7 @@
 int    input_esc_dispatch(struct input_ctx *);
 int    input_csi_dispatch(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 *);
 int    input_utf8_add(struct input_ctx *);
 int    input_utf8_close(struct input_ctx *);
@@ -204,6 +206,7 @@
 const struct input_transition input_state_dcs_parameter_table[];
 const struct input_transition input_state_dcs_intermediate_table[];
 const struct input_transition input_state_dcs_handler_table[];
+const struct input_transition input_state_dcs_escape_table[];
 const struct input_transition input_state_dcs_ignore_table[];
 const struct input_transition input_state_osc_string_table[];
 const struct input_transition input_state_apc_string_table[];
@@ -286,10 +289,17 @@
 /* dcs_handler state definition. */
 const struct input_state input_state_dcs_handler = {
        "dcs_handler",
-       input_enter_dcs, input_exit_dcs,
+       NULL, NULL,
        input_state_dcs_handler_table
 };
 
+/* dcs_escape state definition. */
+const struct input_state input_state_dcs_escape = {
+       "dcs_escape",
+       NULL, NULL,
+       input_state_dcs_escape_table
+};
+
 /* dcs_ignore state definition. */
 const struct input_state input_state_dcs_ignore = {
        "dcs_ignore",
@@ -482,7 +492,7 @@
        { 0x3a, 0x3a, NULL,               &input_state_dcs_ignore },
        { 0x3b, 0x3b, input_parameter,    &input_state_dcs_parameter },
        { 0x3c, 0x3f, input_intermediate, &input_state_dcs_parameter },
-       { 0x40, 0x7e, NULL,               &input_state_dcs_handler },
+       { 0x40, 0x7e, input_input,        &input_state_dcs_handler },
        { 0x7f, 0xff, NULL,               NULL },
 
        { -1, -1, NULL, NULL }
@@ -500,7 +510,7 @@
        { 0x3a, 0x3a, NULL,               &input_state_dcs_ignore },
        { 0x3b, 0x3b, input_parameter,    NULL },
        { 0x3c, 0x3f, NULL,               &input_state_dcs_ignore },
-       { 0x40, 0x7e, NULL,               &input_state_dcs_handler },
+       { 0x40, 0x7e, input_input,        &input_state_dcs_handler },
        { 0x7f, 0xff, NULL,               NULL },
 
        { -1, -1, NULL, NULL }
@@ -515,7 +525,7 @@
        { 0x1c, 0x1f, NULL,               NULL },
        { 0x20, 0x2f, input_intermediate, NULL },
        { 0x30, 0x3f, NULL,               &input_state_dcs_ignore },
-       { 0x40, 0x7e, NULL,               &input_state_dcs_handler },
+       { 0x40, 0x7e, input_input,        &input_state_dcs_handler },
        { 0x7f, 0xff, NULL,               NULL },
 
        { -1, -1, NULL, NULL }
@@ -523,13 +533,22 @@
 
 /* dcs_handler state table. */
 const struct input_transition input_state_dcs_handler_table[] = {
-       INPUT_STATE_ANYWHERE,
+       /* No INPUT_STATE_ANYWHERE */
 
-       { 0x00, 0x17, NULL,         NULL },
-       { 0x19, 0x19, input_input,  NULL },
-       { 0x1c, 0x1f, input_input,  NULL },
-       { 0x20, 0x7e, input_input,  NULL },
-       { 0x7f, 0xff, NULL,         NULL },
+       { 0x00, 0x1a, input_input,  NULL },
+       { 0x1b, 0x1b, NULL,         &input_state_dcs_escape },
+       { 0x1c, 0xff, input_input,  NULL },
+
+       { -1, -1, NULL, NULL }
+};
+
+/* dcs_escape state table. */
+const struct input_transition input_state_dcs_escape_table[] = {
+       /* No INPUT_STATE_ANYWHERE */
+
+       { 0x00, 0x5b, input_input,        &input_state_dcs_handler },
+       { 0x5c, 0x5c, input_dcs_dispatch, &input_state_ground },
+       { 0x5d, 0xff, input_input,        &input_state_dcs_handler },
 
        { -1, -1, NULL, NULL }
 };
@@ -1391,20 +1410,26 @@
        }
 }
 
-/* DCS string started. */
-void
-input_enter_dcs(struct input_ctx *ictx)
+/* DCS terminator (ST) received. */
+int
+input_dcs_dispatch(struct input_ctx *ictx)
 {
-       log_debug("%s", __func__);
+       const char      prefix[] = "tmux;";
+       const u_int     prefix_len = (sizeof prefix) - 1;
 
-       input_clear(ictx);
-}
+       if (ictx->flags & INPUT_DISCARD)
+               return (0);
 
-/* DCS terminator (ST) received. */
-void
-input_exit_dcs(unused struct input_ctx *ictx)
-{
-       log_debug("%s", __func__);
+       log_debug("%s: \"%s\"", __func__, ictx->input_buf);
+
+       /* Check for tmux prefix. */
+       if (ictx->input_len >= prefix_len &&
+           strncmp(ictx->input_buf, prefix, prefix_len) == 0) {
+               screen_write_rawstring(&ictx->ctx,
+                   ictx->input_buf + prefix_len, ictx->input_len - prefix_len);
+       }
+
+       return (0);
 }
 
 /* OSC string started. */

Index: screen-write.c
===================================================================
RCS file: /cvsroot/tmux/tmux/screen-write.c,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -d -r1.93 -r1.94
--- screen-write.c      15 Feb 2011 15:10:47 -0000      1.93
+++ screen-write.c      19 Mar 2011 23:30:37 -0000      1.94
@@ -1191,3 +1191,15 @@
                grid_view_set_cell(gd, xx, s->cy, &grid_default_cell);
        }
 }
+
+void
+screen_write_rawstring(struct screen_write_ctx *ctx, u_char *str, u_int len)
+{
+       struct tty_ctx           ttyctx;
+
+       screen_write_initctx(ctx, &ttyctx, 0);
+       ttyctx.ptr = str;
+       ttyctx.num = len;
+
+       tty_write(tty_cmd_rawstring, &ttyctx);
+}

Index: tmux.h
===================================================================
RCS file: /cvsroot/tmux/tmux/tmux.h,v
retrieving revision 1.611
retrieving revision 1.612
diff -u -d -r1.611 -r1.612
--- tmux.h      19 Mar 2011 23:27:35 -0000      1.611
+++ tmux.h      19 Mar 2011 23:30:37 -0000      1.612
@@ -1422,6 +1422,7 @@
 void   tty_cmd_linefeed(struct tty *, const struct tty_ctx *);
 void   tty_cmd_utf8character(struct tty *, const struct tty_ctx *);
 void   tty_cmd_reverseindex(struct tty *, const struct tty_ctx *);
+void   tty_cmd_rawstring(struct tty *, const struct tty_ctx *);
 
 /* tty-term.c */
 extern struct tty_terms tty_terms;
@@ -1800,6 +1801,7 @@
 void    screen_write_clearscreen(struct screen_write_ctx *);
 void    screen_write_cell(struct screen_write_ctx *,
             const struct grid_cell *, const struct utf8_data *);
+void    screen_write_rawstring(struct screen_write_ctx *, u_char *, u_int);
 
 /* screen-redraw.c */
 void    screen_redraw_screen(struct client *, int, int);


------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
_______________________________________________
tmux-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-cvs

Reply via email to