aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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};