version 1.5, 2017/06/09 15:29:15 |
version 1.6, 2017/06/09 16:01:39 |
|
|
u_int sort_size; |
u_int sort_size; |
u_int sort_type; |
u_int sort_type; |
|
|
void (*buildcb)(void *, u_int, uint64_t *); |
void (*buildcb)(void *, u_int, uint64_t *, |
|
const char *); |
struct screen *(*drawcb)(void *, void *, u_int, u_int); |
struct screen *(*drawcb)(void *, void *, u_int, u_int); |
int (*searchcb)(void*, void *, const char *); |
int (*searchcb)(void*, void *, const char *); |
|
|
|
|
|
|
struct screen screen; |
struct screen screen; |
|
|
char *ss; |
char *search; |
|
char *filter; |
}; |
}; |
|
|
struct mode_tree_item { |
struct mode_tree_item { |
|
|
|
|
struct mode_tree_data * |
struct mode_tree_data * |
mode_tree_start(struct window_pane *wp, struct args *args, |
mode_tree_start(struct window_pane *wp, struct args *args, |
void (*buildcb)(void *, u_int, uint64_t *), |
void (*buildcb)(void *, u_int, uint64_t *, const char *), |
struct screen *(*drawcb)(void *, void *, u_int, u_int), |
struct screen *(*drawcb)(void *, void *, u_int, u_int), |
int (*searchcb)(void *, void *, const char *), void *modedata, |
int (*searchcb)(void *, void *, const char *), void *modedata, |
const char **sort_list, u_int sort_size, struct screen **s) |
const char **sort_list, u_int sort_size, struct screen **s) |
|
|
} |
} |
} |
} |
|
|
|
if (args_has(args, 'f')) |
|
mtd->filter = xstrdup(args_get(args, 'f')); |
|
else |
|
mtd->filter = NULL; |
|
|
mtd->buildcb = buildcb; |
mtd->buildcb = buildcb; |
mtd->drawcb = drawcb; |
mtd->drawcb = drawcb; |
mtd->searchcb = searchcb; |
mtd->searchcb = searchcb; |
|
|
TAILQ_CONCAT(&mtd->saved, &mtd->children, entry); |
TAILQ_CONCAT(&mtd->saved, &mtd->children, entry); |
TAILQ_INIT(&mtd->children); |
TAILQ_INIT(&mtd->children); |
|
|
mtd->buildcb(mtd->modedata, mtd->sort_type, &tag); |
mtd->buildcb(mtd->modedata, mtd->sort_type, &tag, mtd->filter); |
|
if (TAILQ_EMPTY(&mtd->children)) |
|
mtd->buildcb(mtd->modedata, mtd->sort_type, &tag, NULL); |
|
|
mode_tree_free_items(&mtd->saved); |
mode_tree_free_items(&mtd->saved); |
TAILQ_INIT(&mtd->saved); |
TAILQ_INIT(&mtd->saved); |
|
|
mode_tree_clear_lines(mtd); |
mode_tree_clear_lines(mtd); |
screen_free(&mtd->screen); |
screen_free(&mtd->screen); |
|
|
|
free(mtd->search); |
|
free(mtd->filter); |
|
|
mtd->dead = 1; |
mtd->dead = 1; |
mode_tree_remove_ref(mtd); |
mode_tree_remove_ref(mtd); |
} |
} |
|
|
{ |
{ |
struct mode_tree_item *mti, *last, *next; |
struct mode_tree_item *mti, *last, *next; |
|
|
if (mtd->ss == NULL) |
if (mtd->search == NULL) |
return (NULL); |
return (NULL); |
|
|
mti = last = mtd->line_list[mtd->current].item; |
mti = last = mtd->line_list[mtd->current].item; |
|
|
break; |
break; |
|
|
if (mtd->searchcb == NULL) { |
if (mtd->searchcb == NULL) { |
if (strstr(mti->name, mtd->ss) != NULL) |
if (strstr(mti->name, mtd->search) != NULL) |
return (mti); |
return (mti); |
continue; |
continue; |
} |
} |
if (mtd->searchcb(mtd->modedata, mti->itemdata, mtd->ss)) |
if (mtd->searchcb(mtd->modedata, mti->itemdata, mtd->search)) |
return (mti); |
return (mti); |
} |
} |
return (NULL); |
return (NULL); |
|
|
loop->expanded = 1; |
loop->expanded = 1; |
loop = loop->parent; |
loop = loop->parent; |
} |
} |
mode_tree_build(mtd); |
|
|
|
|
mode_tree_build(mtd); |
mode_tree_set_current(mtd, tag); |
mode_tree_set_current(mtd, tag); |
mode_tree_draw(mtd); |
mode_tree_draw(mtd); |
|
mtd->wp->flags |= PANE_REDRAW; |
} |
} |
|
|
static int |
static int |
|
|
if (mtd->dead) |
if (mtd->dead) |
return (0); |
return (0); |
|
|
free(mtd->ss); |
free(mtd->search); |
if (*s == '\0') { |
if (s == NULL || *s == '\0') { |
mtd->ss = NULL; |
mtd->search = NULL; |
return (0); |
return (0); |
} |
} |
mtd->ss = xstrdup(s); |
mtd->search = xstrdup(s); |
mode_tree_search_set(mtd); |
mode_tree_search_set(mtd); |
|
|
return (0); |
return (0); |
|
|
mode_tree_remove_ref(data); |
mode_tree_remove_ref(data); |
} |
} |
|
|
|
static int |
|
mode_tree_filter_callback(__unused struct client *c, void *data, const char *s, |
|
__unused int done) |
|
{ |
|
struct mode_tree_data *mtd = data; |
|
|
|
if (mtd->dead) |
|
return (0); |
|
|
|
if (mtd->filter != NULL) |
|
free(mtd->filter); |
|
if (s == NULL || *s == '\0') |
|
mtd->filter = NULL; |
|
else |
|
mtd->filter = xstrdup(s); |
|
|
|
mode_tree_build(mtd); |
|
mode_tree_draw(mtd); |
|
mtd->wp->flags |= PANE_REDRAW; |
|
|
|
return (0); |
|
} |
|
|
|
static void |
|
mode_tree_filter_free(void *data) |
|
{ |
|
mode_tree_remove_ref(data); |
|
} |
|
|
int |
int |
mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key, |
mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key, |
struct mouse_event *m) |
struct mouse_event *m) |
|
|
break; |
break; |
case 'n': |
case 'n': |
mode_tree_search_set(mtd); |
mode_tree_search_set(mtd); |
|
break; |
|
case 'f': |
|
mtd->references++; |
|
status_prompt_set(c, "(filter) ", mtd->filter, |
|
mode_tree_filter_callback, mode_tree_filter_free, mtd, |
|
PROMPT_NOFORMAT); |
break; |
break; |
} |
} |
return (0); |
return (0); |