diff options
-rw-r--r-- | kernel-shark.c | 222 | ||||
-rw-r--r-- | kernel-shark.h | 6 |
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 */ |
330 | static void | 330 | static void |
331 | sync_task_filter_clicked (GtkWidget *subitem, gpointer data) | 331 | sync_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 */ | ||
427 | static void | ||
428 | sync_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 | |||
426 | static void filter_list_enable_clicked (gpointer data); | 503 | static void filter_list_enable_clicked (gpointer data); |
427 | 504 | ||
428 | static void | 505 | static 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 | ||
664 | static void | 745 | static void |
746 | graph_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 | |||
763 | static void | ||
665 | graph_events_clicked (gpointer data) | 764 | graph_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 */ | ||
703 | static void | 805 | static void |
704 | adv_graph_filter_clicked (gpointer data) | 806 | graph_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 | |||
713 | static void | ||
714 | sync_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 */ | |
737 | static void | 822 | static void |
738 | sync_list_events_to_graph_clicked (gpointer data) | 823 | adv_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 | }; |