aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2009-02-13 21:39:45 +0000
committerNicholas Marriott <nicholas.marriott@gmail.com>2009-02-13 21:39:45 +0000
commit95c8c049f5a0a0511108918cedd195f6f13e1004 (patch)
tree0f08f025105d5a7eaf51a3e085f7462b733a7503
parent47e6b2725d51320928e5b0ab5c7e488920edd83d (diff)
downloadrtmux-95c8c049f5a0a0511108918cedd195f6f13e1004.tar.gz
rtmux-95c8c049f5a0a0511108918cedd195f6f13e1004.tar.bz2
rtmux-95c8c049f5a0a0511108918cedd195f6f13e1004.zip
Redo mode keys slightly more cleanly and apply them to command prompt editing. vi or emacs mode is controlled by the session option status-keys.
-rw-r--r--CHANGES7
-rw-r--r--TODO1
-rw-r--r--cmd-set-option.c6
-rw-r--r--mode-key.c239
-rw-r--r--status.c41
-rw-r--r--tmux.c3
-rw-r--r--tmux.h66
-rw-r--r--window-choose.c29
-rw-r--r--window-copy.c42
-rw-r--r--window-more.c27
-rw-r--r--window-scroll.c27
11 files changed, 316 insertions, 172 deletions
diff --git a/CHANGES b/CHANGES
index 080f6812..15008893 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,10 @@
13 February 2009
+* Redo mode keys slightly more cleanly and apply them to command prompt
+ editing. vi or emacs mode is controlled by the session option status-keys.
+
+12 February 2009
+
* Looking up argv[0] is expensive, so just use p_comm for the window name which
is good enough. Also increase name update time to 500 ms.
@@ -1109,7 +1114,7 @@
(including mutt, emacs). No status bar yet and no key remapping or other
customisation.
-$Id: CHANGES,v 1.254 2009-02-13 00:43:04 nicm Exp $
+$Id: CHANGES,v 1.255 2009-02-13 21:39:45 nicm Exp $
LocalWords: showw utf UTF fulvio ciriaco joshe OSC APC gettime abc DEF OA clr
LocalWords: rivo nurges lscm Erdely eol smysession mysession ek dstname RB ms
diff --git a/TODO b/TODO
index f3cc0d18..83795c53 100644
--- a/TODO
+++ b/TODO
@@ -99,3 +99,4 @@
for stuff like mode keys?
- bug: copy mode gets the start of the selection wrong
- ncmpc scroll up doesn't redraw properly
+- document status-keys
diff --git a/cmd-set-option.c b/cmd-set-option.c
index 1dc8afb5..627a1205 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-set-option.c,v 1.58 2009-01-30 00:24:49 nicm Exp $ */
+/* $Id: cmd-set-option.c,v 1.59 2009-02-13 21:39:45 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -42,6 +42,9 @@ const struct cmd_entry cmd_set_option_entry = {
cmd_option_print
};
+const char *set_option_status_keys_list[] = {
+ "emacs", "vi", NULL
+};
const char *set_option_bell_action_list[] = {
"none", "any", "current", NULL
};
@@ -64,6 +67,7 @@ const struct set_option_entry set_option_table[NSETOPTION] = {
{ "status-bg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "status-fg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "status-interval", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
+ { "status-keys", SET_OPTION_CHOICE, 0, 0, set_option_status_keys_list },
{ "status-left", SET_OPTION_STRING, 0, 0, NULL },
{ "status-left-length", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
{ "status-right", SET_OPTION_STRING, 0, 0, NULL },
diff --git a/mode-key.c b/mode-key.c
index 48650c9a..f1c54ec5 100644
--- a/mode-key.c
+++ b/mode-key.c
@@ -1,4 +1,4 @@
-/* $Id: mode-key.c,v 1.8 2009-02-13 16:40:04 nicm Exp $ */
+/* $Id: mode-key.c,v 1.9 2009-02-13 21:39:45 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -20,79 +20,180 @@
#include "tmux.h"
-struct mode_key_entry {
- enum mode_key mkey;
- int key;
-};
+enum mode_key_cmd mode_key_lookup_vi(struct mode_key_data *, int);
+enum mode_key_cmd mode_key_lookup_emacs(struct mode_key_data *, int);
-const struct mode_key_entry mode_key_table_vi[] = {
- { MODEKEY_ENTER, '\r' }, /* must come first */
- { MODEKEY_BOL, '0' },
- { MODEKEY_BOL, '^' },
- { MODEKEY_CLEARSEL, '\033' },
- { MODEKEY_COPYSEL, '\r' },
- { MODEKEY_DOWN, 'j' },
- { MODEKEY_DOWN, KEYC_DOWN },
- { MODEKEY_EOL, '$' },
- { MODEKEY_LEFT, 'h' },
- { MODEKEY_LEFT, KEYC_LEFT },
- { MODEKEY_NPAGE, '\006' },
- { MODEKEY_NPAGE, KEYC_NPAGE },
- { MODEKEY_NWORD, 'w' },
- { MODEKEY_PPAGE, '\025' },
- { MODEKEY_PPAGE, KEYC_PPAGE },
- { MODEKEY_PWORD, 'b' },
- { MODEKEY_QUIT, 'q' },
- { MODEKEY_RIGHT, 'l' },
- { MODEKEY_RIGHT, KEYC_RIGHT },
- { MODEKEY_STARTSEL, ' ' },
- { MODEKEY_UP, 'k' },
- { MODEKEY_UP, KEYC_UP },
-};
+void
+mode_key_init(struct mode_key_data *mdata, int type, int flags)
+{
+ mdata->type = type;
+
+ if (flags & MODEKEY_CANEDIT)
+ flags |= MODEKEY_EDITMODE;
+ mdata->flags = flags;
+}
-const struct mode_key_entry mode_key_table_emacs[] = {
- { MODEKEY_ENTER, '\r' }, /* must come first */
- { MODEKEY_BOL, '\001' },
- { MODEKEY_CLEARSEL, '\007' },
- { MODEKEY_COPYSEL, '\027' },
- { MODEKEY_COPYSEL, KEYC_ADDESC('w') },
- { MODEKEY_DOWN, '\016' },
- { MODEKEY_DOWN, KEYC_DOWN },
- { MODEKEY_EOL, '\005' },
- { MODEKEY_LEFT, '\002' },
- { MODEKEY_LEFT, KEYC_LEFT },
- { MODEKEY_NPAGE, '\026' },
- { MODEKEY_NPAGE, KEYC_NPAGE },
- { MODEKEY_NWORD, KEYC_ADDESC('f') },
- { MODEKEY_PPAGE, KEYC_ADDESC('v') },
- { MODEKEY_PPAGE, KEYC_PPAGE },
- { MODEKEY_PWORD, KEYC_ADDESC('b') },
- { MODEKEY_QUIT, 'q' },
- { MODEKEY_RIGHT, '\006' },
- { MODEKEY_RIGHT, KEYC_RIGHT },
- { MODEKEY_STARTSEL, '\000' },
- { MODEKEY_UP, '\020' },
- { MODEKEY_UP, KEYC_UP },
-};
+void
+mode_key_free(unused struct mode_key_data *mdata)
+{
+}
+
+enum mode_key_cmd
+mode_key_lookup(struct mode_key_data *mdata, int key)
+{
+ switch (mdata->type) {
+ case MODEKEY_VI:
+ return (mode_key_lookup_vi(mdata, key));
+ case MODEKEY_EMACS:
+ return (mode_key_lookup_emacs(mdata, key));
+ default:
+ fatalx("unknown mode key type");
+ }
+}
-enum mode_key
-mode_key_lookup(int table, int key)
+enum mode_key_cmd
+mode_key_lookup_vi(struct mode_key_data *mdata, int key)
{
- const struct mode_key_entry *ptr;
- u_int i, n;
+ if (mdata->flags & MODEKEY_EDITMODE) {
+ switch (key) {
+ case '\003':
+ return (MODEKEYCMD_QUIT);
+ case '\033':
+ if (mdata->flags & MODEKEY_CANEDIT)
+ mdata->flags &= ~MODEKEY_EDITMODE;
+ return (MODEKEYCMD_NONE);
+ case '\010':
+ case '\177':
+ return (MODEKEYCMD_BACKSPACE);
+ case '\011':
+ return (MODEKEYCMD_COMPLETE);
+ case KEYC_DC:
+ return (MODEKEYCMD_DELETE);
+ case '\r':
+ return (MODEKEYCMD_CHOOSE);
+ }
+ return (MODEKEYCMD_OTHERKEY);
+ }
- if (table == MODEKEY_EMACS) {
- ptr = mode_key_table_emacs;
- n = nitems(mode_key_table_emacs);
- } else if (table == MODEKEY_VI) {
- ptr = mode_key_table_vi;
- n = nitems(mode_key_table_vi);
- } else
- return (MODEKEY_NONE);
+ switch (key) {
+ case '\010':
+ case '\177':
+ return (MODEKEYCMD_LEFT);
+ case KEYC_DC:
+ return (MODEKEYCMD_DELETE);
+ case '\011':
+ return (MODEKEYCMD_COMPLETE);
+ case 'i':
+ if (mdata->flags & MODEKEY_CANEDIT)
+ mdata->flags |= MODEKEY_EDITMODE;
+ break;
+ case 'a':
+ if (mdata->flags & MODEKEY_CANEDIT) {
+ mdata->flags |= MODEKEY_EDITMODE;
+ return (MODEKEYCMD_RIGHT);
+ }
+ break;
+ case '\r':
+ if (mdata->flags & MODEKEY_CANEDIT)
+ return (MODEKEYCMD_CHOOSE);
+ return (MODEKEYCMD_COPYSELECTION);
+ case '0':
+ case '^':
+ return (MODEKEYCMD_STARTOFLINE);
+ case '\033':
+ return (MODEKEYCMD_CLEARSELECTION);
+ case 'j':
+ case KEYC_DOWN:
+ return (MODEKEYCMD_DOWN);
+ case '$':
+ return (MODEKEYCMD_ENDOFLINE);
+ case 'h':
+ case KEYC_LEFT:
+ return (MODEKEYCMD_LEFT);
+ case '\006':
+ case KEYC_NPAGE:
+ return (MODEKEYCMD_NEXTPAGE);
+ case 'w':
+ return (MODEKEYCMD_NEXTWORD);
+ case '\025':
+ case KEYC_PPAGE:
+ return (MODEKEYCMD_PREVIOUSPAGE);
+ case 'b':
+ return (MODEKEYCMD_PREVIOUSWORD);
+ case 'q':
+ case '\003':
+ return (MODEKEYCMD_QUIT);
+ case 'l':
+ case KEYC_RIGHT:
+ return (MODEKEYCMD_RIGHT);
+ case ' ':
+ return (MODEKEYCMD_STARTSELECTION);
+ case 'k':
+ case KEYC_UP:
+ return (MODEKEYCMD_UP);
+ }
+
+ return (MODEKEYCMD_NONE);
+}
- for (i = 0; i < n; i++) {
- if (ptr[i].key == key)
- return (ptr[i].mkey);
+enum mode_key_cmd
+mode_key_lookup_emacs(struct mode_key_data *mdata, int key)
+{
+ switch (key) {
+ case '\010':
+ case '\177':
+ return (MODEKEYCMD_BACKSPACE);
+ case KEYC_DC:
+ return (MODEKEYCMD_DELETE);
+ case '\011':
+ return (MODEKEYCMD_COMPLETE);
+ case '\r':
+ return (MODEKEYCMD_CHOOSE);
+ case '\001':
+ return (MODEKEYCMD_STARTOFLINE);
+ case '\007':
+ return (MODEKEYCMD_CLEARSELECTION);
+ case '\027':
+ case KEYC_ADDESC('w'):
+ return (MODEKEYCMD_COPYSELECTION);
+ case '\016':
+ case KEYC_DOWN:
+ return (MODEKEYCMD_DOWN);
+ case '\005':
+ return (MODEKEYCMD_ENDOFLINE);
+ case '\002':
+ case KEYC_LEFT:
+ return (MODEKEYCMD_LEFT);
+ case ' ':
+ if (mdata->flags & MODEKEY_CANEDIT)
+ break;
+ /* FALLTHROUGH */
+ case '\026':
+ case KEYC_NPAGE:
+ return (MODEKEYCMD_NEXTPAGE);
+ case KEYC_ADDESC('f'):
+ return (MODEKEYCMD_NEXTWORD);
+ case KEYC_ADDESC('v'):
+ case KEYC_PPAGE:
+ return (MODEKEYCMD_PREVIOUSPAGE);
+ case KEYC_ADDESC('b'):
+ return (MODEKEYCMD_PREVIOUSWORD);
+ case '\006':
+ case KEYC_RIGHT:
+ return (MODEKEYCMD_RIGHT);
+ case '\000':
+ return (MODEKEYCMD_STARTSELECTION);
+ case '\020':
+ case KEYC_UP:
+ return (MODEKEYCMD_UP);
+ case 'q':
+ if (mdata->flags & MODEKEY_CANEDIT)
+ break;
+ /* FALLTHROUGH */
+ case '\003':
+ case '\033':
+ return (MODEKEYCMD_QUIT);
}
- return (MODEKEY_NONE);
+
+ return (MODEKEYCMD_OTHERKEY);
}
diff --git a/status.c b/status.c
index e7ebf032..b38dbbb9 100644
--- a/status.c
+++ b/status.c
@@ -1,4 +1,4 @@
-/* $Id: status.c,v 1.74 2009-02-13 18:57:55 nicm Exp $ */
+/* $Id: status.c,v 1.75 2009-02-13 21:39:45 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -577,6 +577,10 @@ status_prompt_set(struct client *c,
c->prompt_hidden = hide;
+ mode_key_init(&c->prompt_mdata,
+ options_get_number(&c->session->options, "status-keys"),
+ MODEKEY_CANEDIT);
+
c->tty.flags |= (TTY_NOCURSOR|TTY_FREEZE);
c->flags |= CLIENT_STATUS;
}
@@ -587,6 +591,8 @@ status_prompt_clear(struct client *c)
if (c->prompt_string == NULL)
return;
+ mode_key_free(&c->prompt_mdata);
+
xfree(c->prompt_string);
c->prompt_string = NULL;
@@ -682,35 +688,33 @@ status_prompt_key(struct client *c, int key)
size_t size, n, off, idx;
char word[64];
- /* XXX This function needs some tidying... */
-
size = strlen(c->prompt_buffer);
- switch (key) {
- case KEYC_LEFT:
+ switch (mode_key_lookup(&c->prompt_mdata, key)) {
+ case MODEKEYCMD_LEFT:
if (c->prompt_index > 0) {
c->prompt_index--;
c->flags |= CLIENT_STATUS;
}
break;
- case KEYC_RIGHT:
+ case MODEKEYCMD_RIGHT:
if (c->prompt_index < size) {
c->prompt_index++;
c->flags |= CLIENT_STATUS;
}
break;
- case '\001': /* C-a */
+ case MODEKEYCMD_STARTOFLINE:
if (c->prompt_index != 0) {
c->prompt_index = 0;
c->flags |= CLIENT_STATUS;
}
break;
- case '\005': /* C-e */
+ case MODEKEYCMD_ENDOFLINE:
if (c->prompt_index != size) {
c->prompt_index = size;
c->flags |= CLIENT_STATUS;
}
break;
- case '\011':
+ case MODEKEYCMD_COMPLETE:
if (*c->prompt_buffer == '\0')
break;
@@ -758,8 +762,7 @@ status_prompt_key(struct client *c, int key)
c->flags |= CLIENT_STATUS;
break;
- case '\010':
- case '\177':
+ case MODEKEYCMD_BACKSPACE:
if (c->prompt_index != 0) {
if (c->prompt_index == size)
c->prompt_buffer[--c->prompt_index] = '\0';
@@ -772,7 +775,7 @@ status_prompt_key(struct client *c, int key)
c->flags |= CLIENT_STATUS;
}
break;
- case KEYC_DC:
+ case MODEKEYCMD_DELETE:
if (c->prompt_index != size) {
memmove(c->prompt_buffer + c->prompt_index,
c->prompt_buffer + c->prompt_index + 1,
@@ -780,7 +783,7 @@ status_prompt_key(struct client *c, int key)
c->flags |= CLIENT_STATUS;
}
break;
- case KEYC_UP:
+ case MODEKEYCMD_UP:
if (ARRAY_LENGTH(&c->prompt_hdata) == 0)
break;
xfree(c->prompt_buffer);
@@ -793,7 +796,7 @@ status_prompt_key(struct client *c, int key)
c->prompt_index = strlen(c->prompt_buffer);
c->flags |= CLIENT_STATUS;
break;
- case KEYC_DOWN:
+ case MODEKEYCMD_DOWN:
xfree(c->prompt_buffer);
if (c->prompt_hindex != 0) {
@@ -807,7 +810,7 @@ status_prompt_key(struct client *c, int key)
c->prompt_index = strlen(c->prompt_buffer);
c->flags |= CLIENT_STATUS;
break;
- case '\r': /* enter */
+ case MODEKEYCMD_CHOOSE:
if (*c->prompt_buffer != '\0') {
status_prompt_add_history(c);
if (c->prompt_callback(
@@ -816,12 +819,12 @@ status_prompt_key(struct client *c, int key)
break;
}
/* FALLTHROUGH */
- case '\033': /* escape */
+ case MODEKEYCMD_QUIT:
if (c->prompt_callback(c->prompt_data, NULL) == 0)
status_prompt_clear(c);
break;
- default:
- if (key < 32)
+ case MODEKEYCMD_OTHERKEY:
+ if (key < 32 || key > 126)
break;
c->prompt_buffer = xrealloc(c->prompt_buffer, 1, size + 2);
@@ -837,6 +840,8 @@ status_prompt_key(struct client *c, int key)
c->flags |= CLIENT_STATUS;
break;
+ default:
+ break;
}
}
diff --git a/tmux.c b/tmux.c
index 96309fa1..c963a81e 100644
--- a/tmux.c
+++ b/tmux.c
@@ -1,4 +1,4 @@
-/* $Id: tmux.c,v 1.106 2009-02-08 16:26:43 nicm Exp $ */
+/* $Id: tmux.c,v 1.107 2009-02-13 21:39:45 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -252,6 +252,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-keys", MODEKEY_EMACS);
options_init(&global_window_options, NULL);
options_set_number(&global_window_options, "aggressive-resize", 0);
options_set_number(&global_window_options, "clock-mode-colour", 4);
diff --git a/tmux.h b/tmux.h
index 2ef9521e..785a7031 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1,4 +1,4 @@
-/* $Id: tmux.h,v 1.272 2009-02-13 18:57:55 nicm Exp $ */
+/* $Id: tmux.h,v 1.273 2009-02-13 21:39:45 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -398,6 +398,41 @@ struct msg_resize_data {
u_int sy;
};
+/* Editing keys. */
+enum mode_key_cmd {
+ MODEKEYCMD_BACKSPACE,
+ MODEKEYCMD_CHOOSE,
+ MODEKEYCMD_CLEARSELECTION,
+ MODEKEYCMD_COMPLETE,
+ MODEKEYCMD_COPYSELECTION,
+ MODEKEYCMD_DELETE,
+ MODEKEYCMD_DOWN,
+ MODEKEYCMD_ENDOFLINE,
+ MODEKEYCMD_LEFT,
+ MODEKEYCMD_NEXTPAGE,
+ MODEKEYCMD_NEXTWORD,
+ MODEKEYCMD_NONE,
+ MODEKEYCMD_OTHERKEY,
+ MODEKEYCMD_PREVIOUSPAGE,
+ MODEKEYCMD_PREVIOUSWORD,
+ MODEKEYCMD_QUIT,
+ MODEKEYCMD_RIGHT,
+ MODEKEYCMD_STARTOFLINE,
+ MODEKEYCMD_STARTSELECTION,
+ MODEKEYCMD_UP,
+};
+
+struct mode_key_data {
+ int type;
+
+ int flags;
+#define MODEKEY_EDITMODE 0x1
+#define MODEKEY_CANEDIT 0x2
+};
+
+#define MODEKEY_EMACS 0
+#define MODEKEY_VI 1
+
/* Modes. */
#define MODE_CURSOR 0x1
#define MODE_INSERT 0x2
@@ -786,6 +821,7 @@ struct client {
int prompt_hidden;
u_int prompt_hindex;
ARRAY_DECL(, char *) prompt_hdata;
+ struct mode_key_data prompt_mdata;
struct session *session;
};
@@ -914,31 +950,9 @@ 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 22
+#define NSETOPTION 23
#define NSETWINDOWOPTION 17
-/* Edit keys. */
-enum mode_key {
- MODEKEY_BOL,
- MODEKEY_CLEARSEL,
- MODEKEY_COPYSEL,
- MODEKEY_DOWN,
- MODEKEY_ENTER,
- MODEKEY_EOL,
- MODEKEY_LEFT,
- MODEKEY_NONE,
- MODEKEY_NPAGE,
- MODEKEY_NWORD,
- MODEKEY_PPAGE,
- MODEKEY_PWORD,
- MODEKEY_QUIT,
- MODEKEY_RIGHT,
- MODEKEY_STARTSEL,
- MODEKEY_UP,
-};
-#define MODEKEY_EMACS 0
-#define MODEKEY_VI 1
-
#ifdef NO_STRTONUM
/* strtonum.c */
long long strtonum(const char *, long long, long long, const char **);
@@ -999,7 +1013,9 @@ void sighandler(int);
int load_cfg(const char *, char **x);
/* mode-key.c */
-enum mode_key mode_key_lookup(int, int);
+void mode_key_init(struct mode_key_data *, int, int);
+void mode_key_free(struct mode_key_data *);
+enum mode_key_cmd mode_key_lookup(struct mode_key_data *, int);
/* options.c */
int options_cmp(struct options_entry *, struct options_entry *);
diff --git a/window-choose.c b/window-choose.c
index b8a06235..13d1429b 100644
--- a/window-choose.c
+++ b/window-choose.c
@@ -1,4 +1,4 @@
-/* $Id: window-choose.c,v 1.10 2009-01-29 20:02:33 nicm Exp $ */
+/* $Id: window-choose.c,v 1.11 2009-02-13 21:39:45 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -53,6 +53,8 @@ struct window_choose_mode_item {
struct window_choose_mode_data {
struct screen screen;
+ struct mode_key_data mdata;
+
ARRAY_DECL(, struct window_choose_mode_item) list;
u_int top;
u_int selected;
@@ -115,6 +117,9 @@ window_choose_init(struct window_pane *wp)
screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);
s->mode &= ~MODE_CURSOR;
s->mode |= MODE_MOUSE;
+
+ mode_key_init(&data->mdata,
+ options_get_number(&wp->window->options, "mode-keys"), 0);
return (s);
}
@@ -124,6 +129,8 @@ window_choose_free(struct window_pane *wp)
{
struct window_choose_mode_data *data = wp->modedata;
u_int i;
+
+ mode_key_free(&data->mdata);
for (i = 0; i < ARRAY_LENGTH(&data->list); i++)
xfree(ARRAY_ITEM(&data->list, i).name);
@@ -154,23 +161,21 @@ window_choose_key(struct window_pane *wp, unused struct client *c, int key)
struct screen *s = &data->screen;
struct screen_write_ctx ctx;
struct window_choose_mode_item *item;
- int table;
u_int items;
items = ARRAY_LENGTH(&data->list);
- table = options_get_number(&wp->window->options, "mode-keys");
- switch (mode_key_lookup(table, key)) {
- case MODEKEY_QUIT:
+ switch (mode_key_lookup(&data->mdata, key)) {
+ case MODEKEYCMD_QUIT:
data->callback(data->data, -1);
window_pane_reset_mode(wp);
break;
- case MODEKEY_ENTER:
+ case MODEKEYCMD_CHOOSE:
item = &ARRAY_ITEM(&data->list, data->selected);
data->callback(data->data, item->idx);
window_pane_reset_mode(wp);
break;
- case MODEKEY_UP:
+ case MODEKEYCMD_UP:
if (items == 0)
break;
if (data->selected == 0) {
@@ -192,7 +197,7 @@ window_choose_key(struct window_pane *wp, unused struct client *c, int key)
screen_write_stop(&ctx);
}
break;
- case MODEKEY_DOWN:
+ case MODEKEYCMD_DOWN:
if (items == 0)
break;
if (data->selected == items - 1) {
@@ -213,7 +218,7 @@ window_choose_key(struct window_pane *wp, unused struct client *c, int key)
screen_write_stop(&ctx);
}
break;
- case MODEKEY_PPAGE:
+ case MODEKEYCMD_PREVIOUSPAGE:
if (data->selected < screen_size_y(s)) {
data->selected = 0;
data->top = 0;
@@ -226,11 +231,7 @@ window_choose_key(struct window_pane *wp, unused struct client *c, int key)
}
window_choose_redraw_screen(wp);
break;
- case MODEKEY_NONE:
- if (key != ' ')
- break;
- /* FALLTHROUGH */
- case MODEKEY_NPAGE:
+ case MODEKEYCMD_NEXTPAGE:
data->selected += screen_size_y(s);
if (data->selected > items - 1)
data->selected = items - 1;
diff --git a/window-copy.c b/window-copy.c
index 2e65ae76..dee4c1c4 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -1,4 +1,4 @@
-/* $Id: window-copy.c,v 1.49 2009-01-28 22:00:22 nicm Exp $ */
+/* $Id: window-copy.c,v 1.50 2009-02-13 21:39:45 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -73,6 +73,8 @@ const struct window_mode window_copy_mode = {
struct window_copy_mode_data {
struct screen screen;
+ struct mode_key_data mdata;
+
u_int ox;
u_int oy;
@@ -101,6 +103,9 @@ window_copy_init(struct window_pane *wp)
screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);
s->mode |= MODE_MOUSE;
+ mode_key_init(&data->mdata,
+ options_get_number(&wp->window->options, "mode-keys"), 0);
+
s->cx = data->cx;
s->cy = data->cy;
@@ -118,6 +123,8 @@ window_copy_free(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
+ mode_key_free(&data->mdata);
+
screen_free(&data->screen);
xfree(data);
}
@@ -155,29 +162,27 @@ window_copy_key(struct window_pane *wp, struct client *c, int key)
{
struct window_copy_mode_data *data = wp->modedata;
struct screen *s = &data->screen;
- int table;
- table = options_get_number(&wp->window->options, "mode-keys");
- switch (mode_key_lookup(table, key)) {
- case MODEKEY_QUIT:
+ switch (mode_key_lookup(&data->mdata, key)) {
+ case MODEKEYCMD_QUIT:
window_pane_reset_mode(wp);
break;
- case MODEKEY_LEFT:
+ case MODEKEYCMD_LEFT:
window_copy_cursor_left(wp);
return;
- case MODEKEY_RIGHT:
+ case MODEKEYCMD_RIGHT:
window_copy_cursor_right(wp);
return;
- case MODEKEY_UP:
+ case MODEKEYCMD_UP:
window_copy_cursor_up(wp);
return;
- case MODEKEY_DOWN:
+ case MODEKEYCMD_DOWN:
window_copy_cursor_down(wp);
return;
- case MODEKEY_PPAGE:
+ case MODEKEYCMD_PREVIOUSPAGE:
window_copy_pageup(wp);
break;
- case MODEKEY_NPAGE:
+ case MODEKEYCMD_NEXTPAGE:
if (data->oy < screen_size_y(s))
data->oy = 0;
else
@@ -185,30 +190,29 @@ window_copy_key(struct window_pane *wp, struct client *c, int key)
window_copy_update_selection(wp);
window_copy_redraw_screen(wp);
break;
- case MODEKEY_STARTSEL:
+ case MODEKEYCMD_STARTSELECTION:
window_copy_start_selection(wp);
break;
- case MODEKEY_CLEARSEL:
+ case MODEKEYCMD_CLEARSELECTION:
screen_clear_selection(&data->screen);
window_copy_redraw_screen(wp);
break;
- case MODEKEY_COPYSEL:
- case MODEKEY_ENTER:
+ case MODEKEYCMD_COPYSELECTION:
if (c != NULL && c->session != NULL) {
window_copy_copy_selection(wp, c);
window_pane_reset_mode(wp);
}
break;
- case MODEKEY_BOL:
+ case MODEKEYCMD_STARTOFLINE:
window_copy_cursor_start_of_line(wp);
break;
- case MODEKEY_EOL:
+ case MODEKEYCMD_ENDOFLINE:
window_copy_cursor_end_of_line(wp);
break;
- case MODEKEY_NWORD:
+ case MODEKEYCMD_NEXTWORD:
window_copy_cursor_next_word(wp);
break;
- case MODEKEY_PWORD:
+ case MODEKEYCMD_PREVIOUSWORD:
window_copy_cursor_previous_word(wp);
break;
default:
diff --git a/window-more.c b/window-more.c
index e397f3e1..97009a81 100644
--- a/window-more.c
+++ b/window-more.c
@@ -1,4 +1,4 @@
-/* $Id: window-more.c,v 1.28 2009-01-28 19:52:21 nicm Exp $ */
+/* $Id: window-more.c,v 1.29 2009-02-13 21:39:45 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -46,6 +46,8 @@ const struct window_mode window_more_mode = {
struct window_more_mode_data {
struct screen screen;
+ struct mode_key_data mdata;
+
ARRAY_DECL(, char *) list;
u_int top;
};
@@ -97,6 +99,9 @@ window_more_init(struct window_pane *wp)
screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);
s->mode &= ~MODE_CURSOR;
+ mode_key_init(&data->mdata,
+ options_get_number(&wp->window->options, "mode-keys"), 0);
+
return (s);
}
@@ -106,6 +111,8 @@ window_more_free(struct window_pane *wp)
struct window_more_mode_data *data = wp->modedata;
u_int i;
+ mode_key_free(&data->mdata);
+
for (i = 0; i < ARRAY_LENGTH(&data->list); i++)
xfree(ARRAY_ITEM(&data->list, i));
ARRAY_FREE(&data->list);
@@ -129,31 +136,25 @@ window_more_key(struct window_pane *wp, unused struct client *c, int key)
{
struct window_more_mode_data *data = wp->modedata;
struct screen *s = &data->screen;
- int table;
- table = options_get_number(&wp->window->options, "mode-keys");
- switch (mode_key_lookup(table, key)) {
- case MODEKEY_QUIT:
+ switch (mode_key_lookup(&data->mdata, key)) {
+ case MODEKEYCMD_QUIT:
window_pane_reset_mode(wp);
break;
- case MODEKEY_UP:
+ case MODEKEYCMD_UP:
window_more_scroll_up(wp);
break;
- case MODEKEY_DOWN:
+ case MODEKEYCMD_DOWN:
window_more_scroll_down(wp);
break;
- case MODEKEY_PPAGE:
+ case MODEKEYCMD_PREVIOUSPAGE:
if (data->top < screen_size_y(s))
data->top = 0;
else
data->top -= screen_size_y(s);
window_more_redraw_screen(wp);
break;
- case MODEKEY_NONE:
- if (key != ' ')
- break;
- /* FALLTHROUGH */
- case MODEKEY_NPAGE:
+ case MODEKEYCMD_NEXTPAGE:
if (data->top + screen_size_y(s) > ARRAY_LENGTH(&data->list))
data->top = ARRAY_LENGTH(&data->list);
else
diff --git a/window-scroll.c b/window-scroll.c
index 0d72294f..f7dff755 100644
--- a/window-scroll.c
+++ b/window-scroll.c
@@ -1,4 +1,4 @@
-/* $Id: window-scroll.c,v 1.31 2009-01-28 19:52:21 nicm Exp $ */
+/* $Id: window-scroll.c,v 1.32 2009-02-13 21:39:45 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -50,6 +50,8 @@ const struct window_mode window_scroll_mode = {
struct window_scroll_mode_data {
struct screen screen;
+ struct mode_key_data mdata;
+
u_int ox;
u_int oy;
};
@@ -70,6 +72,9 @@ window_scroll_init(struct window_pane *wp)
screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);
s->mode &= ~MODE_CURSOR;
+ mode_key_init(&data->mdata,
+ options_get_number(&wp->window->options, "mode-keys"), 0);
+
screen_write_start(&ctx, NULL, s);
for (i = 0; i < screen_size_y(s); i++)
window_scroll_write_line(wp, &ctx, i);
@@ -83,6 +88,8 @@ window_scroll_free(struct window_pane *wp)
{
struct window_scroll_mode_data *data = wp->modedata;
+ mode_key_free(&data->mdata);
+
screen_free(&data->screen);
xfree(data);
}
@@ -121,29 +128,27 @@ window_scroll_key(struct window_pane *wp, unused struct client *c, int key)
{
struct window_scroll_mode_data *data = wp->modedata;
struct screen *s = &data->screen;
- int table;
- table = options_get_number(&wp->window->options, "mode-keys");
- switch (mode_key_lookup(table, key)) {
- case MODEKEY_QUIT:
+ switch (mode_key_lookup(&data->mdata, key)) {
+ case MODEKEYCMD_QUIT:
window_pane_reset_mode(wp);
break;
- case MODEKEY_LEFT:
+ case MODEKEYCMD_LEFT:
window_scroll_scroll_left(wp);
break;
- case MODEKEY_RIGHT:
+ case MODEKEYCMD_RIGHT:
window_scroll_scroll_right(wp);
break;
- case MODEKEY_UP:
+ case MODEKEYCMD_UP:
window_scroll_scroll_up(wp);
break;
- case MODEKEY_DOWN:
+ case MODEKEYCMD_DOWN:
window_scroll_scroll_down(wp);
break;
- case MODEKEY_PPAGE:
+ case MODEKEYCMD_PREVIOUSPAGE:
window_scroll_pageup(wp);
break;
- case MODEKEY_NPAGE:
+ case MODEKEYCMD_NEXTPAGE:
if (data->oy < screen_size_y(s))
data->oy = 0;
else