From 843779a3e0024648cc009e86f5bf5d85929e1a1e Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 1 Oct 2007 17:37:41 +0000 Subject: [PATCH] Restore window title handling. --- CHANGES | 3 ++- NOTES | 2 +- TODO | 3 ++- input.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- tmux.h | 6 +++++- 5 files changed, 63 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index e55a5ae7..c7527830 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,6 @@ 01 October 2007 +* (nicm) Restore window title handling. * (nicm) Simple uncustomisable status line with window list. 30 September 2007 @@ -84,5 +85,5 @@ (including mutt, emacs). No status bar yet and no key remapping or other customisation. -$Id: CHANGES,v 1.19 2007-10-01 14:53:29 nicm Exp $ +$Id: CHANGES,v 1.20 2007-10-01 17:37:41 nicm Exp $ diff --git a/NOTES b/NOTES index 9818d270..02c981df 100644 --- a/NOTES +++ b/NOTES @@ -54,7 +54,7 @@ with "-s " but it shouldn't normally be required. You can set the window title (listed in -l), using the \e] escape sequence. For example: - $ echo -n \\033]0;My Title\\007 + $ echo -n \\033]0\;My Title\\007 There is currently no method for setting the window name (what will eventually be shown in the status bar). diff --git a/TODO b/TODO index f2e1c573..4289f8a5 100644 --- a/TODO +++ b/TODO @@ -37,5 +37,6 @@ - store_attr/colr could be two-pass and avoid reverse_add/remove games - window creation/idle time - attributes could be 8 not 16 bits -- put title setting back - profile/optimise, particularly (i suspect) input.c +- tidy up input.c a bit +- decide about customised status line diff --git a/input.c b/input.c index 31bfd7ce..b82eae2c 100644 --- a/input.c +++ b/input.c @@ -1,4 +1,4 @@ -/* $Id: input.c,v 1.15 2007-10-01 14:18:42 nicm Exp $ */ +/* $Id: input.c,v 1.16 2007-10-01 17:37:41 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -51,6 +51,9 @@ int input_add_argument(struct input_ctx *, u_char ch); void *input_state_first(u_char, enum input_class, struct input_ctx *); void *input_state_escape(u_char, enum input_class, struct input_ctx *); void *input_state_intermediate(u_char, enum input_class, struct input_ctx *); +void *input_state_title_first(u_char, enum input_class, struct input_ctx *); +void *input_state_title_second(u_char, enum input_class, struct input_ctx *); +void *input_state_title_next(u_char, enum input_class, struct input_ctx *); void *input_state_sequence_first( u_char, enum input_class, struct input_ctx *); void *input_state_sequence_next( @@ -213,6 +216,8 @@ input_state_first(u_char ch, enum input_class iclass, struct input_ctx *ictx) ch -= 0x40; if (ch == '[') return (input_state_sequence_first); + if (ch == ']') + return (input_state_title_first); input_handle_c1_control(ch, ictx); break; case INPUT_SPACE: @@ -251,6 +256,8 @@ input_state_escape(u_char ch, enum input_class iclass, struct input_ctx *ictx) case INPUT_UPPERCASE: if (ch == '[') return (input_state_sequence_first); + if (ch == ']') + return (input_state_title_first); input_handle_c1_control(ch, ictx); break; case INPUT_LOWERCASE: @@ -265,6 +272,51 @@ input_state_escape(u_char ch, enum input_class iclass, struct input_ctx *ictx) return (input_state_first); } +void * +input_state_title_first( + u_char ch, unused enum input_class iclass, struct input_ctx *ictx) +{ + if (ch >= '0' && ch <= '9') { + ictx->title_type = ch - '0'; + return (input_state_title_second); + } + return (input_state_first); +} + +void * +input_state_title_second( + u_char ch, unused enum input_class iclass, struct input_ctx *ictx) +{ + if (ch == ';') { + ictx->title_len = 0; + return (input_state_title_next); + } + return (input_state_first); +} + +void * +input_state_title_next( + u_char ch, unused enum input_class iclass, struct input_ctx *ictx) +{ + if (ch == '\007') { + ictx->title_buf[ictx->title_len] = '\0'; + switch (ictx->title_type) { + case 0: + strlcpy(ictx->s->title, + ictx->title_buf, sizeof ictx->s->title); + input_store_one(ictx->b, CODE_TITLE, ictx->title_len); + buffer_write(ictx->b, ictx->title_buf, ictx->title_len); + break; + } + } else if (ch >= 0x20) { + if (ictx->title_len < (sizeof ictx->title_buf) - 1) { + ictx->title_buf[ictx->title_len++] = ch; + return (input_state_title_next); + } + } + return (input_state_first); +} + void * input_state_intermediate( u_char ch, enum input_class iclass, struct input_ctx *ictx) @@ -423,7 +475,6 @@ input_handle_c1_control(u_char ch, struct input_ctx *ictx) { log_debug2("-- c1 %zu: %hhu (%c)", ictx->off, ch, ch); - /* XXX window title */ switch (ch) { case 'M': /* RI */ screen_cursor_up_scroll(ictx->s); diff --git a/tmux.h b/tmux.h index 4851ffe9..b205017c 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.31 2007-10-01 14:53:29 nicm Exp $ */ +/* $Id: tmux.h,v 1.32 2007-10-01 17:37:41 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -430,6 +430,10 @@ struct input_ctx { struct buffer *b; struct screen *s; + u_char title_buf[MAXTITLELEN]; + size_t title_len; + u_int title_type; + void *(*state)(u_char, enum input_class, struct input_ctx *); u_char private;