version 1.4, 2017/06/09 15:29:15 |
version 1.5, 2017/06/09 16:01:39 |
|
|
struct client *client; |
struct client *client; |
const char *entered; |
const char *entered; |
|
|
char *filter; |
|
|
|
struct cmd_find_state fs; |
struct cmd_find_state fs; |
enum window_tree_type type; |
enum window_tree_type type; |
}; |
}; |
|
|
|
|
static int |
static int |
window_tree_build_window(struct session *s, struct winlink *wl, void* modedata, |
window_tree_build_window(struct session *s, struct winlink *wl, void* modedata, |
u_int sort_type, struct mode_tree_item *parent, int no_filter) |
u_int sort_type, struct mode_tree_item *parent, const char *filter) |
{ |
{ |
struct window_tree_modedata *data = modedata; |
struct window_tree_modedata *data = modedata; |
struct window_tree_itemdata *item; |
struct window_tree_itemdata *item; |
|
|
l = NULL; |
l = NULL; |
n = 0; |
n = 0; |
TAILQ_FOREACH(wp, &wl->window->panes, entry) { |
TAILQ_FOREACH(wp, &wl->window->panes, entry) { |
if (!no_filter && data->filter != NULL) { |
if (filter != NULL) { |
cp = format_single(NULL, data->filter, NULL, s, wl, wp); |
cp = format_single(NULL, filter, NULL, s, wl, wp); |
if (!format_true(cp)) { |
if (!format_true(cp)) { |
free(cp); |
free(cp); |
continue; |
continue; |
|
|
|
|
static void |
static void |
window_tree_build_session(struct session *s, void* modedata, |
window_tree_build_session(struct session *s, void* modedata, |
u_int sort_type, int no_filter) |
u_int sort_type, const char *filter) |
{ |
{ |
struct window_tree_modedata *data = modedata; |
struct window_tree_modedata *data = modedata; |
struct window_tree_itemdata *item; |
struct window_tree_itemdata *item; |
|
|
empty = 0; |
empty = 0; |
for (i = 0; i < n; i++) { |
for (i = 0; i < n; i++) { |
if (!window_tree_build_window(s, l[i], modedata, sort_type, mti, |
if (!window_tree_build_window(s, l[i], modedata, sort_type, mti, |
no_filter)) |
filter)) |
empty++; |
empty++; |
} |
} |
if (empty == n) { |
if (empty == n) { |
|
|
} |
} |
|
|
static void |
static void |
window_tree_build(void *modedata, u_int sort_type, uint64_t *tag) |
window_tree_build(void *modedata, u_int sort_type, uint64_t *tag, |
|
const char *filter) |
{ |
{ |
struct window_tree_modedata *data = modedata; |
struct window_tree_modedata *data = modedata; |
struct session *s, **l; |
struct session *s, **l; |
u_int n, i; |
u_int n, i; |
int no_filter = 0; |
|
|
|
restart: |
|
for (i = 0; i < data->item_size; i++) |
for (i = 0; i < data->item_size; i++) |
window_tree_free_item(data->item_list[i]); |
window_tree_free_item(data->item_list[i]); |
free(data->item_list); |
free(data->item_list); |
|
|
} |
} |
|
|
for (i = 0; i < n; i++) |
for (i = 0; i < n; i++) |
window_tree_build_session(l[i], modedata, sort_type, no_filter); |
window_tree_build_session(l[i], modedata, sort_type, filter); |
free(l); |
free(l); |
|
|
if (!no_filter && data->item_size == 0) { |
|
no_filter = 1; |
|
goto restart; |
|
} |
|
|
|
switch (data->type) { |
switch (data->type) { |
case WINDOW_TREE_NONE: |
case WINDOW_TREE_NONE: |
break; |
break; |
|
|
data->wp = wp; |
data->wp = wp; |
data->references = 1; |
data->references = 1; |
|
|
if (args_has(args, 'f')) |
|
data->filter = xstrdup(args_get(args, 'f')); |
|
else |
|
data->filter = NULL; |
|
|
|
if (args == NULL || args->argc == 0) |
if (args == NULL || args->argc == 0) |
data->command = xstrdup(WINDOW_TREE_DEFAULT_COMMAND); |
data->command = xstrdup(WINDOW_TREE_DEFAULT_COMMAND); |
else |
else |
|
|
window_tree_free_item(data->item_list[i]); |
window_tree_free_item(data->item_list[i]); |
free(data->item_list); |
free(data->item_list); |
|
|
free(data->filter); |
|
|
|
free(data->command); |
free(data->command); |
free(data); |
free(data); |
} |
} |
|
|
window_tree_destroy(data); |
window_tree_destroy(data); |
} |
} |
|
|
static int |
|
window_tree_filter_callback(__unused struct client *c, void *modedata, |
|
const char *s, __unused int done) |
|
{ |
|
struct window_tree_modedata *data = modedata; |
|
|
|
if (data->dead) |
|
return (0); |
|
|
|
if (data->filter != NULL) |
|
free(data->filter); |
|
if (s == NULL || *s == '\0') |
|
data->filter = NULL; |
|
else |
|
data->filter = xstrdup(s); |
|
|
|
mode_tree_build(data->data); |
|
mode_tree_draw(data->data); |
|
data->wp->flags |= PANE_REDRAW; |
|
|
|
return (0); |
|
} |
|
|
|
static void |
static void |
window_tree_filter_free(void *modedata) |
|
{ |
|
struct window_tree_modedata *data = modedata; |
|
|
|
window_tree_destroy(data); |
|
} |
|
|
|
static void |
|
window_tree_key(struct window_pane *wp, struct client *c, |
window_tree_key(struct window_pane *wp, struct client *c, |
__unused struct session *s, key_code key, struct mouse_event *m) |
__unused struct session *s, key_code key, struct mouse_event *m) |
{ |
{ |
|
|
int finished; |
int finished; |
u_int tagged; |
u_int tagged; |
|
|
/* |
|
* t = toggle tag |
|
* T = tag none |
|
* C-t = tag all |
|
* q = exit |
|
* O = change sort order |
|
* |
|
* Enter = select item |
|
* : = enter command |
|
* f = enter filter |
|
*/ |
|
|
|
finished = mode_tree_key(data->data, c, &key, m); |
finished = mode_tree_key(data->data, c, &key, m); |
switch (key) { |
switch (key) { |
case 'f': |
|
data->references++; |
|
status_prompt_set(c, "(filter) ", data->filter, |
|
window_tree_filter_callback, window_tree_filter_free, data, |
|
PROMPT_NOFORMAT); |
|
break; |
|
case ':': |
case ':': |
tagged = mode_tree_count_tagged(data->data); |
tagged = mode_tree_count_tagged(data->data); |
if (tagged != 0) |
if (tagged != 0) |