aboutsummaryrefslogtreecommitdiff
path: root/window-choose.c
diff options
context:
space:
mode:
Diffstat (limited to 'window-choose.c')
-rw-r--r--window-choose.c218
1 files changed, 153 insertions, 65 deletions
diff --git a/window-choose.c b/window-choose.c
index edfc9916..b7647d2a 100644
--- a/window-choose.c
+++ b/window-choose.c
@@ -74,8 +74,6 @@ struct window_choose_mode_item {
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;
@@ -91,11 +89,16 @@ struct window_choose_mode_data {
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_choose_mode_data *,
- u_int);
-static int window_choose_index_key(struct window_choose_mode_data *,
- key_code);
+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,7 +171,6 @@ window_choose_init(struct window_pane *wp)
{
struct window_choose_mode_data *data;
struct screen *s;
- int keys;
wp->modedata = data = xcalloc(1, sizeof *data);
@@ -189,12 +191,6 @@ 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;
- 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);
}
@@ -206,7 +202,7 @@ window_choose_data_create(int type, struct client *c, struct session *s)
wcd = xmalloc(sizeof *wcd);
wcd->type = type;
- wcd->ft = format_create(NULL, 0);
+ wcd->ft = format_create(NULL, FORMAT_NONE, 0);
wcd->ft_template = NULL;
wcd->command = NULL;
@@ -547,9 +543,74 @@ window_choose_get_item(struct window_pane *wp, key_code key,
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 *sess, key_code key, struct mouse_event *m)
+ __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,17 +618,26 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
struct window_choose_mode_item *item;
size_t input_len;
u_int items, n;
- int idx;
+ 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 (mode_key_lookup(&data->mdata, key)) {
- case MODEKEYCHOICE_CANCEL:
+ switch (key) {
+ case '\003': /* C-c */
+ case '\033': /* Escape */
+ case 'q':
data->input_type = WINDOW_CHOOSE_NORMAL;
window_choose_redraw_screen(wp);
break;
- case MODEKEYCHOICE_CHOOSE:
+ case '\n':
+ case '\r':
n = strtonum(data->input_str, 0, INT_MAX, NULL);
if (n > items - 1) {
data->input_type = WINDOW_CHOOSE_NORMAL;
@@ -576,7 +646,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
}
window_choose_fire_callback(wp, data->list[n].wcd);
break;
- case MODEKEYCHOICE_BACKSPACE:
+ case KEYC_BSPACE:
input_len = strlen(data->input_str);
if (input_len > 0)
data->input_str[input_len - 1] = '\0';
@@ -592,16 +662,21 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
return;
}
- switch (mode_key_lookup(&data->mdata, key)) {
- case MODEKEYCHOICE_CANCEL:
+ switch (key) {
+ case '\003': /* C-c */
+ case '\033': /* Escape */
+ case 'q':
window_choose_fire_callback(wp, NULL);
break;
- case MODEKEYCHOICE_CHOOSE:
+ 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 MODEKEYCHOICE_TREE_TOGGLE:
+ case ' ':
+ case KEYC_MOUSEDOWN3_PANE:
if ((item = window_choose_get_item(wp, key, m)) == NULL)
break;
if (item->state & TREE_EXPANDED) {
@@ -613,7 +688,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
}
window_choose_redraw_screen(wp);
break;
- case MODEKEYCHOICE_TREE_COLLAPSE:
+ case KEYC_LEFT:
if ((item = window_choose_get_item(wp, key, m)) == NULL)
break;
if (item->state & TREE_EXPANDED) {
@@ -622,10 +697,10 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
window_choose_redraw_screen(wp);
}
break;
- case MODEKEYCHOICE_TREE_COLLAPSE_ALL:
+ case KEYC_LEFT|KEYC_CTRL:
window_choose_collapse_all(wp);
break;
- case MODEKEYCHOICE_TREE_EXPAND:
+ case KEYC_RIGHT:
if ((item = window_choose_get_item(wp, key, m)) == NULL)
break;
if (!(item->state & TREE_EXPANDED)) {
@@ -634,10 +709,12 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
window_choose_redraw_screen(wp);
}
break;
- case MODEKEYCHOICE_TREE_EXPAND_ALL:
+ case KEYC_RIGHT|KEYC_CTRL:
window_choose_expand_all(wp);
break;
- case MODEKEYCHOICE_UP:
+ case '\020': /* C-p */
+ case KEYC_UP:
+ case KEYC_WHEELUP_PANE:
if (items == 0)
break;
if (data->selected == 0) {
@@ -659,7 +736,9 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
screen_write_stop(&ctx);
}
break;
- case MODEKEYCHOICE_DOWN:
+ case '\016': /* C-n */
+ case KEYC_DOWN:
+ case KEYC_WHEELDOWN_PANE:
if (items == 0)
break;
if (data->selected == items - 1) {
@@ -680,7 +759,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
} else
window_choose_scroll_down(wp);
break;
- case MODEKEYCHOICE_SCROLLUP:
+ case KEYC_UP|KEYC_CTRL:
if (items == 0 || data->top == 0)
break;
if (data->selected == data->top + screen_size_y(s) - 1) {
@@ -693,7 +772,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
} else
window_choose_scroll_up(wp);
break;
- case MODEKEYCHOICE_SCROLLDOWN:
+ case KEYC_DOWN|KEYC_CTRL:
if (items == 0 ||
data->top + screen_size_y(&data->screen) >= items)
break;
@@ -706,7 +785,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
} else
window_choose_scroll_down(wp);
break;
- case MODEKEYCHOICE_PAGEUP:
+ case KEYC_PPAGE:
if (data->selected < screen_size_y(s)) {
data->selected = 0;
data->top = 0;
@@ -719,7 +798,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
}
window_choose_redraw_screen(wp);
break;
- case MODEKEYCHOICE_PAGEDOWN:
+ case KEYC_NPAGE:
data->selected += screen_size_y(s);
if (data->selected > items - 1)
data->selected = items - 1;
@@ -733,35 +812,46 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
data->top = data->selected;
window_choose_redraw_screen(wp);
break;
- case MODEKEYCHOICE_BACKSPACE:
+ 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 MODEKEYCHOICE_STARTNUMBERPREFIX:
+ 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 MODEKEYCHOICE_STARTOFLIST:
+ case KEYC_HOME:
+ case '<'|KEYC_ESCAPE:
data->selected = 0;
data->top = 0;
window_choose_redraw_screen(wp);
break;
- case MODEKEYCHOICE_TOPLINE:
+ case 'R'|KEYC_ESCAPE:
data->selected = data->top;
window_choose_redraw_screen(wp);
break;
- case MODEKEYCHOICE_BOTTOMLINE:
+ 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 MODEKEYCHOICE_ENDOFLIST:
+ case KEYC_END:
+ case '>'|KEYC_ESCAPE:
data->selected = items - 1;
if (screen_size_y(s) < items)
data->top = items - screen_size_y(s);
@@ -770,7 +860,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
window_choose_redraw_screen(wp);
break;
default:
- idx = window_choose_index_key(data, key);
+ idx = window_choose_index_key(wp, key);
if (idx < 0 || (u_int) idx >= data->list_size)
break;
data->selected = idx;
@@ -808,7 +898,7 @@ window_choose_write_line(struct window_pane *wp, struct screen_write_ctx *ctx,
item->wcd->wl->flags & WINLINK_ALERTFLAGS)
gc.attr |= GRID_ATTR_BRIGHT;
- key = window_choose_key_index(data, data->top + py);
+ key = window_choose_key_index(wp, data->top + py);
if (key != -1)
xsnprintf(label, sizeof label, "(%c)", key);
else
@@ -839,18 +929,17 @@ window_choose_write_line(struct window_pane *wp, struct screen_write_ctx *ctx,
}
static int
-window_choose_key_index(struct window_choose_mode_data *data, u_int idx)
+window_choose_key_index(struct window_pane *wp, 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;
+ 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,19 +947,18 @@ window_choose_key_index(struct window_choose_mode_data *data, u_int idx)
}
static int
-window_choose_index_key(struct window_choose_mode_data *data, key_code key)
+window_choose_index_key(struct window_pane *wp, 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;
+ 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++;