From 95c8c049f5a0a0511108918cedd195f6f13e1004 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Fri, 13 Feb 2009 21:39:45 +0000 Subject: [PATCH] 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. --- CHANGES | 7 +- TODO | 1 + cmd-set-option.c | 6 +- mode-key.c | 247 +++++++++++++++++++++++++++++++++-------------- status.c | 41 ++++---- tmux.c | 3 +- tmux.h | 66 ++++++++----- window-choose.c | 29 +++--- window-copy.c | 42 ++++---- window-more.c | 27 +++--- window-scroll.c | 27 +++--- 11 files changed, 320 insertions(+), 176 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 @@ -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 @@ -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 }, -}; - -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) +void +mode_key_init(struct mode_key_data *mdata, int type, int flags) { - const struct mode_key_entry *ptr; - u_int i, n; + mdata->type = type; - 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); - - for (i = 0; i < n; i++) { - if (ptr[i].key == key) - return (ptr[i].mkey); - } - return (MODEKEY_NONE); + if (flags & MODEKEY_CANEDIT) + flags |= MODEKEY_EDITMODE; + mdata->flags = flags; +} + +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_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); } 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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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