version 1.60, 2015/03/31 17:45:10 |
version 1.61, 2015/04/19 21:34:21 |
|
|
struct screen *window_choose_init(struct window_pane *); |
struct screen *window_choose_init(struct window_pane *); |
void window_choose_free(struct window_pane *); |
void window_choose_free(struct window_pane *); |
void window_choose_resize(struct window_pane *, u_int, u_int); |
void window_choose_resize(struct window_pane *, u_int, u_int); |
void window_choose_key(struct window_pane *, struct session *, int); |
void window_choose_key(struct window_pane *, struct client *, |
void window_choose_mouse( |
struct session *, int, struct mouse_event *); |
struct window_pane *, struct session *, struct mouse_event *); |
|
|
|
void window_choose_default_callback(struct window_choose_data *); |
void window_choose_default_callback(struct window_choose_data *); |
|
struct window_choose_mode_item *window_choose_get_item(struct window_pane *, |
|
int, struct mouse_event *); |
|
|
void window_choose_fire_callback( |
void window_choose_fire_callback( |
struct window_pane *, struct window_choose_data *); |
struct window_pane *, struct window_choose_data *); |
|
|
void window_choose_scroll_up(struct window_pane *); |
void window_choose_scroll_up(struct window_pane *); |
void window_choose_scroll_down(struct window_pane *); |
void window_choose_scroll_down(struct window_pane *); |
|
|
void window_choose_collapse(struct window_pane *, struct session *); |
void window_choose_collapse(struct window_pane *, struct session *, u_int); |
void window_choose_expand(struct window_pane *, struct session *, u_int); |
void window_choose_expand(struct window_pane *, struct session *, u_int); |
|
|
enum window_choose_input_type { |
enum window_choose_input_type { |
|
|
window_choose_free, |
window_choose_free, |
window_choose_resize, |
window_choose_resize, |
window_choose_key, |
window_choose_key, |
window_choose_mouse, |
|
NULL, |
NULL, |
}; |
}; |
|
|
|
|
s = &data->screen; |
s = &data->screen; |
screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0); |
screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0); |
s->mode &= ~MODE_CURSOR; |
s->mode &= ~MODE_CURSOR; |
if (options_get_number(&wp->window->options, "mode-mouse")) |
|
s->mode |= MODE_MOUSE_STANDARD; |
|
|
|
keys = options_get_number(&wp->window->options, "mode-keys"); |
keys = options_get_number(&wp->window->options, "mode-keys"); |
if (keys == MODEKEY_EMACS) |
if (keys == MODEKEY_EMACS) |
|
|
return; |
return; |
} |
} |
|
|
cmdq_run(cdata->start_client->cmdq, cmdlist); |
cmdq_run(cdata->start_client->cmdq, cmdlist, NULL); |
cmd_list_free(cmdlist); |
cmd_list_free(cmdlist); |
} |
} |
|
|
|
|
} |
} |
|
|
void |
void |
window_choose_collapse(struct window_pane *wp, struct session *s) |
window_choose_collapse(struct window_pane *wp, struct session *s, u_int pos) |
{ |
{ |
struct window_choose_mode_data *data = wp->modedata; |
struct window_choose_mode_data *data = wp->modedata; |
struct window_choose_mode_item *item, *chosen; |
struct window_choose_mode_item *item, *chosen; |
|
|
ARRAY_DECL(, struct window_choose_mode_item) list_copy; |
ARRAY_DECL(, struct window_choose_mode_item) list_copy; |
ARRAY_INIT(&list_copy); |
ARRAY_INIT(&list_copy); |
|
|
chosen = &ARRAY_ITEM(&data->list, data->selected); |
chosen = &ARRAY_ITEM(&data->list, pos); |
chosen->state &= ~TREE_EXPANDED; |
chosen->state &= ~TREE_EXPANDED; |
|
|
/* |
/* |
|
|
chosen = ARRAY_ITEM(&data->list, data->selected).wcd->start_session; |
chosen = ARRAY_ITEM(&data->list, data->selected).wcd->start_session; |
|
|
RB_FOREACH(s, sessions, &sessions) |
RB_FOREACH(s, sessions, &sessions) |
window_choose_collapse(wp, s); |
window_choose_collapse(wp, s, data->selected); |
|
|
/* Reset the selection back to the starting session. */ |
/* Reset the selection back to the starting session. */ |
for (i = 0; i < ARRAY_LENGTH(&data->list); i++) { |
for (i = 0; i < ARRAY_LENGTH(&data->list); i++) { |
|
|
} |
} |
} |
} |
|
|
|
struct window_choose_mode_item * |
|
window_choose_get_item(struct window_pane *wp, int key, struct mouse_event *m) |
|
{ |
|
struct window_choose_mode_data *data = wp->modedata; |
|
u_int x, y, idx; |
|
|
|
if (!KEYC_IS_MOUSE(key)) |
|
return (&ARRAY_ITEM(&data->list, data->selected)); |
|
|
|
if (cmd_mouse_at(wp, m, &x, &y, 0) != 0) |
|
return (NULL); |
|
|
|
idx = data->top + y; |
|
if (idx >= ARRAY_LENGTH(&data->list)) |
|
return (NULL); |
|
return (&ARRAY_ITEM(&data->list, idx)); |
|
} |
|
|
void |
void |
window_choose_key(struct window_pane *wp, unused struct session *sess, int key) |
window_choose_key(struct window_pane *wp, unused struct client *c, |
|
unused struct session *sess, int key, struct mouse_event *m) |
{ |
{ |
struct window_choose_mode_data *data = wp->modedata; |
struct window_choose_mode_data *data = wp->modedata; |
struct screen *s = &data->screen; |
struct screen *s = &data->screen; |
|
|
window_choose_fire_callback(wp, NULL); |
window_choose_fire_callback(wp, NULL); |
break; |
break; |
case MODEKEYCHOICE_CHOOSE: |
case MODEKEYCHOICE_CHOOSE: |
item = &ARRAY_ITEM(&data->list, data->selected); |
if ((item = window_choose_get_item(wp, key, m)) == NULL) |
|
break; |
window_choose_fire_callback(wp, item->wcd); |
window_choose_fire_callback(wp, item->wcd); |
break; |
break; |
case MODEKEYCHOICE_TREE_TOGGLE: |
case MODEKEYCHOICE_TREE_TOGGLE: |
item = &ARRAY_ITEM(&data->list, data->selected); |
if ((item = window_choose_get_item(wp, key, m)) == NULL) |
if (item->state & TREE_EXPANDED) |
break; |
window_choose_collapse(wp, item->wcd->tree_session); |
if (item->state & TREE_EXPANDED) { |
else { |
window_choose_collapse(wp, item->wcd->tree_session, |
|
item->wcd->idx); |
|
} else { |
window_choose_expand(wp, item->wcd->tree_session, |
window_choose_expand(wp, item->wcd->tree_session, |
data->selected); |
item->wcd->idx); |
} |
} |
window_choose_redraw_screen(wp); |
window_choose_redraw_screen(wp); |
break; |
break; |
case MODEKEYCHOICE_TREE_COLLAPSE: |
case MODEKEYCHOICE_TREE_COLLAPSE: |
item = &ARRAY_ITEM(&data->list, data->selected); |
if ((item = window_choose_get_item(wp, key, m)) == NULL) |
|
break; |
if (item->state & TREE_EXPANDED) { |
if (item->state & TREE_EXPANDED) { |
window_choose_collapse(wp, item->wcd->tree_session); |
window_choose_collapse(wp, item->wcd->tree_session, |
|
data->selected); |
window_choose_redraw_screen(wp); |
window_choose_redraw_screen(wp); |
} |
} |
break; |
break; |
|
|
window_choose_collapse_all(wp); |
window_choose_collapse_all(wp); |
break; |
break; |
case MODEKEYCHOICE_TREE_EXPAND: |
case MODEKEYCHOICE_TREE_EXPAND: |
item = &ARRAY_ITEM(&data->list, data->selected); |
if ((item = window_choose_get_item(wp, key, m)) == NULL) |
|
break; |
if (!(item->state & TREE_EXPANDED)) { |
if (!(item->state & TREE_EXPANDED)) { |
window_choose_expand(wp, item->wcd->tree_session, |
window_choose_expand(wp, item->wcd->tree_session, |
data->selected); |
data->selected); |
|
|
window_choose_fire_callback(wp, item->wcd); |
window_choose_fire_callback(wp, item->wcd); |
break; |
break; |
} |
} |
} |
|
|
|
void |
|
window_choose_mouse(struct window_pane *wp, struct session *sess, |
|
struct mouse_event *m) |
|
{ |
|
struct window_choose_mode_data *data = wp->modedata; |
|
struct screen *s = &data->screen; |
|
struct window_choose_mode_item *item; |
|
u_int idx, i, n; |
|
|
|
if (m->event == MOUSE_EVENT_WHEEL) { |
|
/* |
|
* Multiple line scrolling by default is annoying, so scale |
|
* m->scroll back down. |
|
*/ |
|
n = m->scroll; |
|
if (n >= MOUSE_WHEEL_SCALE) |
|
n /= MOUSE_WHEEL_SCALE; |
|
for (i = 0; i < n; i++) { |
|
if (m->wheel == MOUSE_WHEEL_UP) |
|
window_choose_key(wp, sess, KEYC_UP); |
|
else |
|
window_choose_key(wp, sess, KEYC_DOWN); |
|
} |
|
return; |
|
} |
|
|
|
if (~m->event & MOUSE_EVENT_CLICK) |
|
return; |
|
if (m->x >= screen_size_x(s)) |
|
return; |
|
if (m->y >= screen_size_y(s)) |
|
return; |
|
|
|
idx = data->top + m->y; |
|
if (idx >= ARRAY_LENGTH(&data->list)) |
|
return; |
|
data->selected = idx; |
|
|
|
item = &ARRAY_ITEM(&data->list, data->selected); |
|
window_choose_fire_callback(wp, item->wcd); |
|
} |
} |
|
|
void |
void |