mirror of
https://github.com/tmux/tmux.git
synced 2025-09-06 00:37:06 +00:00
Bad merge.
This commit is contained in:
212
window-choose.c
212
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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
const char *ptr;
|
||||
int keys;
|
||||
|
||||
for (ptr = keys; *ptr != '\0'; ptr++) {
|
||||
mkey = mode_key_lookup(&data->mdata, *ptr);
|
||||
if (mkey != MODEKEY_NONE && mkey != MODEKEY_OTHER)
|
||||
continue;
|
||||
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;
|
||||
const char *ptr;
|
||||
int keys;
|
||||
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;
|
||||
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++;
|
||||
|
Reference in New Issue
Block a user