void trace_view_adv_filter_callback(gboolean accept, const gchar *text, gint *event_ids, gpointer data) { struct event_filter *event_filter; GtkTreeView *trace_tree = data; GtkTreeModel *model; TraceViewStore *store; char error_str[200]; int ret; int i; if (!accept) return; model = gtk_tree_view_get_model(trace_tree); if (!model) return; if (!has_text(text) && !event_ids) return; store = TRACE_VIEW_STORE(model); event_filter = trace_view_store_get_event_filter(store); if (event_ids) { for (i = 0; event_ids[i] >= 0; i++) pevent_filter_remove_event(event_filter, event_ids[i]); } if (has_text(text)) { trace_view_store_clear_all_events_enabled(store); ret = pevent_filter_add_filter_str(event_filter, text); if (ret < 0) { pevent_strerror(event_filter->pevent, ret, error_str, sizeof(error_str)); warning("filter failed due to: %s", error_str); return; } } update_rows(trace_tree, store); }
/** * pevent_filter_clear_trivial - clear TRUE and FALSE filters * @filter: the filter to remove trivial filters from * @type: remove only true, false, or both * * Removes filters that only contain a TRUE or FALES boolean arg. */ void pevent_filter_clear_trivial(struct event_filter *filter, enum filter_trivial_type type) { struct filter_type *filter_type; int count = 0; int *ids = NULL; int i; if (!filter->filters) return; /* * Two steps, first get all ids with trivial filters. * then remove those ids. */ for (i = 0; i < filter->filters; i++) { filter_type = &filter->event_filters[i]; if (filter_type->filter->type != FILTER_ARG_BOOLEAN) continue; switch (type) { case FILTER_TRIVIAL_FALSE: if (filter_type->filter->boolean.value) continue; case FILTER_TRIVIAL_TRUE: if (!filter_type->filter->boolean.value) continue; default: break; } ids = realloc(ids, sizeof(*ids) * (count + 1)); if (!ids) die("Can't allocate ids"); ids[count++] = filter_type->event_id; } if (!count) return; for (i = 0; i < count; i++) pevent_filter_remove_event(filter, ids[i]); free(ids); }