Add a couple of extra option types, and implement show-options command.

This commit is contained in:
Nicholas Marriott 2008-06-15 08:01:54 +00:00
parent 0591d9ff12
commit 557b6b86b0
14 changed files with 310 additions and 59 deletions

View File

@ -1,3 +1,7 @@
15 June 2008
* show-options command to show one or all options.
14 June 2008
* New window options: force-width and force-height. This will force a window
@ -472,4 +476,4 @@
(including mutt, emacs). No status bar yet and no key remapping or other
customisation.
$Id: CHANGES,v 1.119 2008-06-14 16:47:20 nicm Exp $
$Id: CHANGES,v 1.120 2008-06-15 08:01:54 nicm Exp $

View File

@ -1,4 +1,4 @@
# $Id: GNUmakefile,v 1.17 2008-06-06 17:20:15 nicm Exp $
# $Id: GNUmakefile,v 1.18 2008-06-15 08:01:54 nicm Exp $
.PHONY: clean
@ -24,7 +24,7 @@ SRCS= tmux.c server.c server-msg.c server-fn.c buffer.c buffer-poll.c status.c \
cmd-swap-window.c cmd-rename-session.c cmd-kill-session.c \
cmd-switch-client.c cmd-has-session.c cmd-scroll-mode.c cmd-copy-mode.c \
cmd-paste-buffer.c cmd-new-session.c cmd-start-server.c \
cmd-kill-server.c cmd-set-window-option.c \
cmd-kill-server.c cmd-set-window-option.c cmd-show-options.c \
window-scroll.c window-more.c window-copy.c options.c \
tty.c tty-keys.c tty-write.c screen-write.c screen-redraw.c

View File

@ -1,4 +1,4 @@
# $Id: Makefile,v 1.59 2008-06-05 21:25:00 nicm Exp $
# $Id: Makefile,v 1.60 2008-06-15 08:01:54 nicm Exp $
.SUFFIXES: .c .o .y .h
.PHONY: clean update-index.html upload-index.html
@ -28,7 +28,7 @@ SRCS= tmux.c server.c server-msg.c server-fn.c buffer.c buffer-poll.c status.c \
cmd-swap-window.c cmd-rename-session.c cmd-kill-session.c \
cmd-switch-client.c cmd-has-session.c cmd-scroll-mode.c cmd-copy-mode.c \
cmd-paste-buffer.c cmd-new-session.c cmd-start-server.c \
cmd-kill-server.c cmd-set-window-option.c \
cmd-kill-server.c cmd-set-window-option.c cmd-show-options.c \
window-scroll.c window-more.c window-copy.c options.c \
tty.c tty-keys.c tty-write.c screen-write.c screen-redraw.c

3
TODO
View File

@ -70,12 +70,13 @@
-- For 0.3 --------------------------------------------------------------------
- clear EOL etc CANNOT rely on term using the current colour/attr and probably
should not emulate it doing so
- show-options
- key binding bug: random changes?
- test and fix wsvt25
- activity/bell should be per-window not per-link? what if it is cur win in
session not being watched?
- show-window-options
- man page:
show-options
set-window-option
explanation of -t format
config file

View File

