diff options
-rw-r--r-- | trace-graph-main.c | 26 | ||||
-rw-r--r-- | trace-graph.c | 44 | ||||
-rw-r--r-- | trace-graph.h | 5 |
3 files changed, 75 insertions, 0 deletions
diff --git a/trace-graph-main.c b/trace-graph-main.c index e6fca6b..987a80d 100644 --- a/trace-graph-main.c +++ b/trace-graph-main.c | |||
@@ -110,6 +110,16 @@ events_clicked (gpointer data) | |||
110 | trace_graph_event_filter_callback, ginfo); | 110 | trace_graph_event_filter_callback, ginfo); |
111 | } | 111 | } |
112 | 112 | ||
113 | /* Callback for the clicked signal of the Advanced filter button */ | ||
114 | static void | ||
115 | adv_filter_clicked (gpointer data) | ||
116 | { | ||
117 | struct graph_info *ginfo = data; | ||
118 | |||
119 | trace_adv_filter_dialog(ginfo->handle, ginfo->event_filter, | ||
120 | trace_graph_adv_filter_callback, ginfo); | ||
121 | } | ||
122 | |||
113 | void trace_graph(int argc, char **argv) | 123 | void trace_graph(int argc, char **argv) |
114 | { | 124 | { |
115 | struct tracecmd_input *handle = NULL; | 125 | struct tracecmd_input *handle = NULL; |
@@ -246,6 +256,22 @@ void trace_graph(int argc, char **argv) | |||
246 | gtk_widget_show(sub_item); | 256 | gtk_widget_show(sub_item); |
247 | 257 | ||
248 | 258 | ||
259 | /* --- Filter - Advanced Events Option --- */ | ||
260 | |||
261 | sub_item = gtk_menu_item_new_with_label("advanced event filter"); | ||
262 | |||
263 | /* Add them to the menu */ | ||
264 | gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item); | ||
265 | |||
266 | /* We can attach the Quit menu item to our exit function */ | ||
267 | g_signal_connect_swapped (G_OBJECT (sub_item), "activate", | ||
268 | G_CALLBACK (adv_filter_clicked), | ||
269 | (gpointer) ginfo); | ||
270 | |||
271 | /* We do need to show menu items */ | ||
272 | gtk_widget_show(sub_item); | ||
273 | |||
274 | |||
249 | /* --- End Filter Options --- */ | 275 | /* --- End Filter Options --- */ |
250 | gtk_menu_item_set_submenu(GTK_MENU_ITEM (menu_item), menu); | 276 | gtk_menu_item_set_submenu(GTK_MENU_ITEM (menu_item), menu); |
251 | 277 | ||
diff --git a/trace-graph.c b/trace-graph.c index 8283824..e83bf27 100644 --- a/trace-graph.c +++ b/trace-graph.c | |||
@@ -32,6 +32,8 @@ | |||
32 | #include "trace-hash.h" | 32 | #include "trace-hash.h" |
33 | #include "trace-filter.h" | 33 | #include "trace-filter.h" |
34 | 34 | ||
35 | #include "util.h" | ||
36 | |||
35 | #define DEBUG_LEVEL 0 | 37 | #define DEBUG_LEVEL 0 |
36 | #if DEBUG_LEVEL > 0 | 38 | #if DEBUG_LEVEL > 0 |
37 | # define dprintf(l, x...) \ | 39 | # define dprintf(l, x...) \ |
@@ -1752,6 +1754,48 @@ void trace_graph_event_filter_callback(gboolean accept, | |||
1752 | redraw_graph(ginfo); | 1754 | redraw_graph(ginfo); |
1753 | } | 1755 | } |
1754 | 1756 | ||
1757 | void trace_graph_adv_filter_callback(gboolean accept, | ||
1758 | const gchar *text, | ||
1759 | gint *event_ids, | ||
1760 | gpointer data) | ||
1761 | { | ||
1762 | struct graph_info *ginfo = data; | ||
1763 | struct event_filter *event_filter; | ||
1764 | char *error_str; | ||
1765 | int ret; | ||
1766 | int i; | ||
1767 | |||
1768 | if (!accept) | ||
1769 | return; | ||
1770 | |||
1771 | if (!has_text(text) && !event_ids) | ||
1772 | return; | ||
1773 | |||
1774 | event_filter = ginfo->event_filter; | ||
1775 | |||
1776 | if (event_ids) { | ||
1777 | for (i = 0; event_ids[i] >= 0; i++) | ||
1778 | pevent_filter_remove_event(event_filter, event_ids[i]); | ||
1779 | } | ||
1780 | |||
1781 | if (has_text(text)) { | ||
1782 | |||
1783 | ginfo->all_events = FALSE; | ||
1784 | |||
1785 | pevent_filter_clear_trivial(event_filter, | ||
1786 | FILTER_TRIVIAL_BOTH); | ||
1787 | |||
1788 | ret = pevent_filter_add_filter_str(event_filter, text, &error_str); | ||
1789 | if (ret < 0) { | ||
1790 | warning("filter failed due to: %s", error_str); | ||
1791 | free(error_str); | ||
1792 | return; | ||
1793 | } | ||
1794 | } | ||
1795 | |||
1796 | redraw_graph(ginfo); | ||
1797 | } | ||
1798 | |||
1755 | static void redraw_pixmap_backend(struct graph_info *ginfo) | 1799 | static void redraw_pixmap_backend(struct graph_info *ginfo) |
1756 | { | 1800 | { |
1757 | GdkPixmap *old_pix; | 1801 | GdkPixmap *old_pix; |
diff --git a/trace-graph.h b/trace-graph.h index 411e750..3130e98 100644 --- a/trace-graph.h +++ b/trace-graph.h | |||
@@ -231,6 +231,11 @@ void trace_graph_event_filter_callback(gboolean accept, | |||
231 | gint *events, | 231 | gint *events, |
232 | gpointer data); | 232 | gpointer data); |
233 | 233 | ||
234 | void trace_graph_adv_filter_callback(gboolean accept, | ||
235 | const gchar *text, | ||
236 | gint *event_ids, | ||
237 | gpointer data); | ||
238 | |||
234 | static inline GtkWidget *trace_graph_get_draw(struct graph_info *ginfo) | 239 | static inline GtkWidget *trace_graph_get_draw(struct graph_info *ginfo) |
235 | { | 240 | { |
236 | return ginfo->draw; | 241 | return ginfo->draw; |