diff options
-rw-r--r-- | trace-filter.c | 121 | ||||
-rw-r--r-- | trace-filter.h | 6 | ||||
-rw-r--r-- | trace-view-main.c | 14 | ||||
-rw-r--r-- | trace-view-store.c | 2 |
4 files changed, 108 insertions, 35 deletions
diff --git a/trace-filter.c b/trace-filter.c index 38ca58c..51e0add 100644 --- a/trace-filter.c +++ b/trace-filter.c | |||
@@ -273,6 +273,7 @@ create_adv_filter_view(struct tracecmd_input *handle, | |||
273 | 273 | ||
274 | gtk_tree_view_column_add_attribute(col, renderer, "text", ADV_COL_EVENT); | 274 | gtk_tree_view_column_add_attribute(col, renderer, "text", ADV_COL_EVENT); |
275 | 275 | ||
276 | |||
276 | /* --- filter column --- */ | 277 | /* --- filter column --- */ |
277 | 278 | ||
278 | col = gtk_tree_view_column_new(); | 279 | col = gtk_tree_view_column_new(); |
@@ -384,6 +385,7 @@ void trace_adv_filter_dialog(struct tracecmd_input *handle, | |||
384 | enum { | 385 | enum { |
385 | COL_EVENT, | 386 | COL_EVENT, |
386 | COL_ACTIVE, | 387 | COL_ACTIVE, |
388 | COL_NORMAL, | ||
387 | COL_ACTIVE_START, | 389 | COL_ACTIVE_START, |
388 | COL_EVENT_ID, | 390 | COL_EVENT_ID, |
389 | NUM_EVENT_COLS, | 391 | NUM_EVENT_COLS, |
@@ -421,8 +423,9 @@ gboolean event_is_enabled(gint *events, gint events_size, gint event) | |||
421 | 423 | ||
422 | static GtkTreeModel * | 424 | static GtkTreeModel * |
423 | create_tree_event_model(struct tracecmd_input *handle, | 425 | create_tree_event_model(struct tracecmd_input *handle, |
424 | gboolean all_events, gchar **systems_set, | 426 | struct event_filter *filter, |
425 | gint *event_ids_set) | 427 | gboolean all_events, gchar **systems_set, |
428 | gint *event_ids_set) | ||
426 | { | 429 | { |
427 | GtkTreeStore *treestore; | 430 | GtkTreeStore *treestore; |
428 | GtkTreeIter iter_all, iter_sys, iter_events; | 431 | GtkTreeIter iter_all, iter_sys, iter_events; |
@@ -431,7 +434,7 @@ create_tree_event_model(struct tracecmd_input *handle, | |||
431 | struct event_format *event; | 434 | struct event_format *event; |
432 | char *last_system = NULL; | 435 | char *last_system = NULL; |
433 | gboolean sysactive; | 436 | gboolean sysactive; |
434 | gboolean active; | 437 | gboolean active, normal; |
435 | gchar **systems = NULL; | 438 | gchar **systems = NULL; |
436 | gint *event_ids = NULL; | 439 | gint *event_ids = NULL; |
437 | gint systems_size; | 440 | gint systems_size; |
@@ -442,12 +445,13 @@ create_tree_event_model(struct tracecmd_input *handle, | |||
442 | 445 | ||
443 | treestore = gtk_tree_store_new(NUM_EVENT_COLS, G_TYPE_STRING, | 446 | treestore = gtk_tree_store_new(NUM_EVENT_COLS, G_TYPE_STRING, |
444 | G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, | 447 | G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, |
445 | G_TYPE_INT); | 448 | G_TYPE_BOOLEAN, G_TYPE_INT); |
446 | 449 | ||
447 | gtk_tree_store_append(treestore, &iter_all, NULL); | 450 | gtk_tree_store_append(treestore, &iter_all, NULL); |
448 | gtk_tree_store_set(treestore, &iter_all, | 451 | gtk_tree_store_set(treestore, &iter_all, |
449 | COL_EVENT, "All", | 452 | COL_EVENT, "All", |
450 | COL_ACTIVE, all_events, | 453 | COL_ACTIVE, all_events, |
454 | COL_NORMAL, TRUE, | ||
451 | COL_ACTIVE_START, FALSE, | 455 | COL_ACTIVE_START, FALSE, |
452 | -1); | 456 | -1); |
453 | 457 | ||
@@ -480,19 +484,31 @@ create_tree_event_model(struct tracecmd_input *handle, | |||
480 | gtk_tree_store_set(treestore, &iter_sys, | 484 | gtk_tree_store_set(treestore, &iter_sys, |
481 | COL_EVENT, event->system, | 485 | COL_EVENT, event->system, |
482 | COL_ACTIVE, sysactive, | 486 | COL_ACTIVE, sysactive, |
487 | COL_NORMAL, TRUE, | ||
483 | -1); | 488 | -1); |
484 | last_system = event->system; | 489 | last_system = event->system; |
485 | } | 490 | } |
486 | 491 | ||
487 | active = all_events || sysactive || | 492 | active = all_events || sysactive || |
488 | event_is_enabled(event_ids, event_ids_size, event->id); | 493 | event_is_enabled(event_ids, event_ids_size, event->id); |
494 | |||
495 | normal = TRUE; | ||
496 | if (active && filter) { | ||
497 | if (!pevent_filter_event_has_trivial(filter, event->id, | ||
498 | FILTER_TRIVIAL_BOTH)) | ||
499 | normal = FALSE; | ||
500 | /* Make trivial false not selected */ | ||
501 | else if (pevent_filter_event_has_trivial(filter, event->id, | ||
502 | FILTER_TRIVIAL_FALSE)) | ||
503 | active = FALSE; | ||
504 | } | ||
489 | gtk_tree_store_append(treestore, &iter_events, &iter_sys); | 505 | gtk_tree_store_append(treestore, &iter_events, &iter_sys); |
490 | gtk_tree_store_set(treestore, &iter_events, | 506 | gtk_tree_store_set(treestore, &iter_events, |
491 | COL_EVENT, event->name, | 507 | COL_EVENT, event->name, |
492 | COL_ACTIVE, active, | 508 | COL_ACTIVE, active, |
509 | COL_NORMAL, normal, | ||
493 | COL_EVENT_ID, event->id, | 510 | COL_EVENT_ID, event->id, |
494 | -1); | 511 | -1); |
495 | |||
496 | } | 512 | } |
497 | 513 | ||
498 | g_free(systems); | 514 | g_free(systems); |
@@ -694,6 +710,7 @@ static void expand_rows(GtkTreeView *tree, GtkTreeModel *model, | |||
694 | 710 | ||
695 | static GtkWidget * | 711 | static GtkWidget * |
696 | create_event_list_view(struct tracecmd_input *handle, | 712 | create_event_list_view(struct tracecmd_input *handle, |
713 | struct event_filter *filter, | ||
697 | gboolean all_events, gchar **systems, | 714 | gboolean all_events, gchar **systems, |
698 | gint *events) | 715 | gint *events) |
699 | { | 716 | { |
@@ -720,10 +737,12 @@ create_event_list_view(struct tracecmd_input *handle, | |||
720 | gtk_tree_view_column_pack_start(col, togrend, FALSE); | 737 | gtk_tree_view_column_pack_start(col, togrend, FALSE); |
721 | gtk_tree_view_column_pack_start(col, renderer, FALSE); | 738 | gtk_tree_view_column_pack_start(col, renderer, FALSE); |
722 | gtk_tree_view_column_add_attribute(col, togrend, "active", COL_ACTIVE); | 739 | gtk_tree_view_column_add_attribute(col, togrend, "active", COL_ACTIVE); |
740 | gtk_tree_view_column_add_attribute(col, togrend, "sensitive", COL_NORMAL); | ||
723 | 741 | ||
724 | gtk_tree_view_column_add_attribute(col, renderer, "text", COL_EVENT); | 742 | gtk_tree_view_column_add_attribute(col, renderer, "text", COL_EVENT); |
743 | gtk_tree_view_column_add_attribute(col, renderer, "sensitive", COL_NORMAL); | ||
725 | 744 | ||
726 | model = create_tree_event_model(handle, all_events, systems, events); | 745 | model = create_tree_event_model(handle, filter, all_events, systems, events); |
727 | 746 | ||
728 | gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); | 747 | gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); |
729 | 748 | ||
@@ -901,22 +920,12 @@ event_dialog_response (gpointer data, gint response_id) | |||
901 | g_free(helper); | 920 | g_free(helper); |
902 | } | 921 | } |
903 | 922 | ||
904 | /** | 923 | static void filter_event_dialog(struct tracecmd_input *handle, |
905 | * trace_filter_event_dialog - make dialog with event listing | 924 | struct event_filter *filter, |
906 | * @handle: the handle to the tracecmd data file | 925 | gboolean all_events, |
907 | * @all_events: if TRUE then select all events. | 926 | gchar **systems, gint *events, |
908 | * @systems: NULL or a string array of systems terminated with NULL | 927 | trace_filter_event_cb_func func, |
909 | * @events: NULL or a int array of event ids terminated with -1 | 928 | gpointer data) |
910 | * @func: The function to call when accept or cancel is pressed | ||
911 | * @data: data to pass to the function @func | ||
912 | * | ||
913 | * If @all_events is set, then @systems and @events are ignored. | ||
914 | */ | ||
915 | void trace_filter_event_dialog(struct tracecmd_input *handle, | ||
916 | gboolean all_events, | ||
917 | gchar **systems, gint *events, | ||
918 | trace_filter_event_cb_func func, | ||
919 | gpointer data) | ||
920 | { | 929 | { |
921 | struct dialog_helper *helper; | 930 | struct dialog_helper *helper; |
922 | struct event_filter_helper *event_helper; | 931 | struct event_filter_helper *event_helper; |
@@ -955,7 +964,7 @@ void trace_filter_event_dialog(struct tracecmd_input *handle, | |||
955 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), | 964 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), |
956 | GTK_POLICY_AUTOMATIC, | 965 | GTK_POLICY_AUTOMATIC, |
957 | GTK_POLICY_AUTOMATIC); | 966 | GTK_POLICY_AUTOMATIC); |
958 | view = create_event_list_view(handle, all_events, systems, events); | 967 | view = create_event_list_view(handle, filter, all_events, systems, events); |
959 | event_helper->view = GTK_TREE_VIEW(view); | 968 | event_helper->view = GTK_TREE_VIEW(view); |
960 | 969 | ||
961 | gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), scrollwin, TRUE, TRUE, 0); | 970 | gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), scrollwin, TRUE, TRUE, 0); |
@@ -967,6 +976,52 @@ void trace_filter_event_dialog(struct tracecmd_input *handle, | |||
967 | gtk_widget_show_all(dialog); | 976 | gtk_widget_show_all(dialog); |
968 | } | 977 | } |
969 | 978 | ||
979 | /** | ||
980 | * trace_filter_event_dialog - make dialog with event listing | ||
981 | * @handle: the handle to the tracecmd data file | ||
982 | * @all_events: if TRUE then select all events. | ||
983 | * @systems: NULL or a string array of systems terminated with NULL | ||
984 | * @events: NULL or a int array of event ids terminated with -1 | ||
985 | * @func: The function to call when accept or cancel is pressed | ||
986 | * @data: data to pass to the function @func | ||
987 | * | ||
988 | * If @all_events is set, then @systems and @events are ignored. | ||
989 | */ | ||
990 | void trace_filter_event_dialog(struct tracecmd_input *handle, | ||
991 | gboolean all_events, | ||
992 | gchar **systems, gint *events, | ||
993 | trace_filter_event_cb_func func, | ||
994 | gpointer data) | ||
995 | { | ||
996 | filter_event_dialog(handle, NULL, all_events, systems, | ||
997 | events, func, data); | ||
998 | } | ||
999 | |||
1000 | /** | ||
1001 | * trace_filter_event_filter_dialog - make dialog with event listing | ||
1002 | * @handle: the handle to the tracecmd data file | ||
1003 | * @filter: the event filter to determine what to display. | ||
1004 | * @all_events: if TRUE then select all events. | ||
1005 | * @func: The function to call when accept or cancel is pressed | ||
1006 | * @data: data to pass to the function @func | ||
1007 | * | ||
1008 | * If @all_events is set, then @systems and @events are ignored. | ||
1009 | */ | ||
1010 | void trace_filter_event_filter_dialog(struct tracecmd_input *handle, | ||
1011 | struct event_filter *filter, | ||
1012 | gboolean all_events, | ||
1013 | trace_filter_event_cb_func func, | ||
1014 | gpointer data) | ||
1015 | { | ||
1016 | gchar **systems; | ||
1017 | gint *event_ids; | ||
1018 | |||
1019 | trace_filter_convert_filter_to_names(filter, &systems, &event_ids); | ||
1020 | |||
1021 | filter_event_dialog(handle, filter, all_events, systems, | ||
1022 | event_ids, func, data); | ||
1023 | } | ||
1024 | |||
970 | struct cpu_filter_helper { | 1025 | struct cpu_filter_helper { |
971 | gboolean allcpus; | 1026 | gboolean allcpus; |
972 | guint64 *cpu_mask; | 1027 | guint64 *cpu_mask; |
@@ -1285,7 +1340,8 @@ void trace_filter_convert_filter_to_names(struct event_filter *filter, | |||
1285 | all_selected = 1; | 1340 | all_selected = 1; |
1286 | } | 1341 | } |
1287 | 1342 | ||
1288 | if (pevent_event_filtered(filter, event->id)) { | 1343 | if (pevent_filter_event_has_trivial(filter, event->id, |
1344 | FILTER_TRIVIAL_TRUE)) { | ||
1289 | if (!all_selected || !systems) | 1345 | if (!all_selected || !systems) |
1290 | add_event_int(event_ids, event->id, event_count++); | 1346 | add_event_int(event_ids, event->id, event_count++); |
1291 | } else { | 1347 | } else { |
@@ -1296,6 +1352,10 @@ void trace_filter_convert_filter_to_names(struct event_filter *filter, | |||
1296 | } | 1352 | } |
1297 | } | 1353 | } |
1298 | all_selected = 0; | 1354 | all_selected = 0; |
1355 | |||
1356 | /* If this event is filtered, still add it */ | ||
1357 | if (pevent_event_filtered(filter, event->id)) | ||
1358 | add_event_int(event_ids, event->id, event_count++); | ||
1299 | } | 1359 | } |
1300 | last_system = event->system; | 1360 | last_system = event->system; |
1301 | } | 1361 | } |
@@ -1314,9 +1374,18 @@ void trace_filter_convert_char_to_filter(struct event_filter *filter, | |||
1314 | gchar **systems, | 1374 | gchar **systems, |
1315 | gint *events) | 1375 | gint *events) |
1316 | { | 1376 | { |
1377 | struct pevent *pevent; | ||
1378 | struct event_filter *copy; | ||
1317 | struct event_format *event; | 1379 | struct event_format *event; |
1318 | int i; | 1380 | int i; |
1319 | 1381 | ||
1382 | pevent = filter->pevent; | ||
1383 | |||
1384 | /* Make a copy to use later */ | ||
1385 | copy = pevent_filter_alloc(pevent); | ||
1386 | pevent_filter_copy(copy, filter); | ||
1387 | pevent_filter_reset(filter); | ||
1388 | |||
1320 | if (systems) { | 1389 | if (systems) { |
1321 | for (i = 0; systems[i]; i++) | 1390 | for (i = 0; systems[i]; i++) |
1322 | pevent_filter_add_filter_str(filter, | 1391 | pevent_filter_add_filter_str(filter, |
@@ -1332,4 +1401,8 @@ void trace_filter_convert_char_to_filter(struct event_filter *filter, | |||
1332 | NULL); | 1401 | NULL); |
1333 | } | 1402 | } |
1334 | } | 1403 | } |
1404 | |||
1405 | pevent_update_trivial(filter, copy, FILTER_TRIVIAL_BOTH); | ||
1406 | |||
1407 | pevent_filter_free(copy); | ||
1335 | } | 1408 | } |
diff --git a/trace-filter.h b/trace-filter.h index f4ee26d..64d7b47 100644 --- a/trace-filter.h +++ b/trace-filter.h | |||
@@ -77,6 +77,12 @@ void trace_filter_event_dialog(struct tracecmd_input *handle, | |||
77 | trace_filter_event_cb_func func, | 77 | trace_filter_event_cb_func func, |
78 | gpointer data); | 78 | gpointer data); |
79 | 79 | ||
80 | void trace_filter_event_filter_dialog(struct tracecmd_input *handle, | ||
81 | struct event_filter *filter, | ||
82 | gboolean all_events, | ||
83 | trace_filter_event_cb_func func, | ||
84 | gpointer data); | ||
85 | |||
80 | void trace_filter_convert_filter_to_names(struct event_filter *filter, | 86 | void trace_filter_convert_filter_to_names(struct event_filter *filter, |
81 | gchar ***systems, | 87 | gchar ***systems, |
82 | gint **events); | 88 | gint **events); |
diff --git a/trace-view-main.c b/trace-view-main.c index 268726c..d298e68 100644 --- a/trace-view-main.c +++ b/trace-view-main.c | |||
@@ -104,8 +104,6 @@ events_clicked (gpointer data) | |||
104 | GtkTreeModel *model; | 104 | GtkTreeModel *model; |
105 | TraceViewStore *store; | 105 | TraceViewStore *store; |
106 | gboolean all_events; | 106 | gboolean all_events; |
107 | gchar **systems; | ||
108 | gint *events; | ||
109 | 107 | ||
110 | model = gtk_tree_view_get_model(trace_tree); | 108 | model = gtk_tree_view_get_model(trace_tree); |
111 | if (!model) | 109 | if (!model) |
@@ -116,14 +114,10 @@ events_clicked (gpointer data) | |||
116 | all_events = trace_view_store_get_all_events_enabled(store); | 114 | all_events = trace_view_store_get_all_events_enabled(store); |
117 | event_filter = trace_view_store_get_event_filter(store); | 115 | event_filter = trace_view_store_get_event_filter(store); |
118 | 116 | ||
119 | trace_filter_convert_filter_to_names(event_filter, | 117 | trace_filter_event_filter_dialog(store->handle, event_filter, |
120 | &systems, &events); | 118 | all_events, |
121 | 119 | trace_view_event_filter_callback, | |
122 | trace_filter_event_dialog(store->handle, all_events, | 120 | trace_tree); |
123 | systems, events, | ||
124 | trace_view_event_filter_callback, trace_tree); | ||
125 | free(systems); | ||
126 | free(events); | ||
127 | } | 121 | } |
128 | 122 | ||
129 | /* Callback for the clicked signal of the Advanced filter button */ | 123 | /* Callback for the clicked signal of the Advanced filter button */ |
diff --git a/trace-view-store.c b/trace-view-store.c index f2a03fc..ba40aad 100644 --- a/trace-view-store.c +++ b/trace-view-store.c | |||
@@ -525,7 +525,7 @@ void trace_view_store_clear_all_events_enabled(TraceViewStore *store) | |||
525 | { | 525 | { |
526 | g_return_if_fail (TRACE_VIEW_IS_LIST (store)); | 526 | g_return_if_fail (TRACE_VIEW_IS_LIST (store)); |
527 | 527 | ||
528 | pevent_filter_clear_trivial(store->event_filter, FILTER_TRIVIAL_TRUE); | 528 | pevent_filter_clear_trivial(store->event_filter, FILTER_TRIVIAL_BOTH); |
529 | store->all_events = 0; | 529 | store->all_events = 0; |
530 | } | 530 | } |
531 | 531 | ||