@ -1,4 +1,4 @@
/* $Id: cmd-send-prefix.c,v 1.14 2008-06-05 21:25:00 nicm Exp $ */
/* $Id: cmd-send-prefix.c,v 1.15 2008-06-15 08:01:54 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -49,7 +49,7 @@ cmd_send_prefix_exec(struct cmd *self, struct cmd_ctx *ctx)
if ((wl = cmd_find_window(ctx, data->target, &s)) == NULL)
return;
window_key(wl->window, options_get_number(&s->options, "prefix-key"));
window_key(wl->window, options_get_key(&s->options, "prefix-key"));
if (ctx->cmdclient != NULL)
server_write_client(ctx->cmdclient, MSG_EXIT, NULL, 0);

View File

@ -1,4 +1,4 @@
/* $Id: cmd-set-option.c,v 1.26 2008-06-07 06:13:21 nicm Exp $ */
/* $Id: cmd-set-option.c,v 1.27 2008-06-15 08:01:54 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -148,7 +148,7 @@ cmd_set_option_exec(struct cmd *self, unused struct cmd_ctx *ctx)
ctx->error(ctx, "unknown key: %s", data->value);
return;
}
options_set_number(oo, "prefix-key", key);
options_set_key(oo, "prefix-key", key);
} else if (strcmp(data->option, "status") == 0) {
if (bool == -1) {
ctx->error(ctx, "bad value: %s", data->value);
@ -169,10 +169,10 @@ cmd_set_option_exec(struct cmd *self, unused struct cmd_ctx *ctx)
return;
}
colour = options_get_number(oo, "status-colour");
colour = options_get_colours(oo, "status-colour");
colour &= 0x0f;
colour |= number << 4;
options_set_number(oo, "status-colour", colour);
options_set_colours(oo, "status-colour", colour);
for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
c = ARRAY_ITEM(&clients, i);
@ -190,10 +190,10 @@ cmd_set_option_exec(struct cmd *self, unused struct cmd_ctx *ctx)
return;
}
colour = options_get_number(oo, "status-colour");
colour = options_get_colours(oo, "status-colour");
colour &= 0xf0;
colour |= number;
options_set_number(oo, "status-colour", colour);
options_set_colours(oo, "status-colour", colour);
for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
c = ARRAY_ITEM(&clients, i);

170
cmd-show-options.c Normal file
View File

@ -0,0 +1,170 @@
/* $Id: cmd-show-options.c,v 1.1 2008-06-15 08:01:54 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <getopt.h>
#include <stdlib.h>
#include <string.h>
#include "tmux.h"
/*
* Show options.
*/
int cmd_show_options_parse(struct cmd *, int, char **, char **);
void cmd_show_options_exec(struct cmd *, struct cmd_ctx *);
void cmd_show_options_send(struct cmd *, struct buffer *);
void cmd_show_options_recv(struct cmd *, struct buffer *);
void cmd_show_options_free(struct cmd *);
void cmd_show_options_print(struct cmd *, char *, size_t);
struct cmd_show_options_data {
char *target;
int flag_global;
};
/*
* XXX Can't use cmd_target because we want -t not to use current if missing
* (this could be a flag??).
*/
const struct cmd_entry cmd_show_options_entry = {
"show-options", "show",
"[-t target-window]",
0,
NULL,
cmd_show_options_parse,
cmd_show_options_exec,
cmd_show_options_send,
cmd_show_options_recv,
cmd_show_options_free,
cmd_show_options_print
};
int
cmd_show_options_parse(struct cmd *self, int argc, char **argv, char **cause)
{
struct cmd_show_options_data *data;
int opt;
self->data = data = xmalloc(sizeof *data);
data->target = NULL;
data->flag_global = 1;
while ((opt = getopt(argc, argv, "t:s:")) != EOF) {
switch (opt) {
case 't':
if (data->target == NULL)
data->target = xstrdup(optarg);
data->flag_global = 0;
break;
default:
goto usage;
}
}
argc -= optind;
argv += optind;
if (argc != 0)
goto usage;
return (0);
usage:
xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
self->entry->free(self);
return (-1);
}
void
cmd_show_options_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_show_options_data *data = self->data;
struct session *s;
struct options *oo;
struct options_entry *o;
if (data == NULL)
return;
if (data->flag_global ||
((s = cmd_find_session(ctx, data->target))) == NULL)
oo = &global_options;
else
oo = &s->options;
SPLAY_FOREACH(o, options_tree, &oo->tree) {
switch (o->type) {
case OPTIONS_STRING:
ctx->print(
ctx, "%s \"%s\"", o->name, o->value.string);
break;
case OPTIONS_NUMBER:
ctx->print(ctx, "%s %lld", o->name, o->value.number);
break;
case OPTIONS_KEY:
ctx->print(ctx, "%s %s", o->name,
key_string_lookup_key(o->value.key));
break;
case OPTIONS_COLOURS:
ctx->print(ctx, "%s fg=%s, bg=%s", o->name,
screen_colourstring(o->value.colours >> 4),
screen_colourstring(o->value.colours & 0x0f));
break;
}
}
if (ctx->cmdclient != NULL)
server_write_client(ctx->cmdclient, MSG_EXIT, NULL, 0);
}
void
cmd_show_options_send(struct cmd *self, struct buffer *b)
{
struct cmd_show_options_data *data = self->data;
buffer_write(b, data, sizeof *data);
cmd_send_string(b, data->target);
}
void
cmd_show_options_recv(struct cmd *self, struct buffer *b)
{
struct cmd_show_options_data *data;
self->data = data = xmalloc(sizeof *data);
buffer_read(b, data, sizeof *data);
data->target = cmd_recv_string(b);
}
void
cmd_show_options_free(struct cmd *self)
{
struct cmd_show_options_data *data = self->data;
if (data->target != NULL)
xfree(data->target);
xfree(data);
}
void
cmd_show_options_print(struct cmd *self, char *buf, size_t len)
{
xsnprintf(buf, len, "%s", self->entry->name);
}

