summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2007-10-01 17:37:41 +0000
committerNicholas Marriott <nicholas.marriott@gmail.com>2007-10-01 17:37:41 +0000
commit843779a3e0024648cc009e86f5bf5d85929e1a1e (patch)
tree6d07bee6ec0e38c09f50ae281e443b1d427ddd05
parentbfccbc67d193f91e6825e491f4cb6b466dcf255a (diff)
Restore window title handling.
-rw-r--r--CHANGES3
-rw-r--r--NOTES2
-rw-r--r--TODO3
-rw-r--r--input.c55
-rw-r--r--tmux.h6
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 <path>" 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 <nicm@users.sourceforge.net>
@@ -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:
@@ -266,6 +273,51 @@ input_state_escape(u_char ch, enum input_class iclass, struct input_ctx *ictx)
}
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 <nicm@users.sourceforge.net>
@@ -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;