aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--trace-filter.c121
-rw-r--r--trace-filter.h6
-rw-r--r--trace-view-main.c14
-rw-r--r--trace-view-store.c2
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,
384enum { 385enum {
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
422static GtkTreeModel * 424static GtkTreeModel *
423create_tree_event_model(struct tracecmd_input *handle, 425create_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
695static GtkWidget * 711static GtkWidget *
696create_event_list_view(struct tracecmd_input *handle, 712create_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/** 923static 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 */
915void 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 */
990void 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 */
1010void 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
970struct cpu_filter_helper { 1025struct 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
80void 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
80void trace_filter_convert_filter_to_names(struct event_filter *filter, 86void 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