summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/tmux/cmd-set-option.c3
-rw-r--r--usr.bin/tmux/screen-write.c24
-rw-r--r--usr.bin/tmux/status.c17
-rw-r--r--usr.bin/tmux/tmux.126
-rw-r--r--usr.bin/tmux/tmux.c3
-rw-r--r--usr.bin/tmux/tmux.h13
6 files changed, 57 insertions, 29 deletions
diff --git a/usr.bin/tmux/cmd-set-option.c b/usr.bin/tmux/cmd-set-option.c
index da5cd4ef09c..f6a161b29fb 100644
--- a/usr.bin/tmux/cmd-set-option.c
+++ b/usr.bin/tmux/cmd-set-option.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-set-option.c,v 1.1 2009/06/01 22:58:49 nicm Exp $ */
+/* $OpenBSD: cmd-set-option.c,v 1.2 2009/06/03 16:54:26 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -73,6 +73,7 @@ const struct set_option_entry set_option_table[NSETOPTION] = {
{ "status-left-length", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
{ "status-right", SET_OPTION_STRING, 0, 0, NULL },
{ "status-right-length", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
+ { "status-utf8", SET_OPTION_FLAG, 0, 0, NULL },
};
int
diff --git a/usr.bin/tmux/screen-write.c b/usr.bin/tmux/screen-write.c
index 08156d54fe8..118a6bad866 100644
--- a/usr.bin/tmux/screen-write.c
+++ b/usr.bin/tmux/screen-write.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: screen-write.c,v 1.2 2009/06/03 16:05:46 nicm Exp $ */
+/* $OpenBSD: screen-write.c,v 1.3 2009/06/03 16:54:26 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -53,8 +53,8 @@ screen_write_putc(
}
/* Calculate string length. */
-size_t printflike1
-screen_write_strlen(const char *fmt, ...)
+size_t printflike2
+screen_write_strlen(int utf8flag, const char *fmt, ...)
{
va_list ap;
char *msg;
@@ -67,7 +67,7 @@ screen_write_strlen(const char *fmt, ...)
ptr = msg;
while (*ptr != '\0') {
- if (*ptr > 0x7f) { /* Assume this is UTF-8. */
+ if (utf8flag && *ptr > 0x7f) {
memset(utf8buf, 0xff, sizeof utf8buf);
left = strlen(ptr);
@@ -94,7 +94,7 @@ screen_write_strlen(const char *fmt, ...)
return (size);
}
-/* Write string. */
+/* Write simple string (no UTF-8 or maximum length). */
void printflike3
screen_write_puts(
struct screen_write_ctx *ctx, struct grid_cell *gc, const char *fmt, ...)
@@ -102,25 +102,25 @@ screen_write_puts(
va_list ap;
va_start(ap, fmt);
- screen_write_vnputs(ctx, -1, gc, fmt, ap);
+ screen_write_vnputs(ctx, -1, gc, 0, fmt, ap);
va_end(ap);
}
/* Write string with length limit (-1 for unlimited). */
-void printflike4
+void printflike5
screen_write_nputs(struct screen_write_ctx *ctx,
- ssize_t maxlen, struct grid_cell *gc, const char *fmt, ...)
+ ssize_t maxlen, struct grid_cell *gc, int utf8flag, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- screen_write_vnputs(ctx, maxlen, gc, fmt, ap);
+ screen_write_vnputs(ctx, maxlen, gc, utf8flag, fmt, ap);
va_end(ap);
}
void
-screen_write_vnputs(struct screen_write_ctx *ctx,
- ssize_t maxlen, struct grid_cell *gc, const char *fmt, va_list ap)
+screen_write_vnputs(struct screen_write_ctx *ctx, ssize_t maxlen,
+ struct grid_cell *gc, int utf8flag, const char *fmt, va_list ap)
{
char *msg;
u_char *ptr, utf8buf[4];
@@ -131,7 +131,7 @@ screen_write_vnputs(struct screen_write_ctx *ctx,
ptr = msg;
while (*ptr != '\0') {
- if (*ptr > 0x7f) { /* Assume this is UTF-8. */
+ if (utf8flag && *ptr > 0x7f) {
memset(utf8buf, 0xff, sizeof utf8buf);
left = strlen(ptr);
diff --git a/usr.bin/tmux/status.c b/usr.bin/tmux/status.c
index 523e451a477..e7edbc5b8ac 100644
--- a/usr.bin/tmux/status.c
+++ b/usr.bin/tmux/status.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: status.c,v 1.2 2009/06/03 16:05:46 nicm Exp $ */
+/* $OpenBSD: status.c,v 1.3 2009/06/03 16:54:26 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -50,7 +50,7 @@ status_redraw(struct client *c)
size_t llen, llen2, rlen, rlen2, offset;
size_t xx, yy, sy, size, start, width;
struct grid_cell stdgc, gc;
- int larrow, rarrow;
+ int larrow, rarrow, utf8flag;
left = right = NULL;
@@ -74,18 +74,21 @@ status_redraw(struct client *c)
if (yy == 0)
goto blank;
+ /* Caring about UTF-8 in status line? */
+ utf8flag = options_get_number(&s->options, "status-utf8");
+
/* Work out the left and right strings. */
left = status_replace(s, options_get_string(
&s->options, "status-left"), c->status_timer.tv_sec);
llen = options_get_number(&s->options, "status-left-length");
- llen2 = screen_write_strlen("%s", left);
+ llen2 = screen_write_strlen(utf8flag, "%s", left);
if (llen2 < llen)
llen = llen2;
right = status_replace(s, options_get_string(
&s->options, "status-right"), c->status_timer.tv_sec);
rlen = options_get_number(&s->options, "status-right-length");
- rlen2 = screen_write_strlen("%s", right);
+ rlen2 = screen_write_strlen(utf8flag, "%s", right);
if (rlen2 < rlen)
rlen = rlen2;
right[rlen] = '\0';
@@ -164,7 +167,8 @@ draw:
screen_write_start(&ctx, NULL, &c->status);
if (llen != 0) {
screen_write_cursormove(&ctx, 0, yy);
- screen_write_nputs(&ctx, llen + 1, &stdgc, "%s ", left);
+ screen_write_nputs(
+ &ctx, llen + 1, &stdgc, utf8flag, "%s ", left);
if (larrow)
screen_write_putc(&ctx, &stdgc, ' ');
} else {
@@ -221,7 +225,8 @@ draw:
/* Draw the last item. */
if (rlen != 0) {
screen_write_cursormove(&ctx, c->tty.sx - rlen - 1, yy);
- screen_write_nputs(&ctx, rlen + 1, &stdgc, " %s", right);
+ screen_write_nputs(
+ &ctx, rlen + 1, &stdgc, utf8flag, " %s", right);
}
/* Draw the arrows. */
diff --git a/usr.bin/tmux/tmux.1 b/usr.bin/tmux/tmux.1
index a4041e05431..4313f715fe7 100644
--- a/usr.bin/tmux/tmux.1
+++ b/usr.bin/tmux/tmux.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: tmux.1,v 1.9 2009/06/03 15:58:40 nicm Exp $
+.\" $OpenBSD: tmux.1,v 1.10 2009/06/03 16:54:26 nicm Exp $
.\"
.\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
.\"
@@ -1133,6 +1133,12 @@ may contain any of the following special character pairs:
Where appropriate, these may be prefixed with a number to specify the maximum
length, for example
.Ql #24T .
+.Pp
+By default, UTF-8 in
+.Ar string
+is not interpreted, to enable UTF-8, use the
+.Ic status-utf8
+option.
.It Ic status-left-length Ar length
Set the maximum
.Ar length
@@ -1147,13 +1153,27 @@ As with
.Ic status-left ,
.Ar string
will be passed to
-.Xr strftime 3
-and character pairs are replaced.
+.Xr strftime 3 ,
+character pairs are replaced, and UTF-8 is dependent on the
+.Ic status-utf8
+option.
.It Ic status-right-length Ar length
Set the maximum
.Ar length
of the right component of the status bar.
The default is 40.
+.Pp
+.It Xo Ic status-utf8
+.Op Ic on | Ic off
+.Xc
+Instruct
+.Nm
+to treat top-bit-set characters in the
+.Ic status-left
+and
+.Ic status-right
+strings as UTF-8; notably, this is important for wide characters.
+This option defaults to off.
.El
.It Xo Ic set-password
.Op Fl c
diff --git a/usr.bin/tmux/tmux.c b/usr.bin/tmux/tmux.c
index 06b8085f656..de7b6dddf6d 100644
--- a/usr.bin/tmux/tmux.c
+++ b/usr.bin/tmux/tmux.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.c,v 1.4 2009/06/02 16:53:20 sobrado Exp $ */
+/* $OpenBSD: tmux.c,v 1.5 2009/06/03 16:54:26 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -299,6 +299,7 @@ main(int argc, char **argv)
options_set_string(&global_options, "status-left", "[#S]");
options_set_string(
&global_options, "status-right", "\"#24T\" %%H:%%M %%d-%%b-%%y");
+ options_set_number(&global_options, "status-utf8", 0);
options_init(&global_window_options, NULL);
options_set_number(&global_window_options, "aggressive-resize", 0);
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index df0b9952056..067c89e7acc 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.3 2009/06/03 16:05:46 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.4 2009/06/03 16:54:26 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -69,6 +69,7 @@ extern const char *__progname;
#define printflike2 __attribute__ ((format (printf, 2, 3)))
#define printflike3 __attribute__ ((format (printf, 3, 4)))
#define printflike4 __attribute__ ((format (printf, 4, 5)))
+#define printflike5 __attribute__ ((format (printf, 5, 6)))
/* Number of items in array. */
#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
@@ -928,7 +929,7 @@ struct set_option_entry {
};
extern const struct set_option_entry set_option_table[];
extern const struct set_option_entry set_window_option_table[];
-#define NSETOPTION 24
+#define NSETOPTION 25
#define NSETWINDOWOPTION 19
/* tmux.c */
@@ -1347,13 +1348,13 @@ void grid_view_delete_cells(struct grid *, u_int, u_int, u_int);
void screen_write_start(
struct screen_write_ctx *, struct window_pane *, struct screen *);
void screen_write_stop(struct screen_write_ctx *);
-size_t printflike1 screen_write_strlen(const char *, ...);
+size_t printflike2 screen_write_strlen(int, const char *, ...);
void printflike3 screen_write_puts(struct screen_write_ctx *,
struct grid_cell *, const char *, ...);
-void printflike4 screen_write_nputs(struct screen_write_ctx *,
- ssize_t, struct grid_cell *, const char *, ...);
+void printflike5 screen_write_nputs(struct screen_write_ctx *,
+ ssize_t, struct grid_cell *, int, const char *, ...);
void screen_write_vnputs(struct screen_write_ctx *,
- ssize_t, struct grid_cell *, const char *, va_list);
+ ssize_t, struct grid_cell *, int, const char *, va_list);
void screen_write_putc(
struct screen_write_ctx *, struct grid_cell *, u_char);
void screen_write_copy(struct screen_write_ctx *,