aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-02-17 18:09:04 -0500
committerSteven Rostedt <rostedt@goodmis.org>2010-02-17 18:09:04 -0500
commitfb1a1277385c14eac9e02613a45aea5f4123cd6b (patch)
tree6eb153368482e48ac2d3ba2680204bd60705d88a
parent6b161770f9ac2f46206e44d9d539e7826d9dd196 (diff)
trace-view: Make advanced filters show differently in event filter dialog
Have the events with event filters show up greyed out in the event filter dialog. If the user keeps them active, the filter stays active. But if the user disables the filter, then it will go away. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-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