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.

This commit is contained in:
Nicholas Marriott 2009-02-13 21:39:45 +00:00
parent 47e6b2725d
commit 95c8c049f5
11 changed files with 320 additions and 176 deletions

View File

@ -1,5 +1,10 @@
13 February 2009 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 * 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. 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 (including mutt, emacs). No status bar yet and no key remapping or other
customisation. 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: 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 LocalWords: rivo nurges lscm Erdely eol smysession mysession ek dstname RB ms

1
TODO
View File

@ -99,3 +99,4 @@
for stuff like mode keys? for stuff like mode keys?
- bug: copy mode gets the start of the selection wrong - bug: copy mode gets the start of the selection wrong
- ncmpc scroll up doesn't redraw properly - ncmpc scroll up doesn't redraw properly
- document status-keys

View File

@ -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> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -42,6 +42,9 @@ const struct cmd_entry cmd_set_option_entry = {
cmd_option_print cmd_option_print
}; };
const char *set_option_status_keys_list[] = {
"emacs", "vi", NULL
};
const char *set_option_bell_action_list[] = { const char *set_option_bell_action_list[] = {
"none", "any", "current", NULL "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-bg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "status-fg", SET_OPTION_COLOUR, 0, 0, NULL }, { "status-fg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "status-interval", SET_OPTION_NUMBER, 0, INT_MAX, 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", SET_OPTION_STRING, 0, 0, NULL },
{ "status-left-length", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL }, { "status-left-length", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
{ "status-right", SET_OPTION_STRING, 0, 0, NULL }, { "status-right", SET_OPTION_STRING, 0, 0, NULL },

View File

@ -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> * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@ -20,79 +20,180 @@
#include "tmux.h" #include "tmux.h"
struct mode_key_entry { enum mode_key_cmd mode_key_lookup_vi(struct mode_key_data *, int);
enum mode_key mkey; enum mode_key_cmd mode_key_lookup_emacs(struct mode_key_data *, int);
int key;
};
const struct mode_key_entry mode_key_table_vi[] = { void
{ MODEKEY_ENTER, '\r' }, /* must come first */ mode_key_init(struct mode_key_data *mdata, int type, int flags)
{ 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 },
};
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 },
};
enum mode_key
mode_key_lookup(int table, int key)
{ {
const struct mode_key_entry *ptr; mdata->type = type;
u_int i, n;
if (table == MODEKEY_EMACS) { if (flags & MODEKEY_CANEDIT)
ptr = mode_key_table_emacs; flags |= MODEKEY_EDITMODE;
n = nitems(mode_key_table_emacs); mdata->flags = flags;
} else if (table == MODEKEY_VI) { }
ptr = mode_key_table_vi;
n = nitems(mode_key_table_vi);
} else
return (MODEKEY_NONE);
for (i = 0; i < n; i++) { void
if (ptr[i].key == key) mode_key_free(unused struct mode_key_data *mdata)
return (ptr[i].mkey); {
} }
return (MODEKEY_NONE);
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_cmd
mode_key_lookup_vi(struct mode_key_data *mdata, int key)
{
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);
}
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);
}
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 (MODEKEYCMD_OTHERKEY);
} }

View File

