aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-06-10 11:33:36 -0400
committerSteven Rostedt <rostedt@goodmis.org>2010-06-10 11:33:36 -0400
commit66256925536b9757da1f0cb2bc2230b6478dbeaf (patch)
treea0cdce9e1ac4c87b41bba072528cfaf3ac239aee
parenteea14e07e1ff9d3fb7c0215f4589f8a061bf7107 (diff)
kerenlshark: Allow for list and graph event filters to by in sync
Update the event filters to be like the task filters where the list and graph event filters are in sync. The user can unsync them so that the list and graph event filters will be independent. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--kernel-shark.c222
-rw-r--r--kernel-shark.h6
2 files changed, 155 insertions, 73 deletions
diff --git a/kernel-shark.c b/kernel-shark.c
index d16448c..e0ab1ed 100644
--- a/kernel-shark.c
+++ b/kernel-shark.c
@@ -326,7 +326,7 @@ delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)
326 return TRUE; 326 return TRUE;
327} 327}
328 328
329/* Callback for the clicked signal of the Events filter button */ 329/* Callback for the clicked signal of the tasks sync filter button */
330static void 330static void
331sync_task_filter_clicked (GtkWidget *subitem, gpointer data) 331sync_task_filter_clicked (GtkWidget *subitem, gpointer data)
332{ 332{
@@ -423,6 +423,83 @@ sync_task_filter_clicked (GtkWidget *subitem, gpointer data)
423 } 423 }
424} 424}
425 425
426/* Callback for the clicked signal of the events sync filter button */
427static void
428sync_events_filter_clicked (GtkWidget *subitem, gpointer data)
429{
430 struct shark_info *info = data;
431 struct graph_info *ginfo = info->ginfo;
432 struct event_filter *event_filter;
433 GtkTreeView *trace_tree = GTK_TREE_VIEW(info->treeview);
434 GtkTreeModel *model;
435 TraceViewStore *store;
436 gboolean keep;
437 gboolean all_events;
438 gchar *selections[] = { "Sync List Filter with Graph Filter",
439 "Sync Graph Filter with List Filter",
440 NULL };
441 int result;
442
443 if (info->sync_event_filters) {
444 /* Separate the List and Graph filters */
445
446 info->sync_event_filters = 0;
447 gtk_menu_item_set_label(GTK_MENU_ITEM(info->events_sync_menu),
448 "Sync Graph and List Event Filters");
449
450 gtk_menu_item_set_label(GTK_MENU_ITEM(info->graph_events_menu),
451 "graph events");
452 gtk_menu_item_set_label(GTK_MENU_ITEM(info->graph_adv_events_menu),
453 "graph advanced events");
454 gtk_widget_show(info->list_events_menu);
455 gtk_widget_show(info->list_adv_events_menu);
456
457 return;
458 }
459
460 model = gtk_tree_view_get_model(trace_tree);
461 if (!model)
462 return;
463
464 store = TRACE_VIEW_STORE(model);
465
466 /* Ask user which way to sync */
467 result = trace_sync_select_menu("Sync Event Filters",
468 selections, &keep);
469
470 switch (result) {
471 case 0:
472 /* Sync List Filter with Graph Filter */
473 all_events = ginfo->all_events;
474
475 trace_view_copy_filter(info->treeview, all_events,
476 ginfo->event_filter);
477 break;
478 case 1:
479 /* Sync Graph Filter with List Filter */
480 all_events = trace_view_store_get_all_events_enabled(store);
481 event_filter = trace_view_store_get_event_filter(store);
482
483 trace_graph_copy_filter(info->ginfo, all_events,
484 event_filter);
485 break;
486 default:
487 keep = 0;
488 }
489
490 if (keep) {
491 info->sync_event_filters = 1;
492 gtk_menu_item_set_label(GTK_MENU_ITEM(info->events_sync_menu),
493 "Unsync Graph and List Event Filters");
494 gtk_menu_item_set_label(GTK_MENU_ITEM(info->graph_events_menu),
495 "events");
496 gtk_menu_item_set_label(GTK_MENU_ITEM(info->graph_adv_events_menu),
497 "advanced events");
498 gtk_widget_hide(info->list_events_menu);
499 gtk_widget_hide(info->list_adv_events_menu);
500 }
501}
502
426static void filter_list_enable_clicked (gpointer data); 503static void filter_list_enable_clicked (gpointer data);
427 504
428static void 505static void
@@ -655,6 +732,10 @@ list_events_clicked (gpointer data)
655 all_events = trace_view_store_get_all_events_enabled(store); 732 all_events = trace_view_store_get_all_events_enabled(store);
656 event_filter = trace_view_store_get_event_filter(store); 733 event_filter = trace_view_store_get_event_filter(store);
657 734
735 /*
736 * This menu is not available when in sync, so we
737 * can call the treeview callback directly.
738 */
658 trace_filter_event_filter_dialog(store->handle, event_filter, 739 trace_filter_event_filter_dialog(store->handle, event_filter,
659 all_events, 740 all_events,
660 trace_view_event_filter_callback, 741 trace_view_event_filter_callback,
@@ -662,6 +743,24 @@ list_events_clicked (gpointer data)
662} 743}
663 744
664static void 745static void
746graph_event_filter_callback(gboolean accept,
747 gboolean all_events,
748 gchar **systems,
749 gint *events,
750 gpointer data)
751{
752 struct shark_info *info = data;
753
754 trace_graph_event_filter_callback(accept, all_events,
755 systems, events,
756 info->ginfo);
757
758 if (info->sync_event_filters)
759 trace_view_event_filter_callback(accept, all_events, systems,
760 events, info->treeview);
761}
762
763static void
665graph_events_clicked (gpointer data) 764graph_events_clicked (gpointer data)
666{ 765{
667 struct shark_info *info = data; 766 struct shark_info *info = data;
@@ -673,8 +772,8 @@ graph_events_clicked (gpointer data)
673 trace_filter_event_filter_dialog(info->handle, 772 trace_filter_event_filter_dialog(info->handle,
674 ginfo->event_filter, 773 ginfo->event_filter,
675 all_events, 774 all_events,
676 trace_graph_event_filter_callback, 775 graph_event_filter_callback,
677 ginfo); 776 info);
678} 777}
679 778
680/* Callback for the clicked signal of the List advanced filter button */ 779/* Callback for the clicked signal of the List advanced filter button */
@@ -695,56 +794,39 @@ adv_list_filter_clicked (gpointer data)
695 794
696 event_filter = trace_view_store_get_event_filter(store); 795 event_filter = trace_view_store_get_event_filter(store);
697 796
797 /*
798 * This menu is not available when in sync, so we
799 * can call the treeview callback directly.
800 */
698 trace_adv_filter_dialog(store->handle, event_filter, 801 trace_adv_filter_dialog(store->handle, event_filter,
699 trace_view_adv_filter_callback, trace_tree); 802 trace_view_adv_filter_callback, trace_tree);
700} 803}
701 804
702/* Callback for the clicked signal of the Graph advanced filter button */
703static void 805static void
704adv_graph_filter_clicked (gpointer data) 806graph_adv_filter_callback(gboolean accept,
807 const gchar *text,
808 gint *event_ids,
809 gpointer data)
705{ 810{
706 struct shark_info *info = data; 811 struct shark_info *info = data;
707 struct graph_info *ginfo = info->ginfo; 812 struct graph_info *ginfo = info->ginfo;
708 813
709 trace_adv_filter_dialog(ginfo->handle, ginfo->event_filter, 814 trace_graph_adv_filter_callback(accept, text, event_ids, ginfo);
710 trace_graph_adv_filter_callback, ginfo);
711}
712
713static void
714sync_graph_events_to_list_clicked (gpointer data)
715{
716 struct shark_info *info = data;
717 struct event_filter *event_filter;
718 GtkTreeView *trace_tree = GTK_TREE_VIEW(info->treeview);
719 GtkTreeModel *model;
720 TraceViewStore *store;
721 gboolean all_events;
722
723 model = gtk_tree_view_get_model(trace_tree);
724 if (!model)
725 return;
726 815
727 store = TRACE_VIEW_STORE(model); 816 if (info->sync_event_filters)
728 817 trace_view_adv_filter_callback(accept, text, event_ids,
729 all_events = trace_view_store_get_all_events_enabled(store); 818 info->treeview);
730 event_filter = trace_view_store_get_event_filter(store);
731
732 trace_graph_copy_filter(info->ginfo, all_events,
733 event_filter);
734} 819}
735 820
736 821/* Callback for the clicked signal of the Graph advanced filter button */
737static void 822static void
738sync_list_events_to_graph_clicked (gpointer data) 823adv_graph_filter_clicked (gpointer data)
739{ 824{
740 struct shark_info *info = data; 825 struct shark_info *info = data;
741 struct graph_info *ginfo = info->ginfo; 826 struct graph_info *ginfo = info->ginfo;
742 gboolean all_events;
743
744 all_events = ginfo->all_events;
745 827
746 trace_view_copy_filter(info->treeview, all_events, 828 trace_adv_filter_dialog(ginfo->handle, ginfo->event_filter,
747 ginfo->event_filter); 829 graph_adv_filter_callback, info);
748} 830}
749 831
750/* Callback for the clicked signal of the CPUs filter button */ 832/* Callback for the clicked signal of the CPUs filter button */
@@ -1345,6 +1427,7 @@ void kernel_shark(int argc, char **argv)
1345 1427
1346 info->handle = handle; 1428 info->handle = handle;
1347 info->sync_task_filters = TRUE; 1429 info->sync_task_filters = TRUE;
1430 info->sync_event_filters = TRUE;
1348 1431
1349 /* --- Main window --- */ 1432 /* --- Main window --- */
1350 1433
@@ -1470,6 +1553,24 @@ void kernel_shark(int argc, char **argv)
1470 gtk_widget_show(sub_item); 1553 gtk_widget_show(sub_item);
1471 1554
1472 1555
1556 /* --- Filter - Sync events Option --- */
1557
1558 sub_item = gtk_menu_item_new_with_label("Unsync Graph and List Event Filters");
1559
1560 info->events_sync_menu = sub_item;
1561
1562 /* Add them to the menu */
1563 gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item);
1564
1565 /* We can attach the Quit menu item to our exit function */
1566 g_signal_connect (G_OBJECT (sub_item), "activate",
1567 G_CALLBACK (sync_events_filter_clicked),
1568 (gpointer) info);
1569
1570 /* We do need to show menu items */
1571 gtk_widget_show(sub_item);
1572
1573
1473 /* --- Filter - List Tasks Option --- */ 1574 /* --- Filter - List Tasks Option --- */
1474 1575
1475 sub_item = gtk_menu_item_new_with_label("list tasks"); 1576 sub_item = gtk_menu_item_new_with_label("list tasks");
@@ -1552,53 +1653,25 @@ void kernel_shark(int argc, char **argv)
1552 G_CALLBACK (list_events_clicked), 1653 G_CALLBACK (list_events_clicked),
1553 (gpointer) info); 1654 (gpointer) info);
1554 1655
1555 /* We do need to show menu items */ 1656 info->list_events_menu = sub_item;
1556 gtk_widget_show(sub_item);
1557 1657
1558 1658 /* We do not show this menu (yet) */
1559 /* --- Filter - Events Option --- */
1560
1561 sub_item = gtk_menu_item_new_with_label("graph events");
1562
1563 /* Add them to the menu */
1564 gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item);
1565
1566 /* We can attach the Quit menu item to our exit function */
1567 g_signal_connect_swapped (G_OBJECT (sub_item), "activate",
1568 G_CALLBACK (graph_events_clicked),
1569 (gpointer) info);
1570
1571 /* We do need to show menu items */
1572 gtk_widget_show(sub_item);
1573 1659
1574 1660
1575 /* --- Filter - Events Option --- */ 1661 /* --- Filter - Events Option --- */
1576 1662
1577 sub_item = gtk_menu_item_new_with_label("sync graph events with list"); 1663 /* The list and graph events start off insync */
1664 sub_item = gtk_menu_item_new_with_label("events");
1578 1665
1579 /* Add them to the menu */ 1666 /* Add them to the menu */
1580 gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item); 1667 gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item);
1581 1668
1582 /* We can attach the Quit menu item to our exit function */ 1669 /* We can attach the Quit menu item to our exit function */
1583 g_signal_connect_swapped (G_OBJECT (sub_item), "activate", 1670 g_signal_connect_swapped (G_OBJECT (sub_item), "activate",
1584 G_CALLBACK (sync_graph_events_to_list_clicked), 1671 G_CALLBACK (graph_events_clicked),
1585 (gpointer) info); 1672 (gpointer) info);
1586 1673
1587 /* We do need to show menu items */ 1674 info->graph_events_menu = sub_item;
1588 gtk_widget_show(sub_item);
1589
1590
1591 /* --- Filter - Events Option --- */
1592
1593 sub_item = gtk_menu_item_new_with_label("sync list events with graph");
1594
1595 /* Add them to the menu */
1596 gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item);
1597
1598 /* We can attach the Quit menu item to our exit function */
1599 g_signal_connect_swapped (G_OBJECT (sub_item), "activate",
1600 G_CALLBACK (sync_list_events_to_graph_clicked),
1601 (gpointer) info);
1602 1675
1603 /* We do need to show menu items */ 1676 /* We do need to show menu items */
1604 gtk_widget_show(sub_item); 1677 gtk_widget_show(sub_item);
@@ -1616,13 +1689,14 @@ void kernel_shark(int argc, char **argv)
1616 G_CALLBACK (adv_list_filter_clicked), 1689 G_CALLBACK (adv_list_filter_clicked),
1617 (gpointer) info); 1690 (gpointer) info);
1618 1691
1619 /* We do need to show menu items */ 1692 info->list_adv_events_menu = sub_item;
1620 gtk_widget_show(sub_item); 1693 /* We do not show this menu (yet) */
1621 1694
1622 1695
1623 /* --- Filter - Graph Advanced Events Option --- */ 1696 /* --- Filter - Graph Advanced Events Option --- */
1624 1697
1625 sub_item = gtk_menu_item_new_with_label("graph advanced event"); 1698 /* The list and graph events start off in sync */
1699 sub_item = gtk_menu_item_new_with_label("advanced events");
1626 1700
1627 /* Add them to the menu */ 1701 /* Add them to the menu */
1628 gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item); 1702 gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item);
@@ -1632,6 +1706,8 @@ void kernel_shark(int argc, char **argv)
1632 G_CALLBACK (adv_graph_filter_clicked), 1706 G_CALLBACK (adv_graph_filter_clicked),
1633 (gpointer) info); 1707 (gpointer) info);
1634 1708
1709 info->graph_adv_events_menu = sub_item;
1710
1635 /* We do need to show menu items */ 1711 /* We do need to show menu items */
1636 gtk_widget_show(sub_item); 1712 gtk_widget_show(sub_item);
1637 1713
diff --git a/kernel-shark.h b/kernel-shark.h
index 34d2cfd..a808108 100644
--- a/kernel-shark.h
+++ b/kernel-shark.h
@@ -31,16 +31,22 @@ struct shark_info {
31 GtkWidget *treeview; 31 GtkWidget *treeview;
32 GtkWidget *spin; 32 GtkWidget *spin;
33 GtkWidget *task_sync_menu; 33 GtkWidget *task_sync_menu;
34 GtkWidget *events_sync_menu;
34 GtkWidget *list_task_menu; 35 GtkWidget *list_task_menu;
35 GtkWidget *graph_task_menu; 36 GtkWidget *graph_task_menu;
36 GtkWidget *list_hide_task_menu; 37 GtkWidget *list_hide_task_menu;
37 GtkWidget *graph_hide_task_menu; 38 GtkWidget *graph_hide_task_menu;
39 GtkWidget *list_events_menu;
40 GtkWidget *graph_events_menu;
41 GtkWidget *list_adv_events_menu;
42 GtkWidget *graph_adv_events_menu;
38 struct graph_callbacks graph_cbs; 43 struct graph_callbacks graph_cbs;
39 gint selected_task; 44 gint selected_task;
40 gboolean list_filter_enabled; 45 gboolean list_filter_enabled;
41 gboolean list_filter_available; 46 gboolean list_filter_available;
42 gboolean graph_follows; 47 gboolean graph_follows;
43 gboolean sync_task_filters; 48 gboolean sync_task_filters;
49 gboolean sync_event_filters;
44 struct filter_task *list_task_filter; 50 struct filter_task *list_task_filter;
45 struct filter_task *list_hide_tasks; 51 struct filter_task *list_hide_tasks;
46}; 52};