=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/Attic/window-choose.c,v retrieving revision 1.84 retrieving revision 1.85 diff -c -r1.84 -r1.85 *** src/usr.bin/tmux/Attic/window-choose.c 2017/01/15 22:00:56 1.84 --- src/usr.bin/tmux/Attic/window-choose.c 2017/01/24 21:50:23 1.85 *************** *** 1,4 **** ! /* $OpenBSD: window-choose.c,v 1.84 2017/01/15 22:00:56 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: window-choose.c,v 1.85 2017/01/24 21:50:23 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott *************** *** 74,81 **** struct window_choose_mode_data { struct screen screen; - struct mode_key_data mdata; - struct window_choose_mode_item *list; u_int list_size; struct window_choose_mode_item *old_list; --- 74,79 ---- *************** *** 91,101 **** void (*callbackfn)(struct window_choose_data *); }; static void window_choose_free1(struct window_choose_mode_data *); ! static int window_choose_key_index(struct window_choose_mode_data *, ! u_int); ! static int window_choose_index_key(struct window_choose_mode_data *, ! key_code); static void window_choose_prompt_input(enum window_choose_input_type, const char *, struct window_pane *, key_code); static void window_choose_reset_top(struct window_pane *, u_int); --- 89,104 ---- void (*callbackfn)(struct window_choose_data *); }; + static const char window_choose_keys_emacs[] = "0123456789" + "abcdefghijklmnoprstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + static const char window_choose_keys_vi[] = "0123456789" + "abcdefhilmnoprstuvwxyz" + "ABCDEFIJKMNOPQRSTUVWXYZ"; + static void window_choose_free1(struct window_choose_mode_data *); ! static int window_choose_key_index(struct window_pane *, u_int); ! static int window_choose_index_key(struct window_pane *, key_code); static void window_choose_prompt_input(enum window_choose_input_type, const char *, struct window_pane *, key_code); static void window_choose_reset_top(struct window_pane *, u_int); *************** *** 168,174 **** { struct window_choose_mode_data *data; struct screen *s; - int keys; wp->modedata = data = xcalloc(1, sizeof *data); --- 171,176 ---- *************** *** 189,200 **** screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0); s->mode &= ~MODE_CURSOR; - keys = options_get_number(wp->window->options, "mode-keys"); - if (keys == MODEKEY_EMACS) - mode_key_init(&data->mdata, &mode_key_tree_emacs_choice); - else - mode_key_init(&data->mdata, &mode_key_tree_vi_choice); - return (s); } --- 191,196 ---- *************** *** 547,555 **** return (&data->list[idx]); } static void window_choose_key(struct window_pane *wp, __unused struct client *c, ! __unused struct session *sess, key_code key, struct mouse_event *m) { struct window_choose_mode_data *data = wp->modedata; struct screen *s = &data->screen; --- 543,616 ---- return (&data->list[idx]); } + static key_code + window_choose_translate_key(key_code key) + { + switch (key) { + case '0'|KEYC_ESCAPE: + case '1'|KEYC_ESCAPE: + case '2'|KEYC_ESCAPE: + case '3'|KEYC_ESCAPE: + case '4'|KEYC_ESCAPE: + case '5'|KEYC_ESCAPE: + case '6'|KEYC_ESCAPE: + case '7'|KEYC_ESCAPE: + case '8'|KEYC_ESCAPE: + case '9'|KEYC_ESCAPE: + case '\003': /* C-c */ + case 'q': + case '\n': + case '\r': + case KEYC_BSPACE: + case ' ': + case KEYC_LEFT: + case KEYC_RIGHT: + case KEYC_LEFT|KEYC_CTRL: + case KEYC_RIGHT|KEYC_CTRL: + case KEYC_MOUSEDOWN1_PANE: + case KEYC_MOUSEDOWN3_PANE: + case KEYC_WHEELUP_PANE: + case KEYC_WHEELDOWN_PANE: + return (key); + case '\031': /* C-y */ + case KEYC_UP|KEYC_CTRL: + return (KEYC_UP|KEYC_CTRL); + case '\002': /* C-b */ + case KEYC_PPAGE: + return (KEYC_PPAGE); + case '\005': /* C-e */ + case KEYC_DOWN|KEYC_CTRL: + return (KEYC_DOWN|KEYC_CTRL); + case '\006': /* C-f */ + case KEYC_NPAGE: + return (KEYC_NPAGE); + case 'j': + case KEYC_DOWN: + return (KEYC_DOWN); + case 'k': + case KEYC_UP: + return (KEYC_UP); + case 'g': + case KEYC_HOME: + return (KEYC_HOME); + case 'G': + case KEYC_END: + return (KEYC_END); + case 'H': + return ('R'|KEYC_ESCAPE); + case 'L': + return ('r'|KEYC_ESCAPE); + } + if ((key >= '0' && key <= '9') || + (key >= 'a' && key <= 'z') || + (key >= 'A' && key <= 'Z')) + return (key); + return (KEYC_NONE); + } + static void window_choose_key(struct window_pane *wp, __unused struct client *c, ! __unused struct session *sp, key_code key, struct mouse_event *m) { struct window_choose_mode_data *data = wp->modedata; struct screen *s = &data->screen; *************** *** 557,573 **** struct window_choose_mode_item *item; size_t input_len; u_int items, n; ! int idx; items = data->list_size; if (data->input_type == WINDOW_CHOOSE_GOTO_ITEM) { ! switch (mode_key_lookup(&data->mdata, key)) { ! case MODEKEYCHOICE_CANCEL: data->input_type = WINDOW_CHOOSE_NORMAL; window_choose_redraw_screen(wp); break; ! case MODEKEYCHOICE_CHOOSE: n = strtonum(data->input_str, 0, INT_MAX, NULL); if (n > items - 1) { data->input_type = WINDOW_CHOOSE_NORMAL; --- 618,643 ---- struct window_choose_mode_item *item; size_t input_len; u_int items, n; ! int idx, keys; + keys = options_get_number(wp->window->options, "mode-keys"); + if (keys == MODEKEY_VI) { + key = window_choose_translate_key(key); + if (key == KEYC_NONE) + return; + } items = data->list_size; if (data->input_type == WINDOW_CHOOSE_GOTO_ITEM) { ! switch (key) { ! case '\003': /* C-c */ ! case '\033': /* Escape */ ! case 'q': data->input_type = WINDOW_CHOOSE_NORMAL; window_choose_redraw_screen(wp); break; ! case '\n': ! case '\r': n = strtonum(data->input_str, 0, INT_MAX, NULL); if (n > items - 1) { data->input_type = WINDOW_CHOOSE_NORMAL; *************** *** 576,582 **** } window_choose_fire_callback(wp, data->list[n].wcd); break; ! case MODEKEYCHOICE_BACKSPACE: input_len = strlen(data->input_str); if (input_len > 0) data->input_str[input_len - 1] = '\0'; --- 646,652 ---- } window_choose_fire_callback(wp, data->list[n].wcd); break; ! case KEYC_BSPACE: input_len = strlen(data->input_str); if (input_len > 0) data->input_str[input_len - 1] = '\0'; *************** *** 592,607 **** return; } ! switch (mode_key_lookup(&data->mdata, key)) { ! case MODEKEYCHOICE_CANCEL: window_choose_fire_callback(wp, NULL); break; ! case MODEKEYCHOICE_CHOOSE: if ((item = window_choose_get_item(wp, key, m)) == NULL) break; window_choose_fire_callback(wp, item->wcd); break; ! case MODEKEYCHOICE_TREE_TOGGLE: if ((item = window_choose_get_item(wp, key, m)) == NULL) break; if (item->state & TREE_EXPANDED) { --- 662,682 ---- return; } ! switch (key) { ! case '\003': /* C-c */ ! case '\033': /* Escape */ ! case 'q': window_choose_fire_callback(wp, NULL); break; ! case '\n': ! case '\r': ! case KEYC_MOUSEDOWN1_PANE: if ((item = window_choose_get_item(wp, key, m)) == NULL) break; window_choose_fire_callback(wp, item->wcd); break; ! case ' ': ! case KEYC_MOUSEDOWN3_PANE: if ((item = window_choose_get_item(wp, key, m)) == NULL) break; if (item->state & TREE_EXPANDED) { *************** *** 613,619 **** } window_choose_redraw_screen(wp); break; ! case MODEKEYCHOICE_TREE_COLLAPSE: if ((item = window_choose_get_item(wp, key, m)) == NULL) break; if (item->state & TREE_EXPANDED) { --- 688,694 ---- } window_choose_redraw_screen(wp); break; ! case KEYC_LEFT: if ((item = window_choose_get_item(wp, key, m)) == NULL) break; if (item->state & TREE_EXPANDED) { *************** *** 622,631 **** window_choose_redraw_screen(wp); } break; ! case MODEKEYCHOICE_TREE_COLLAPSE_ALL: window_choose_collapse_all(wp); break; ! case MODEKEYCHOICE_TREE_EXPAND: if ((item = window_choose_get_item(wp, key, m)) == NULL) break; if (!(item->state & TREE_EXPANDED)) { --- 697,706 ---- window_choose_redraw_screen(wp); } break; ! case KEYC_LEFT|KEYC_CTRL: window_choose_collapse_all(wp); break; ! case KEYC_RIGHT: if ((item = window_choose_get_item(wp, key, m)) == NULL) break; if (!(item->state & TREE_EXPANDED)) { *************** *** 634,643 **** window_choose_redraw_screen(wp); } break; ! case MODEKEYCHOICE_TREE_EXPAND_ALL: window_choose_expand_all(wp); break; ! case MODEKEYCHOICE_UP: if (items == 0) break; if (data->selected == 0) { --- 709,720 ---- window_choose_redraw_screen(wp); } break; ! case KEYC_RIGHT|KEYC_CTRL: window_choose_expand_all(wp); break; ! case '\020': /* C-p */ ! case KEYC_UP: ! case KEYC_WHEELUP_PANE: if (items == 0) break; if (data->selected == 0) { *************** *** 659,665 **** screen_write_stop(&ctx); } break; ! case MODEKEYCHOICE_DOWN: if (items == 0) break; if (data->selected == items - 1) { --- 736,744 ---- screen_write_stop(&ctx); } break; ! case '\016': /* C-n */ ! case KEYC_DOWN: ! case KEYC_WHEELDOWN_PANE: if (items == 0) break; if (data->selected == items - 1) { *************** *** 680,686 **** } else window_choose_scroll_down(wp); break; ! case MODEKEYCHOICE_SCROLLUP: if (items == 0 || data->top == 0) break; if (data->selected == data->top + screen_size_y(s) - 1) { --- 759,765 ---- } else window_choose_scroll_down(wp); break; ! case KEYC_UP|KEYC_CTRL: if (items == 0 || data->top == 0) break; if (data->selected == data->top + screen_size_y(s) - 1) { *************** *** 693,699 **** } else window_choose_scroll_up(wp); break; ! case MODEKEYCHOICE_SCROLLDOWN: if (items == 0 || data->top + screen_size_y(&data->screen) >= items) break; --- 772,778 ---- } else window_choose_scroll_up(wp); break; ! case KEYC_DOWN|KEYC_CTRL: if (items == 0 || data->top + screen_size_y(&data->screen) >= items) break; *************** *** 706,712 **** } else window_choose_scroll_down(wp); break; ! case MODEKEYCHOICE_PAGEUP: if (data->selected < screen_size_y(s)) { data->selected = 0; data->top = 0; --- 785,791 ---- } else window_choose_scroll_down(wp); break; ! case KEYC_PPAGE: if (data->selected < screen_size_y(s)) { data->selected = 0; data->top = 0; *************** *** 719,725 **** } window_choose_redraw_screen(wp); break; ! case MODEKEYCHOICE_PAGEDOWN: data->selected += screen_size_y(s); if (data->selected > items - 1) data->selected = items - 1; --- 798,804 ---- } window_choose_redraw_screen(wp); break; ! case KEYC_NPAGE: data->selected += screen_size_y(s); if (data->selected > items - 1) data->selected = items - 1; *************** *** 733,767 **** data->top = data->selected; window_choose_redraw_screen(wp); break; ! case MODEKEYCHOICE_BACKSPACE: input_len = strlen(data->input_str); if (input_len > 0) data->input_str[input_len - 1] = '\0'; window_choose_redraw_screen(wp); break; ! case MODEKEYCHOICE_STARTNUMBERPREFIX: key &= KEYC_MASK_KEY; if (key < '0' || key > '9') break; window_choose_prompt_input(WINDOW_CHOOSE_GOTO_ITEM, "Goto Item", wp, key); break; ! case MODEKEYCHOICE_STARTOFLIST: data->selected = 0; data->top = 0; window_choose_redraw_screen(wp); break; ! case MODEKEYCHOICE_TOPLINE: data->selected = data->top; window_choose_redraw_screen(wp); break; ! case MODEKEYCHOICE_BOTTOMLINE: data->selected = data->top + screen_size_y(s) - 1; if (data->selected > items - 1) data->selected = items - 1; window_choose_redraw_screen(wp); break; ! case MODEKEYCHOICE_ENDOFLIST: data->selected = items - 1; if (screen_size_y(s) < items) data->top = items - screen_size_y(s); --- 812,857 ---- data->top = data->selected; window_choose_redraw_screen(wp); break; ! case KEYC_BSPACE: input_len = strlen(data->input_str); if (input_len > 0) data->input_str[input_len - 1] = '\0'; window_choose_redraw_screen(wp); break; ! case '0'|KEYC_ESCAPE: ! case '1'|KEYC_ESCAPE: ! case '2'|KEYC_ESCAPE: ! case '3'|KEYC_ESCAPE: ! case '4'|KEYC_ESCAPE: ! case '5'|KEYC_ESCAPE: ! case '6'|KEYC_ESCAPE: ! case '7'|KEYC_ESCAPE: ! case '8'|KEYC_ESCAPE: ! case '9'|KEYC_ESCAPE: key &= KEYC_MASK_KEY; if (key < '0' || key > '9') break; window_choose_prompt_input(WINDOW_CHOOSE_GOTO_ITEM, "Goto Item", wp, key); break; ! case KEYC_HOME: ! case '<'|KEYC_ESCAPE: data->selected = 0; data->top = 0; window_choose_redraw_screen(wp); break; ! case 'R'|KEYC_ESCAPE: data->selected = data->top; window_choose_redraw_screen(wp); break; ! case 'r'|KEYC_ESCAPE: data->selected = data->top + screen_size_y(s) - 1; if (data->selected > items - 1) data->selected = items - 1; window_choose_redraw_screen(wp); break; ! case KEYC_END: ! case '>'|KEYC_ESCAPE: data->selected = items - 1; if (screen_size_y(s) < items) data->top = items - screen_size_y(s); *************** *** 770,776 **** window_choose_redraw_screen(wp); break; default: ! idx = window_choose_index_key(data, key); if (idx < 0 || (u_int) idx >= data->list_size) break; data->selected = idx; --- 860,866 ---- window_choose_redraw_screen(wp); break; default: ! idx = window_choose_index_key(wp, key); if (idx < 0 || (u_int) idx >= data->list_size) break; data->selected = idx; *************** *** 808,814 **** item->wcd->wl->flags & WINLINK_ALERTFLAGS) gc.attr |= GRID_ATTR_BRIGHT; ! key = window_choose_key_index(data, data->top + py); if (key != -1) xsnprintf(label, sizeof label, "(%c)", key); else --- 898,904 ---- item->wcd->wl->flags & WINLINK_ALERTFLAGS) gc.attr |= GRID_ATTR_BRIGHT; ! key = window_choose_key_index(wp, data->top + py); if (key != -1) xsnprintf(label, sizeof label, "(%c)", key); else *************** *** 839,856 **** } static int ! window_choose_key_index(struct window_choose_mode_data *data, u_int idx) { ! static const char keys[] = "0123456789" ! "abcdefghijklmnopqrstuvwxyz" ! "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; ! const char *ptr; ! int mkey; ! for (ptr = keys; *ptr != '\0'; ptr++) { ! mkey = mode_key_lookup(&data->mdata, *ptr); ! if (mkey != MODEKEY_NONE && mkey != MODEKEY_OTHER) ! continue; if (idx-- == 0) return (*ptr); } --- 929,945 ---- } static int ! window_choose_key_index(struct window_pane *wp, u_int idx) { ! const char *ptr; ! int keys; ! keys = options_get_number(wp->window->options, "mode-keys"); ! if (keys == MODEKEY_VI) ! ptr = window_choose_keys_vi; ! else ! ptr = window_choose_keys_emacs; ! for (; *ptr != '\0'; ptr++) { if (idx-- == 0) return (*ptr); } *************** *** 858,876 **** } static int ! window_choose_index_key(struct window_choose_mode_data *data, key_code key) { ! static const char keys[] = "0123456789" ! "abcdefghijklmnopqrstuvwxyz" ! "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; ! const char *ptr; ! int mkey; ! u_int idx = 0; ! for (ptr = keys; *ptr != '\0'; ptr++) { ! mkey = mode_key_lookup(&data->mdata, *ptr); ! if (mkey != MODEKEY_NONE && mkey != MODEKEY_OTHER) ! continue; if (key == (key_code)*ptr) return (idx); idx++; --- 947,964 ---- } static int ! window_choose_index_key(struct window_pane *wp, key_code key) { ! const char *ptr; ! int keys; ! u_int idx = 0; ! keys = options_get_number(wp->window->options, "mode-keys"); ! if (keys == MODEKEY_VI) ! ptr = window_choose_keys_vi; ! else ! ptr = window_choose_keys_emacs; ! for (; *ptr != '\0'; ptr++) { if (key == (key_code)*ptr) return (idx); idx++;