mirror of
https://github.com/tmux/tmux.git
synced 2025-09-04 06:56:58 +00:00
Extend filters (f key) to buffer and client mode and add -f flag to
specify to command.
This commit is contained in:
@ -81,8 +81,6 @@ struct window_tree_modedata {
|
||||
struct client *client;
|
||||
const char *entered;
|
||||
|
||||
char *filter;
|
||||
|
||||
struct cmd_find_state fs;
|
||||
enum window_tree_type type;
|
||||
};
|
||||
@ -227,7 +225,7 @@ window_tree_build_pane(struct session *s, struct winlink *wl,
|
||||
|
||||
static int
|
||||
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_itemdata *item;
|
||||
@ -261,8 +259,8 @@ window_tree_build_window(struct session *s, struct winlink *wl, void* modedata,
|
||||
l = NULL;
|
||||
n = 0;
|
||||
TAILQ_FOREACH(wp, &wl->window->panes, entry) {
|
||||
if (!no_filter && data->filter != NULL) {
|
||||
cp = format_single(NULL, data->filter, NULL, s, wl, wp);
|
||||
if (filter != NULL) {
|
||||
cp = format_single(NULL, filter, NULL, s, wl, wp);
|
||||
if (!format_true(cp)) {
|
||||
free(cp);
|
||||
continue;
|
||||
@ -298,7 +296,7 @@ window_tree_build_window(struct session *s, struct winlink *wl, void* modedata,
|
||||
|
||||
static void
|
||||
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_itemdata *item;
|
||||
@ -349,7 +347,7 @@ window_tree_build_session(struct session *s, void* modedata,
|
||||
empty = 0;
|
||||
for (i = 0; i < n; i++) {
|
||||
if (!window_tree_build_window(s, l[i], modedata, sort_type, mti,
|
||||
no_filter))
|
||||
filter))
|
||||
empty++;
|
||||
}
|
||||
if (empty == n) {
|
||||
@ -361,14 +359,13 @@ window_tree_build_session(struct session *s, void* modedata,
|
||||
}
|
||||
|
||||
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 session *s, **l;
|
||||
u_int n, i;
|
||||
int no_filter = 0;
|
||||
|
||||
restart:
|
||||
for (i = 0; i < data->item_size; i++)
|
||||
window_tree_free_item(data->item_list[i]);
|
||||
free(data->item_list);
|
||||
@ -393,14 +390,9 @@ restart:
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
if (!no_filter && data->item_size == 0) {
|
||||
no_filter = 1;
|
||||
goto restart;
|
||||
}
|
||||
|
||||
switch (data->type) {
|
||||
case WINDOW_TREE_NONE:
|
||||
break;
|
||||
@ -493,11 +485,6 @@ window_tree_init(struct window_pane *wp, struct cmd_find_state *fs,
|
||||
data->wp = wp;
|
||||
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)
|
||||
data->command = xstrdup(WINDOW_TREE_DEFAULT_COMMAND);
|
||||
else
|
||||
@ -529,8 +516,6 @@ window_tree_destroy(struct window_tree_modedata *data)
|
||||
window_tree_free_item(data->item_list[i]);
|
||||
free(data->item_list);
|
||||
|
||||
free(data->filter);
|
||||
|
||||
free(data->command);
|
||||
free(data);
|
||||
}
|
||||
@ -653,37 +638,6 @@ window_tree_command_free(void *modedata)
|
||||
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
|
||||
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,
|
||||
__unused struct session *s, key_code key, struct mouse_event *m)
|
||||
@ -695,26 +649,8 @@ window_tree_key(struct window_pane *wp, struct client *c,
|
||||
int finished;
|
||||
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);
|
||||
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 ':':
|
||||
tagged = mode_tree_count_tagged(data->data);
|
||||
if (tagged != 0)
|
||||
|
Reference in New Issue
Block a user