aboutsummaryrefslogtreecommitdiff
path: root/window-choose.c
diff options
context:
space:
mode:
authornicm <nicm>2017-02-03 11:57:27 +0000
committernicm <nicm>2017-02-03 11:57:27 +0000
commit7d23d019c0df197d724ced7fec21dc2047634c9b (patch)
tree7f07df20858bf10aef7db907bf4998b53fedd7db /window-choose.c
parentdd0c8147795c518de443c33895c614e52b42677f (diff)
downloadrtmux-7d23d019c0df197d724ced7fec21dc2047634c9b.tar.gz
rtmux-7d23d019c0df197d724ced7fec21dc2047634c9b.tar.bz2
rtmux-7d23d019c0df197d724ced7fec21dc2047634c9b.zip
Add a window or pane id "tag" to each format tree and use it to separate
jobs, this means that if the same job is used for different windows or panes (for example in pane-border-format), it will be run separately for each pane.
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++;