@ -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> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -577,6 +577,10 @@ status_prompt_set(struct client *c,
c->prompt_hidden = hide; 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->tty.flags |= (TTY_NOCURSOR|TTY_FREEZE);
c->flags |= CLIENT_STATUS; c->flags |= CLIENT_STATUS;
} }
@ -587,6 +591,8 @@ status_prompt_clear(struct client *c)
if (c->prompt_string == NULL) if (c->prompt_string == NULL)
return; return;
mode_key_free(&c->prompt_mdata);
xfree(c->prompt_string); xfree(c->prompt_string);
c->prompt_string = NULL; c->prompt_string = NULL;
@ -682,35 +688,33 @@ status_prompt_key(struct client *c, int key)
size_t size, n, off, idx; size_t size, n, off, idx;
char word[64]; char word[64];
/* XXX This function needs some tidying... */
size = strlen(c->prompt_buffer); size = strlen(c->prompt_buffer);
switch (key) { switch (mode_key_lookup(&c->prompt_mdata, key)) {
case KEYC_LEFT: case MODEKEYCMD_LEFT:
if (c->prompt_index > 0) { if (c->prompt_index > 0) {
c->prompt_index--; c->prompt_index--;
c->flags |= CLIENT_STATUS; c->flags |= CLIENT_STATUS;
} }
break; break;
case KEYC_RIGHT: case MODEKEYCMD_RIGHT:
if (c->prompt_index < size) { if (c->prompt_index < size) {
c->prompt_index++; c->prompt_index++;
c->flags |= CLIENT_STATUS; c->flags |= CLIENT_STATUS;
} }
break; break;
case '\001': /* C-a */ case MODEKEYCMD_STARTOFLINE:
if (c->prompt_index != 0) { if (c->prompt_index != 0) {
c->prompt_index = 0; c->prompt_index = 0;
c->flags |= CLIENT_STATUS; c->flags |= CLIENT_STATUS;
} }
break; break;
case '\005': /* C-e */ case MODEKEYCMD_ENDOFLINE:
if (c->prompt_index != size) { if (c->prompt_index != size) {
c->prompt_index = size; c->prompt_index = size;
c->flags |= CLIENT_STATUS; c->flags |= CLIENT_STATUS;
} }
break; break;
case '\011': case MODEKEYCMD_COMPLETE:
if (*c->prompt_buffer == '\0') if (*c->prompt_buffer == '\0')
break; break;
@ -758,8 +762,7 @@ status_prompt_key(struct client *c, int key)
c->flags |= CLIENT_STATUS; c->flags |= CLIENT_STATUS;
break; break;
case '\010': case MODEKEYCMD_BACKSPACE:
case '\177':
if (c->prompt_index != 0) { if (c->prompt_index != 0) {
if (c->prompt_index == size) if (c->prompt_index == size)
c->prompt_buffer[--c->prompt_index] = '\0'; c->prompt_buffer[--c->prompt_index] = '\0';
@ -772,7 +775,7 @@ status_prompt_key(struct client *c, int key)
c->flags |= CLIENT_STATUS; c->flags |= CLIENT_STATUS;
} }
break; break;
case KEYC_DC: case MODEKEYCMD_DELETE:
if (c->prompt_index != size) { if (c->prompt_index != size) {
memmove(c->prompt_buffer + c->prompt_index, memmove(c->prompt_buffer + c->prompt_index,
c->prompt_buffer + c->prompt_index + 1, c->prompt_buffer + c->prompt_index + 1,
@ -780,7 +783,7 @@ status_prompt_key(struct client *c, int key)
c->flags |= CLIENT_STATUS; c->flags |= CLIENT_STATUS;
} }
break; break;
case KEYC_UP: case MODEKEYCMD_UP:
if (ARRAY_LENGTH(&c->prompt_hdata) == 0) if (ARRAY_LENGTH(&c->prompt_hdata) == 0)
break; break;
xfree(c->prompt_buffer); xfree(c->prompt_buffer);
@ -793,7 +796,7 @@ status_prompt_key(struct client *c, int key)
c->prompt_index = strlen(c->prompt_buffer); c->prompt_index = strlen(c->prompt_buffer);
c->flags |= CLIENT_STATUS; c->flags |= CLIENT_STATUS;
break; break;
case KEYC_DOWN: case MODEKEYCMD_DOWN:
xfree(c->prompt_buffer); xfree(c->prompt_buffer);
if (c->prompt_hindex != 0) { 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->prompt_index = strlen(c->prompt_buffer);
c->flags |= CLIENT_STATUS; c->flags |= CLIENT_STATUS;
break; break;
case '\r': /* enter */ case MODEKEYCMD_CHOOSE:
if (*c->prompt_buffer != '\0') { if (*c->prompt_buffer != '\0') {
status_prompt_add_history(c); status_prompt_add_history(c);
if (c->prompt_callback( if (c->prompt_callback(
@ -816,12 +819,12 @@ status_prompt_key(struct client *c, int key)
break; break;
} }
/* FALLTHROUGH */ /* FALLTHROUGH */
case '\033': /* escape */ case MODEKEYCMD_QUIT:
if (c->prompt_callback(c->prompt_data, NULL) == 0) if (c->prompt_callback(c->prompt_data, NULL) == 0)
status_prompt_clear(c); status_prompt_clear(c);
break; break;
default: case MODEKEYCMD_OTHERKEY:
if (key < 32) if (key < 32 || key > 126)
break; break;
c->prompt_buffer = xrealloc(c->prompt_buffer, 1, size + 2); 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; c->flags |= CLIENT_STATUS;
break; break;
default:
break;
} }
} }

3
tmux.c
View File

@ -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> * 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-left", "[#S]");
options_set_string( options_set_string(
&global_options, "status-right", "\"#24T\" %%H:%%M %%d-%%b-%%y"); &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_init(&global_window_options, NULL);
options_set_number(&global_window_options, "aggressive-resize", 0); options_set_number(&global_window_options, "aggressive-resize", 0);
options_set_number(&global_window_options, "clock-mode-colour", 4); options_set_number(&global_window_options, "clock-mode-colour", 4);

66
tmux.h
View File

@ -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> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -398,6 +398,41 @@ struct msg_resize_data {
u_int sy; 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. */ /* Modes. */
#define MODE_CURSOR 0x1 #define MODE_CURSOR 0x1
#define MODE_INSERT 0x2 #define MODE_INSERT 0x2
@ -786,6 +821,7 @@ struct client {
int prompt_hidden; int prompt_hidden;
u_int prompt_hindex; u_int prompt_hindex;
ARRAY_DECL(, char *) prompt_hdata; ARRAY_DECL(, char *) prompt_hdata;
struct mode_key_data prompt_mdata;
struct session *session; 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_option_table[];
extern const struct set_option_entry set_window_option_table[]; extern const struct set_option_entry set_window_option_table[];
#define NSETOPTION 22 #define NSETOPTION 23
#define NSETWINDOWOPTION 17 #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 #ifdef NO_STRTONUM
/* strtonum.c */ /* strtonum.c */
long long strtonum(const char *, long long, long long, const char **); 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); int load_cfg(const char *, char **x);
/* mode-key.c */ /* 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 */ /* options.c */
int options_cmp(struct options_entry *, struct options_entry *); int options_cmp(struct options_entry *, struct options_entry *);

View File

@ -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> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@ -53,6 +53,8 @@ struct window_choose_mode_item {
struct window_choose_mode_data { struct window_choose_mode_data {
struct screen screen; struct screen screen;
struct mode_key_data mdata;
ARRAY_DECL(, struct window_choose_mode_item) list; ARRAY_DECL(, struct window_choose_mode_item) list;
u_int top; u_int top;
u_int selected; u_int selected;
@ -116,6 +118,9 @@ window_choose_init(struct window_pane *wp)
s->mode &= ~MODE_CURSOR; s->mode &= ~MODE_CURSOR;
s->mode |= MODE_MOUSE; s->mode |= MODE_MOUSE;
mode_key_init(&data->mdata,
options_get_number(&wp->window->options, "mode-keys"), 0);
return (s); return (s);
} }
@ -125,6 +130,8 @@ window_choose_free(struct window_pane *wp)
struct window_choose_mode_data *data = wp->modedata; struct window_choose_mode_data *data = wp->modedata;
u_int i; u_int i;
mode_key_free(&data->mdata);
for (i = 0; i < ARRAY_LENGTH(&data->list); i++) for (i = 0; i < ARRAY_LENGTH(&data->list); i++)
xfree(ARRAY_ITEM(&data->list, i).name); xfree(ARRAY_ITEM(&data->list, i).name);
ARRAY_FREE(&data->list); ARRAY_FREE(&data->list);
@ -154,23 +161,21 @@ window_choose_key(struct window_pane *wp, unused struct client *c, int key)
struct screen *s = &data->screen; struct screen *s = &data->screen;
struct screen_write_ctx ctx; struct screen_write_ctx ctx;
struct window_choose_mode_item *item; struct window_choose_mode_item *item;
int table;
u_int items; u_int items;
items = ARRAY_LENGTH(&data->list); items = ARRAY_LENGTH(&data->list);
table = options_get_number(&wp->window->options, "mode-keys"); switch (mode_key_lookup(&data->mdata, key)) {
switch (mode_key_lookup(table, key)) { case MODEKEYCMD_QUIT:
case MODEKEY_QUIT:
data->callback(data->data, -1); data->callback(data->data, -1);
window_pane_reset_mode(wp); window_pane_reset_mode(wp);
break; break;
case MODEKEY_ENTER: case MODEKEYCMD_CHOOSE:
item = &ARRAY_ITEM(&data->list, data->selected); item = &ARRAY_ITEM(&data->list, data->selected);
data->callback(data->data, item->idx); data->callback(data->data, item->idx);
window_pane_reset_mode(wp); window_pane_reset_mode(wp);
break; break;
case MODEKEY_UP: case MODEKEYCMD_UP:
if (items == 0) if (items == 0)
break; break;
if (data->selected == 0) { 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); screen_write_stop(&ctx);
} }
break; break;
case MODEKEY_DOWN: case MODEKEYCMD_DOWN:
if (items == 0) if (items == 0)
break; break;
if (data->selected == items - 1) { 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); screen_write_stop(&ctx);
} }
break; break;
case MODEKEY_PPAGE: case MODEKEYCMD_PREVIOUSPAGE:
if (data->selected < screen_size_y(s)) { if (data->selected < screen_size_y(s)) {
data->selected = 0; data->selected = 0;
data->top = 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); window_choose_redraw_screen(wp);
break; break;
case MODEKEY_NONE: case MODEKEYCMD_NEXTPAGE:
if (key != ' ')
break;
/* FALLTHROUGH */
case MODEKEY_NPAGE:
data->selected += screen_size_y(s); data->selected += screen_size_y(s);
if (data->selected > items - 1) if (data->selected > items - 1)
data->selected = items - 1; data->selected = items - 1;

View File

@ -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> * 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 window_copy_mode_data {
struct screen screen; struct screen screen;
struct mode_key_data mdata;
u_int ox; u_int ox;
u_int oy; 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); screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);
s->mode |= MODE_MOUSE; s->mode |= MODE_MOUSE;
mode_key_init(&data->mdata,
options_get_number(&wp->window->options, "mode-keys"), 0);
s->cx = data->cx; s->cx = data->cx;
s->cy = data->cy; s->cy = data->cy;
@ -118,6 +123,8 @@ window_copy_free(struct window_pane *wp)
{ {
struct window_copy_mode_data *data = wp->modedata; struct window_copy_mode_data *data = wp->modedata;
mode_key_free(&data->mdata);
screen_free(&data->screen); screen_free(&data->screen);
xfree(data); 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 window_copy_mode_data *data = wp->modedata;
struct screen *s = &data->screen; struct screen *s = &data->screen;
int table;
table = options_get_number(&wp->window->options, "mode-keys"); switch (mode_key_lookup(&data->mdata, key)) {
switch (mode_key_lookup(table, key)) { case MODEKEYCMD_QUIT:
case MODEKEY_QUIT:
window_pane_reset_mode(wp); window_pane_reset_mode(wp);
break; break;
case MODEKEY_LEFT: case MODEKEYCMD_LEFT:
window_copy_cursor_left(wp); window_copy_cursor_left(wp);
return; return;
case MODEKEY_RIGHT: case MODEKEYCMD_RIGHT:
window_copy_cursor_right(wp); window_copy_cursor_right(wp);
return; return;
case MODEKEY_UP: case MODEKEYCMD_UP:
window_copy_cursor_up(wp); window_copy_cursor_up(wp);
return; return;
case MODEKEY_DOWN: case MODEKEYCMD_DOWN:
window_copy_cursor_down(wp); window_copy_cursor_down(wp);
return; return;
case MODEKEY_PPAGE: case MODEKEYCMD_PREVIOUSPAGE:
window_copy_pageup(wp); window_copy_pageup(wp);
break; break;
case MODEKEY_NPAGE: case MODEKEYCMD_NEXTPAGE:
if (data->oy < screen_size_y(s)) if (data->oy < screen_size_y(s))
data->oy = 0; data->oy = 0;
else else
@ -185,30 +190,29 @@ window_copy_key(struct window_pane *wp, struct client *c, int key)
window_copy_update_selection(wp); window_copy_update_selection(wp);
window_copy_redraw_screen(wp); window_copy_redraw_screen(wp);
break; break;
case MODEKEY_STARTSEL: case MODEKEYCMD_STARTSELECTION:
window_copy_start_selection(wp); window_copy_start_selection(wp);
break; break;
case MODEKEY_CLEARSEL: case MODEKEYCMD_CLEARSELECTION:
screen_clear_selection(&data->screen); screen_clear_selection(&data->screen);
window_copy_redraw_screen(wp); window_copy_redraw_screen(wp);
break; break;
case MODEKEY_COPYSEL: case MODEKEYCMD_COPYSELECTION:
case MODEKEY_ENTER:
if (c != NULL && c->session != NULL) { if (c != NULL && c->session != NULL) {
window_copy_copy_selection(wp, c); window_copy_copy_selection(wp, c);
window_pane_reset_mode(wp); window_pane_reset_mode(wp);
} }
break; break;
case MODEKEY_BOL: case MODEKEYCMD_STARTOFLINE:
window_copy_cursor_start_of_line(wp); window_copy_cursor_start_of_line(wp);
break; break;
case MODEKEY_EOL: case MODEKEYCMD_ENDOFLINE:
window_copy_cursor_end_of_line(wp); window_copy_cursor_end_of_line(wp);
break; break;
case MODEKEY_NWORD: case MODEKEYCMD_NEXTWORD:
window_copy_cursor_next_word(wp); window_copy_cursor_next_word(wp);
break; break;
case MODEKEY_PWORD: case MODEKEYCMD_PREVIOUSWORD:
window_copy_cursor_previous_word(wp); window_copy_cursor_previous_word(wp);
break; break;
default: default:

View File

@ -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> * 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 window_more_mode_data {
struct screen screen; struct screen screen;
struct mode_key_data mdata;
ARRAY_DECL(, char *) list; ARRAY_DECL(, char *) list;
u_int top; 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); screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);
s->mode &= ~MODE_CURSOR; s->mode &= ~MODE_CURSOR;
mode_key_init(&data->mdata,
options_get_number(&wp->window->options, "mode-keys"), 0);
return (s); return (s);
} }
@ -106,6 +111,8 @@ window_more_free(struct window_pane *wp)
struct window_more_mode_data *data = wp->modedata; struct window_more_mode_data *data = wp->modedata;
u_int i; u_int i;
mode_key_free(&data->mdata);
for (i = 0; i < ARRAY_LENGTH(&data->list); i++) for (i = 0; i < ARRAY_LENGTH(&data->list); i++)
xfree(ARRAY_ITEM(&data->list, i)); xfree(ARRAY_ITEM(&data->list, i));
ARRAY_FREE(&data->list); 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 window_more_mode_data *data = wp->modedata;
struct screen *s = &data->screen; struct screen *s = &data->screen;
int table;
table = options_get_number(&wp->window->options, "mode-keys"); switch (mode_key_lookup(&data->mdata, key)) {
switch (mode_key_lookup(table, key)) { case MODEKEYCMD_QUIT:
case MODEKEY_QUIT:
window_pane_reset_mode(wp); window_pane_reset_mode(wp);
break; break;
case MODEKEY_UP: case MODEKEYCMD_UP:
window_more_scroll_up(wp); window_more_scroll_up(wp);
break; break;
case MODEKEY_DOWN: case MODEKEYCMD_DOWN:
window_more_scroll_down(wp); window_more_scroll_down(wp);
break; break;
case MODEKEY_PPAGE: case MODEKEYCMD_PREVIOUSPAGE:
if (data->top < screen_size_y(s)) if (data->top < screen_size_y(s))
data->top = 0; data->top = 0;
else else
data->top -= screen_size_y(s); data->top -= screen_size_y(s);
window_more_redraw_screen(wp); window_more_redraw_screen(wp);
break; break;
case MODEKEY_NONE: case MODEKEYCMD_NEXTPAGE:
if (key != ' ')
break;
/* FALLTHROUGH */
case MODEKEY_NPAGE:
if (data->top + screen_size_y(s) > ARRAY_LENGTH(&data->list)) if (data->top + screen_size_y(s) > ARRAY_LENGTH(&data->list))
data->top = ARRAY_LENGTH(&data->list); data->top = ARRAY_LENGTH(&data->list);
else else

View File

@ -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> * 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 window_scroll_mode_data {
struct screen screen; struct screen screen;
struct mode_key_data mdata;
u_int ox; u_int ox;
u_int oy; 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); screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);
s->mode &= ~MODE_CURSOR; s->mode &= ~MODE_CURSOR;
mode_key_init(&data->mdata,
options_get_number(&wp->window->options, "mode-keys"), 0);
screen_write_start(&ctx, NULL, s); screen_write_start(&ctx, NULL, s);
for (i = 0; i < screen_size_y(s); i++) for (i = 0; i < screen_size_y(s); i++)
window_scroll_write_line(wp, &ctx, 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; struct window_scroll_mode_data *data = wp->modedata;
mode_key_free(&data->mdata);
screen_free(&data->screen); screen_free(&data->screen);
xfree(data); 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 window_scroll_mode_data *data = wp->modedata;
struct screen *s = &data->screen; struct screen *s = &data->screen;
int table;
table = options_get_number(&wp->window->options, "mode-keys"); switch (mode_key_lookup(&data->mdata, key)) {
switch (mode_key_lookup(table, key)) { case MODEKEYCMD_QUIT:
case MODEKEY_QUIT:
window_pane_reset_mode(wp); window_pane_reset_mode(wp);
break; break;
case MODEKEY_LEFT: case MODEKEYCMD_LEFT:
window_scroll_scroll_left(wp); window_scroll_scroll_left(wp);
break; break;
case MODEKEY_RIGHT: case MODEKEYCMD_RIGHT:
window_scroll_scroll_right(wp); window_scroll_scroll_right(wp);
break; break;
case MODEKEY_UP: case MODEKEYCMD_UP:
window_scroll_scroll_up(wp); window_scroll_scroll_up(wp);
break; break;
case MODEKEY_DOWN: case MODEKEYCMD_DOWN:
window_scroll_scroll_down(wp); window_scroll_scroll_down(wp);
break; break;
case MODEKEY_PPAGE: case MODEKEYCMD_PREVIOUSPAGE:
window_scroll_pageup(wp); window_scroll_pageup(wp);
break; break;
case MODEKEY_NPAGE: case MODEKEYCMD_NEXTPAGE:
if (data->oy < screen_size_y(s)) if (data->oy < screen_size_y(s))
data->oy = 0; data->oy = 0;
else else