5
cmd.c
View File

@ -1,4 +1,4 @@
/* $Id: cmd.c,v 1.44 2008-06-05 22:59:38 nicm Exp $ */
/* $Id: cmd.c,v 1.45 2008-06-15 08:01:54 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -51,10 +51,11 @@ const struct cmd_entry *cmd_table[] = {
&cmd_rename_window_entry,
&cmd_scroll_mode_entry,
&cmd_select_window_entry,
&cmd_set_window_option_entry,
&cmd_send_keys_entry,
&cmd_send_prefix_entry,
&cmd_set_option_entry,
&cmd_set_window_option_entry,
&cmd_show_options_entry,
&cmd_start_server_entry,
&cmd_swap_window_entry,
&cmd_switch_client_entry,

126
options.c
View File

@ -1,4 +1,4 @@
/* $Id: options.c,v 1.1 2008-06-03 21:42:37 nicm Exp $ */
/* $Id: options.c,v 1.2 2008-06-15 08:01:54 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@ -30,6 +30,9 @@
SPLAY_GENERATE(options_tree, options_entry, entry, options_cmp);
struct options_entry *options_find1(struct options *, const char *);
struct options_entry *options_find(struct options *, const char *);
int
options_cmp(struct options_entry *o1, struct options_entry *o2)
{
@ -58,15 +61,38 @@ options_free(struct options *oo)
}
}
void printflike3
options_set_string(struct options *oo, const char *name, const char *fmt, ...)
struct options_entry *
options_find1(struct options *oo, const char *name)
{
struct options_entry p;
p.name = name;
return (SPLAY_FIND(options_tree, &oo->tree, &p));
}
struct options_entry *
options_find(struct options *oo, const char *name)
{
struct options_entry *o, p;
va_list ap;
p.name = name;
o = SPLAY_FIND(options_tree, &oo->tree, &p);
if (o == NULL) {
while (o == NULL) {
oo = oo->parent;
if (oo == NULL)
break;
o = SPLAY_FIND(options_tree, &oo->tree, &p);
}
return (o);
}
void printflike3
options_set_string(struct options *oo, const char *name, const char *fmt, ...)
{
struct options_entry *o;
va_list ap;
if ((o = options_find1(oo, name)) == NULL) {
o = xmalloc(sizeof *o);
o->name = xstrdup(name);
SPLAY_INSERT(options_tree, &oo->tree, o);
@ -82,17 +108,9 @@ options_set_string(struct options *oo, const char *name, const char *fmt, ...)
char *
options_get_string(struct options *oo, const char *name)
{
struct options_entry *o, p;
struct options_entry *o;
p.name = name;
o = SPLAY_FIND(options_tree, &oo->tree, &p);
while (o == NULL) {
oo = oo->parent;
o = SPLAY_FIND(options_tree, &oo->tree, &p);
if (o != NULL)
break;
}
if (o == NULL)
if ((o = options_find(oo, name)) == NULL)
fatalx("missing option");
if (o->type != OPTIONS_STRING)
fatalx("option not a string");
@ -102,11 +120,9 @@ options_get_string(struct options *oo, const char *name)
void
options_set_number(struct options *oo, const char *name, long long value)
{
struct options_entry *o, p;
struct options_entry *o;
p.name = name;
o = SPLAY_FIND(options_tree, &oo->tree, &p);
if (o == NULL) {
if ((o = options_find1(oo, name)) == NULL) {
o = xmalloc(sizeof *o);
o->name = xstrdup(name);
SPLAY_INSERT(options_tree, &oo->tree, o);
@ -118,22 +134,72 @@ options_set_number(struct options *oo, const char *name, long long value)
}
int
long long
options_get_number(struct options *oo, const char *name)
{
struct options_entry *o, p;
struct options_entry *o;
p.name = name;
o = SPLAY_FIND(options_tree, &oo->tree, &p);
while (o == NULL) {
oo = oo->parent;
o = SPLAY_FIND(options_tree, &oo->tree, &p);
if (o != NULL)
break;
}
if (o == NULL)
if ((o = options_find(oo, name)) == NULL)
fatalx("missing option");
if (o->type != OPTIONS_NUMBER)
fatalx("option not a number");
return (o->value.number);
}
void
options_set_key(struct options *oo, const char *name, int value)
{
struct options_entry *o;
if ((o = options_find1(oo, name)) == NULL) {
o = xmalloc(sizeof *o);
o->name = xstrdup(name);
SPLAY_INSERT(options_tree, &oo->tree, o);
} else if (o->type == OPTIONS_STRING)
xfree(o->value.string);
o->type = OPTIONS_KEY;
o->value.key = value;
}
int
options_get_key(struct options *oo, const char *name)
{
struct options_entry *o;
if ((o = options_find(oo, name)) == NULL)
fatalx("missing option");
if (o->type != OPTIONS_KEY)
fatalx("option not a key");
return (o->value.key);
}
void
options_set_colours(struct options *oo, const char *name, u_char value)
{
struct options_entry *o;
if ((o = options_find1(oo, name)) == NULL) {
o = xmalloc(sizeof *o);
o->name = xstrdup(name);
SPLAY_INSERT(options_tree, &oo->tree, o);
} else if (o->type == OPTIONS_STRING)
xfree(o->value.string);
o->type = OPTIONS_COLOURS;
o->value.colours = value;
}
u_char
options_get_colours(struct options *oo, const char *name)
{
struct options_entry *o;
if ((o = options_find(oo, name)) == NULL)
fatalx("missing option");
if (o->type != OPTIONS_COLOURS)
fatalx("option not a colours");
return (o->value.colours);
}

View File

@ -1,4 +1,4 @@
/* $Id: server.c,v 1.63 2008-06-14 16:47:20 nicm Exp $ */
/* $Id: server.c,v 1.64 2008-06-15 08:01:54 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -485,7 +485,7 @@ server_handle_client(struct client *c)
struct window *w = c->session->curw->window;
int key, prefix;
prefix = options_get_number(&c->session->options, "prefix-key");
prefix = options_get_key(&c->session->options, "prefix-key");
while (tty_keys_next(&c->tty, &key) == 0) {
if (c->flags & CLIENT_PREFIX) {
key_bindings_dispatch(key, c);

View File

@ -1,4 +1,4 @@
/* $Id: status.c,v 1.25 2008-06-14 16:47:20 nicm Exp $ */
/* $Id: status.c,v 1.26 2008-06-15 08:01:54 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -36,7 +36,7 @@ status_redraw(struct client *c)
u_char scolour;
u_int slines;
scolour = options_get_number(&c->session->options, "status-colour");
scolour = options_get_colours(&c->session->options, "status-colour");
slines = options_get_number(&c->session->options, "status-lines");
if (slines == 0 || c->sy <= slines)
return;

6
tmux.1
View File

@ -1,4 +1,4 @@
.\" $Id: tmux.1,v 1.32 2008-06-11 06:19:56 nicm Exp $
.\" $Id: tmux.1,v 1.33 2008-06-15 08:01:54 nicm Exp $
.\"
.\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
.\"
@ -136,7 +136,7 @@ to exit from it.
.Sh KEY BINDINGS
.Nm
may be controlled from an attached client by using a key combination of a
prefix,
prefix key,
.Ql ^B
(ctrl-B) by default, followed by a command key.
.Pp
@ -505,7 +505,7 @@ The default is
Set the maximum number of lines held in window history.
This setting applies only to new windows - existing window histories are not
resized and retain the limit at the point they were created.
.It Ic prefix Ar key
.It Ic prefix-key Ar key
Set the current prefix key.
.It Xo Ic status
.Op Ic on | Ic off

6
tmux.c
View File

@ -1,4 +1,4 @@
/* $Id: tmux.c,v 1.54 2008-06-06 17:20:30 nicm Exp $ */
/* $Id: tmux.c,v 1.55 2008-06-15 08:01:54 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -200,10 +200,10 @@ main(int argc, char **argv)
options_init(&global_options, NULL);
options_set_number(&global_options, "status-lines", 1);
options_set_number(&global_options, "status-colour", 0x02);
options_set_colours(&global_options, "status-colour", 0x02);
options_set_number(&global_options, "bell-action", BELL_ANY);
options_set_number(&global_options, "history-limit", 2000);
options_set_number(&global_options, "prefix-key", META);
options_set_key(&global_options, "prefix-key", META);
options_set_string(&global_options, "status-left", "");
options_set_string(
&global_options, "status-right", "%%H:%%M %%d-%%b-%%y");

15
tmux.h
View File

@ -1,4 +1,4 @@
/* $Id: tmux.h,v 1.141 2008-06-14 16:47:20 nicm Exp $ */
/* $Id: tmux.h,v 1.142 2008-06-15 08:01:54 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -557,11 +557,15 @@ struct options_entry {
enum {
OPTIONS_STRING,
OPTIONS_NUMBER
OPTIONS_NUMBER,
OPTIONS_KEY,
OPTIONS_COLOURS
} type;
union {
char *string;
long long number;
int key;
u_char colours;
} value;
SPLAY_ENTRY(options_entry) entry;
@ -772,7 +776,11 @@ void printflike3 options_set_string(
struct options *, const char *, const char *, ...);
char *options_get_string(struct options *, const char *);
void options_set_number(struct options *, const char *, long long);
int options_get_number(struct options *, const char *);
long long options_get_number(struct options *, const char *);
void options_set_key(struct options *, const char *, int);
int options_get_key(struct options *, const char *);
void options_set_colours(struct options *, const char *, u_char);
u_char options_get_colours(struct options *, const char *);
/* tty.c */
void tty_init(struct tty *, char *, char *);
@ -842,6 +850,7 @@ extern const struct cmd_entry cmd_send_keys_entry;
extern const struct cmd_entry cmd_send_prefix_entry;
extern const struct cmd_entry cmd_set_option_entry;
extern const struct cmd_entry cmd_set_window_option_entry;
extern const struct cmd_entry cmd_show_options_entry;
extern const struct cmd_entry cmd_start_server_entry;
extern const struct cmd_entry cmd_swap_window_entry;
extern const struct cmd_entry cmd_switch_client_entry;