diff options
author | Steven Rostedt <srostedt@redhat.com> | 2010-06-10 17:53:51 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2010-06-10 17:53:51 -0400 |
commit | 3c95290d3fb593145b8ce1163d795a08f05e112c (patch) | |
tree | e6fc1bea660993e4eaaf5b716bef577d6fbf692e /trace-graph.c | |
parent | d01b699fffc573e7653e00d608444735c04f9dca (diff) | |
parent | b09e5f4f3fc5c8fc2c51376050af19660c8053f4 (diff) |
Merge branch 'kernelshark-devel' into trace-cmd
Conflicts:
Makefile
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'trace-graph.c')
-rw-r--r-- | trace-graph.c | 216 |
1 files changed, 207 insertions, 9 deletions
diff --git a/trace-graph.c b/trace-graph.c index 6ed7851..04e2439 100644 --- a/trace-graph.c +++ b/trace-graph.c | |||
@@ -548,6 +548,44 @@ void trace_graph_clear_tasks(struct graph_info *ginfo) | |||
548 | redraw_graph(ginfo); | 548 | redraw_graph(ginfo); |
549 | } | 549 | } |
550 | 550 | ||
551 | void trace_graph_update_filters(struct graph_info *ginfo, | ||
552 | struct filter_task *task_filter, | ||
553 | struct filter_task *hide_tasks) | ||
554 | { | ||
555 | /* Make sure the filter passed in is not the filter we use */ | ||
556 | if (task_filter != ginfo->task_filter) { | ||
557 | filter_task_hash_free(ginfo->task_filter); | ||
558 | ginfo->task_filter = filter_task_hash_copy(task_filter); | ||
559 | } | ||
560 | |||
561 | if (hide_tasks != ginfo->hide_tasks) { | ||
562 | filter_task_hash_free(ginfo->hide_tasks); | ||
563 | ginfo->hide_tasks = filter_task_hash_copy(hide_tasks); | ||
564 | } | ||
565 | |||
566 | if (ginfo->callbacks && ginfo->callbacks->filter) | ||
567 | ginfo->callbacks->filter(ginfo, ginfo->task_filter, | ||
568 | ginfo->hide_tasks); | ||
569 | |||
570 | if (ginfo->filter_enabled) | ||
571 | redraw_graph(ginfo); | ||
572 | |||
573 | if (filter_task_count(ginfo->task_filter) || | ||
574 | filter_task_count(ginfo->hide_tasks)) | ||
575 | ginfo->filter_available = 1; | ||
576 | else { | ||
577 | ginfo->filter_enabled = 0; | ||
578 | ginfo->filter_available = 0; | ||
579 | } | ||
580 | |||
581 | } | ||
582 | |||
583 | void trace_graph_refresh_filters(struct graph_info *ginfo) | ||
584 | { | ||
585 | trace_graph_update_filters(ginfo, ginfo->task_filter, | ||
586 | ginfo->hide_tasks); | ||
587 | } | ||
588 | |||
551 | static void | 589 | static void |
552 | filter_clear_tasks_clicked (gpointer data) | 590 | filter_clear_tasks_clicked (gpointer data) |
553 | { | 591 | { |
@@ -718,7 +756,7 @@ do_pop_up(GtkWidget *widget, GdkEventButton *event, gpointer data) | |||
718 | g_assert(text); | 756 | g_assert(text); |
719 | 757 | ||
720 | if (trace_graph_filter_task_find_pid(ginfo, pid)) | 758 | if (trace_graph_filter_task_find_pid(ginfo, pid)) |
721 | snprintf(text, len, "Remove %s-%d to filter", comm, pid); | 759 | snprintf(text, len, "Remove %s-%d from filter", comm, pid); |
722 | else | 760 | else |
723 | snprintf(text, len, "Add %s-%d to filter", comm, pid); | 761 | snprintf(text, len, "Add %s-%d to filter", comm, pid); |
724 | 762 | ||
@@ -728,9 +766,9 @@ do_pop_up(GtkWidget *widget, GdkEventButton *event, gpointer data) | |||
728 | text); | 766 | text); |
729 | 767 | ||
730 | if (trace_graph_hide_task_find_pid(ginfo, pid)) | 768 | if (trace_graph_hide_task_find_pid(ginfo, pid)) |
731 | snprintf(text, len, "Show %s-%d to filter", comm, pid); | 769 | snprintf(text, len, "Show %s-%d", comm, pid); |
732 | else | 770 | else |
733 | snprintf(text, len, "Hide %s-%d to filter", comm, pid); | 771 | snprintf(text, len, "Hide %s-%d", comm, pid); |
734 | 772 | ||
735 | gtk_menu_item_set_label(GTK_MENU_ITEM(menu_filter_hide_task), | 773 | gtk_menu_item_set_label(GTK_MENU_ITEM(menu_filter_hide_task), |
736 | text); | 774 | text); |
@@ -752,7 +790,7 @@ do_pop_up(GtkWidget *widget, GdkEventButton *event, gpointer data) | |||
752 | gtk_widget_set_sensitive(menu_filter_add_task, FALSE); | 790 | gtk_widget_set_sensitive(menu_filter_add_task, FALSE); |
753 | 791 | ||
754 | gtk_menu_item_set_label(GTK_MENU_ITEM(menu_filter_hide_task), | 792 | gtk_menu_item_set_label(GTK_MENU_ITEM(menu_filter_hide_task), |
755 | "Hide task to filter"); | 793 | "Hide task"); |
756 | gtk_widget_set_sensitive(menu_filter_hide_task, FALSE); | 794 | gtk_widget_set_sensitive(menu_filter_hide_task, FALSE); |
757 | 795 | ||
758 | gtk_widget_hide(menu_plot_task); | 796 | gtk_widget_hide(menu_plot_task); |
@@ -766,7 +804,25 @@ do_pop_up(GtkWidget *widget, GdkEventButton *event, gpointer data) | |||
766 | return TRUE; | 804 | return TRUE; |
767 | } | 805 | } |
768 | 806 | ||
769 | static void button_press(struct graph_info *ginfo, gint x, guint state) | 807 | static void draw_info_box(struct graph_info *ginfo, const gchar *buffer, |
808 | gint x, gint y); | ||
809 | |||
810 | static void stop_zoom_tip(struct graph_info *ginfo) | ||
811 | { | ||
812 | clear_info_box(ginfo); | ||
813 | } | ||
814 | |||
815 | static void show_zoom_tip(struct graph_info *ginfo, gint x, gint y) | ||
816 | { | ||
817 | clear_info_box(ginfo); | ||
818 | |||
819 | draw_info_box(ginfo, | ||
820 | "Click and hold left mouse and drag right to zoom in\n" | ||
821 | "Click and hold left mouse and drag left to zoom out", | ||
822 | x, y); | ||
823 | } | ||
824 | |||
825 | static void button_press(struct graph_info *ginfo, gint x, gint y, guint state) | ||
770 | { | 826 | { |
771 | ginfo->press_x = x; | 827 | ginfo->press_x = x; |
772 | ginfo->last_x = 0; | 828 | ginfo->last_x = 0; |
@@ -785,8 +841,10 @@ static void button_press(struct graph_info *ginfo, gint x, guint state) | |||
785 | clear_line(ginfo, convert_time_to_x(ginfo, ginfo->marka_time)); | 841 | clear_line(ginfo, convert_time_to_x(ginfo, ginfo->marka_time)); |
786 | update_marka(ginfo, x); | 842 | update_marka(ginfo, x); |
787 | } | 843 | } |
788 | } else | 844 | } else { |
789 | ginfo->zoom = TRUE; | 845 | ginfo->zoom = TRUE; |
846 | show_zoom_tip(ginfo, x, y); | ||
847 | } | ||
790 | 848 | ||
791 | return; | 849 | return; |
792 | } | 850 | } |
@@ -807,6 +865,7 @@ button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data) | |||
807 | 865 | ||
808 | /* check for double click */ | 866 | /* check for double click */ |
809 | if (event->type == GDK_2BUTTON_PRESS) { | 867 | if (event->type == GDK_2BUTTON_PRESS) { |
868 | stop_zoom_tip(ginfo); | ||
810 | if (ginfo->line_active) { | 869 | if (ginfo->line_active) { |
811 | ginfo->line_active = FALSE; | 870 | ginfo->line_active = FALSE; |
812 | clear_line(ginfo, ginfo->last_x); | 871 | clear_line(ginfo, ginfo->last_x); |
@@ -826,7 +885,7 @@ button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data) | |||
826 | return TRUE; | 885 | return TRUE; |
827 | } | 886 | } |
828 | 887 | ||
829 | button_press(ginfo, event->x, event->state); | 888 | button_press(ginfo, event->x, event->y, event->state); |
830 | 889 | ||
831 | return TRUE; | 890 | return TRUE; |
832 | } | 891 | } |
@@ -839,6 +898,9 @@ static void motion_plot(struct graph_info *ginfo, gint x, gint y) | |||
839 | { | 898 | { |
840 | struct graph_plot *plot; | 899 | struct graph_plot *plot; |
841 | 900 | ||
901 | if (ginfo->zoom) | ||
902 | stop_zoom_tip(ginfo); | ||
903 | |||
842 | if (!ginfo->curr_pixmap) | 904 | if (!ginfo->curr_pixmap) |
843 | return; | 905 | return; |
844 | 906 | ||
@@ -876,7 +938,7 @@ info_button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data) | |||
876 | if (event->type == GDK_2BUTTON_PRESS) | 938 | if (event->type == GDK_2BUTTON_PRESS) |
877 | return FALSE; | 939 | return FALSE; |
878 | 940 | ||
879 | button_press(ginfo, gtk_adjustment_get_value(ginfo->hadj), event->state); | 941 | button_press(ginfo, gtk_adjustment_get_value(ginfo->hadj), event->y, event->state); |
880 | 942 | ||
881 | return FALSE; | 943 | return FALSE; |
882 | } | 944 | } |
@@ -1500,7 +1562,8 @@ static void button_release(struct graph_info *ginfo, gint x) | |||
1500 | ginfo->show_marka = TRUE; | 1562 | ginfo->show_marka = TRUE; |
1501 | ginfo->show_markb = TRUE; | 1563 | ginfo->show_markb = TRUE; |
1502 | update_markb(ginfo, x); | 1564 | update_markb(ginfo, x); |
1503 | } | 1565 | } else |
1566 | stop_zoom_tip(ginfo); | ||
1504 | 1567 | ||
1505 | clear_line(ginfo, ginfo->last_x); | 1568 | clear_line(ginfo, ginfo->last_x); |
1506 | clear_line(ginfo, ginfo->press_x); | 1569 | clear_line(ginfo, ginfo->press_x); |
@@ -2395,6 +2458,132 @@ int trace_graph_load_handle(struct graph_info *ginfo, | |||
2395 | return 0; | 2458 | return 0; |
2396 | } | 2459 | } |
2397 | 2460 | ||
2461 | static int load_event_filter(struct graph_info *ginfo, | ||
2462 | struct tracecmd_xml_handle *handle, | ||
2463 | struct tracecmd_xml_system_node *node) | ||
2464 | { | ||
2465 | struct tracecmd_xml_system_node *child; | ||
2466 | struct event_filter *event_filter; | ||
2467 | const char *name; | ||
2468 | const char *value; | ||
2469 | |||
2470 | event_filter = ginfo->event_filter; | ||
2471 | |||
2472 | child = tracecmd_xml_node_child(node); | ||
2473 | name = tracecmd_xml_node_type(child); | ||
2474 | if (strcmp(name, "FilterType") != 0) | ||
2475 | return -1; | ||
2476 | |||
2477 | value = tracecmd_xml_node_value(handle, child); | ||
2478 | /* Do nothing with all events enabled */ | ||
2479 | if (strcmp(value, "all events") == 0) | ||
2480 | return 0; | ||
2481 | |||
2482 | node = tracecmd_xml_node_next(child); | ||
2483 | if (!node) | ||
2484 | return -1; | ||
2485 | |||
2486 | pevent_filter_clear_trivial(event_filter, FILTER_TRIVIAL_BOTH); | ||
2487 | ginfo->all_events = FALSE; | ||
2488 | |||
2489 | trace_filter_load_events(event_filter, handle, node); | ||
2490 | |||
2491 | return 0; | ||
2492 | } | ||
2493 | |||
2494 | int trace_graph_load_filters(struct graph_info *ginfo, | ||
2495 | struct tracecmd_xml_handle *handle) | ||
2496 | { | ||
2497 | struct tracecmd_xml_system *system; | ||
2498 | struct tracecmd_xml_system_node *syschild; | ||
2499 | const char *name; | ||
2500 | |||
2501 | if (filter_task_count(ginfo->task_filter) || | ||
2502 | filter_task_count(ginfo->hide_tasks)) | ||
2503 | ginfo->filter_available = 1; | ||
2504 | else | ||
2505 | ginfo->filter_available = 0; | ||
2506 | |||
2507 | system = tracecmd_xml_find_system(handle, "TraceGraph"); | ||
2508 | if (!system) | ||
2509 | return -1; | ||
2510 | |||
2511 | syschild = tracecmd_xml_system_node(system); | ||
2512 | if (!syschild) | ||
2513 | goto out_free_sys; | ||
2514 | |||
2515 | do { | ||
2516 | name = tracecmd_xml_node_type(syschild); | ||
2517 | |||
2518 | if (strcmp(name, "EventFilter") == 0) | ||
2519 | load_event_filter(ginfo, handle, syschild); | ||
2520 | |||
2521 | syschild = tracecmd_xml_node_next(syschild); | ||
2522 | } while (syschild); | ||
2523 | |||
2524 | if (filter_task_count(ginfo->task_filter) || | ||
2525 | filter_task_count(ginfo->hide_tasks)) | ||
2526 | ginfo->filter_available = 1; | ||
2527 | else | ||
2528 | ginfo->filter_available = 0; | ||
2529 | |||
2530 | tracecmd_xml_free_system(system); | ||
2531 | |||
2532 | trace_graph_refresh(ginfo); | ||
2533 | |||
2534 | return 0; | ||
2535 | |||
2536 | out_free_sys: | ||
2537 | tracecmd_xml_free_system(system); | ||
2538 | if (ginfo->filter_enabled) | ||
2539 | trace_graph_refresh(ginfo); | ||
2540 | |||
2541 | return -1; | ||
2542 | } | ||
2543 | |||
2544 | int trace_graph_save_filters(struct graph_info *ginfo, | ||
2545 | struct tracecmd_xml_handle *handle) | ||
2546 | { | ||
2547 | struct event_filter *event_filter; | ||
2548 | |||
2549 | tracecmd_xml_start_system(handle, "TraceGraph"); | ||
2550 | |||
2551 | event_filter = ginfo->event_filter; | ||
2552 | |||
2553 | tracecmd_xml_start_sub_system(handle, "EventFilter"); | ||
2554 | |||
2555 | if (ginfo->all_events || !event_filter) | ||
2556 | tracecmd_xml_write_element(handle, "FilterType", "all events"); | ||
2557 | else { | ||
2558 | tracecmd_xml_write_element(handle, "FilterType", "filter"); | ||
2559 | trace_filter_save_events(handle, event_filter); | ||
2560 | } | ||
2561 | |||
2562 | tracecmd_xml_end_sub_system(handle); | ||
2563 | |||
2564 | tracecmd_xml_end_system(handle); | ||
2565 | |||
2566 | return 0; | ||
2567 | } | ||
2568 | |||
2569 | static void set_label_a(GtkWidget *widget) | ||
2570 | { | ||
2571 | gtk_widget_set_tooltip_text(widget, "Click left mouse on graph\n" | ||
2572 | "to set Marker A"); | ||
2573 | } | ||
2574 | |||
2575 | static void set_label_b(GtkWidget *widget) | ||
2576 | { | ||
2577 | gtk_widget_set_tooltip_text(widget, "Shift and click left mouse on graph\n" | ||
2578 | "to set Marker B"); | ||
2579 | } | ||
2580 | |||
2581 | static void set_label_cursor(GtkWidget *widget) | ||
2582 | { | ||
2583 | gtk_widget_set_tooltip_text(widget, "Double click Left mouse on graph\n" | ||
2584 | "to set Cursor"); | ||
2585 | } | ||
2586 | |||
2398 | struct graph_info * | 2587 | struct graph_info * |
2399 | trace_graph_create_with_callbacks(struct tracecmd_input *handle, | 2588 | trace_graph_create_with_callbacks(struct tracecmd_input *handle, |
2400 | struct graph_callbacks *cbs) | 2589 | struct graph_callbacks *cbs) |
@@ -2454,11 +2643,13 @@ trace_graph_create_with_callbacks(struct tracecmd_input *handle, | |||
2454 | /* --- Cursor --- */ | 2643 | /* --- Cursor --- */ |
2455 | 2644 | ||
2456 | label = gtk_label_new("Cursor:"); | 2645 | label = gtk_label_new("Cursor:"); |
2646 | set_label_cursor(label); | ||
2457 | gtk_table_attach(GTK_TABLE(table), label, 4, 5, 0, 1, GTK_EXPAND, GTK_EXPAND, 3, 3); | 2647 | gtk_table_attach(GTK_TABLE(table), label, 4, 5, 0, 1, GTK_EXPAND, GTK_EXPAND, 3, 3); |
2458 | gtk_widget_show(label); | 2648 | gtk_widget_show(label); |
2459 | 2649 | ||
2460 | ginfo->cursor_label = gtk_label_new("0.0"); | 2650 | ginfo->cursor_label = gtk_label_new("0.0"); |
2461 | eventbox = gtk_event_box_new(); | 2651 | eventbox = gtk_event_box_new(); |
2652 | set_label_cursor(eventbox); | ||
2462 | gtk_widget_show(eventbox); | 2653 | gtk_widget_show(eventbox); |
2463 | gtk_widget_modify_bg(eventbox, GTK_STATE_NORMAL, &color); | 2654 | gtk_widget_modify_bg(eventbox, GTK_STATE_NORMAL, &color); |
2464 | gtk_container_add(GTK_CONTAINER(eventbox), ginfo->cursor_label); | 2655 | gtk_container_add(GTK_CONTAINER(eventbox), ginfo->cursor_label); |
@@ -2473,9 +2664,11 @@ trace_graph_create_with_callbacks(struct tracecmd_input *handle, | |||
2473 | gtk_widget_show(hbox); | 2664 | gtk_widget_show(hbox); |
2474 | 2665 | ||
2475 | label = gtk_label_new("Marker"); | 2666 | label = gtk_label_new("Marker"); |
2667 | set_label_a(label); | ||
2476 | gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | 2668 | gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
2477 | gtk_widget_show(label); | 2669 | gtk_widget_show(label); |
2478 | 2670 | ||
2671 | |||
2479 | label = gtk_label_new("A:"); | 2672 | label = gtk_label_new("A:"); |
2480 | 2673 | ||
2481 | colorAB.red = 0; | 2674 | colorAB.red = 0; |
@@ -2483,6 +2676,7 @@ trace_graph_create_with_callbacks(struct tracecmd_input *handle, | |||
2483 | colorAB.blue = 0; | 2676 | colorAB.blue = 0; |
2484 | 2677 | ||
2485 | eventbox = gtk_event_box_new(); | 2678 | eventbox = gtk_event_box_new(); |
2679 | set_label_a(eventbox); | ||
2486 | gtk_widget_show(eventbox); | 2680 | gtk_widget_show(eventbox); |
2487 | gtk_widget_modify_bg(eventbox, GTK_STATE_NORMAL, &colorAB); | 2681 | gtk_widget_modify_bg(eventbox, GTK_STATE_NORMAL, &colorAB); |
2488 | gtk_container_add(GTK_CONTAINER(eventbox), label); | 2682 | gtk_container_add(GTK_CONTAINER(eventbox), label); |
@@ -2494,6 +2688,7 @@ trace_graph_create_with_callbacks(struct tracecmd_input *handle, | |||
2494 | 2688 | ||
2495 | ginfo->marka_label = gtk_label_new("0.0"); | 2689 | ginfo->marka_label = gtk_label_new("0.0"); |
2496 | eventbox = gtk_event_box_new(); | 2690 | eventbox = gtk_event_box_new(); |
2691 | set_label_a(eventbox); | ||
2497 | gtk_widget_show(eventbox); | 2692 | gtk_widget_show(eventbox); |
2498 | gtk_widget_modify_bg(eventbox, GTK_STATE_NORMAL, &color); | 2693 | gtk_widget_modify_bg(eventbox, GTK_STATE_NORMAL, &color); |
2499 | gtk_container_add(GTK_CONTAINER(eventbox), ginfo->marka_label); | 2694 | gtk_container_add(GTK_CONTAINER(eventbox), ginfo->marka_label); |
@@ -2508,6 +2703,7 @@ trace_graph_create_with_callbacks(struct tracecmd_input *handle, | |||
2508 | gtk_widget_show(hbox); | 2703 | gtk_widget_show(hbox); |
2509 | 2704 | ||
2510 | label = gtk_label_new("Marker"); | 2705 | label = gtk_label_new("Marker"); |
2706 | set_label_b(label); | ||
2511 | gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | 2707 | gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
2512 | gtk_widget_show(label); | 2708 | gtk_widget_show(label); |
2513 | 2709 | ||
@@ -2518,6 +2714,7 @@ trace_graph_create_with_callbacks(struct tracecmd_input *handle, | |||
2518 | colorAB.blue = 0; | 2714 | colorAB.blue = 0; |
2519 | 2715 | ||
2520 | eventbox = gtk_event_box_new(); | 2716 | eventbox = gtk_event_box_new(); |
2717 | set_label_b(eventbox); | ||
2521 | gtk_widget_show(eventbox); | 2718 | gtk_widget_show(eventbox); |
2522 | gtk_widget_modify_bg(eventbox, GTK_STATE_NORMAL, &colorAB); | 2719 | gtk_widget_modify_bg(eventbox, GTK_STATE_NORMAL, &colorAB); |
2523 | gtk_container_add(GTK_CONTAINER(eventbox), label); | 2720 | gtk_container_add(GTK_CONTAINER(eventbox), label); |
@@ -2530,6 +2727,7 @@ trace_graph_create_with_callbacks(struct tracecmd_input *handle, | |||
2530 | 2727 | ||
2531 | ginfo->markb_label = gtk_label_new("0.0"); | 2728 | ginfo->markb_label = gtk_label_new("0.0"); |
2532 | eventbox = gtk_event_box_new(); | 2729 | eventbox = gtk_event_box_new(); |
2730 | set_label_b(eventbox); | ||
2533 | gtk_widget_show(eventbox); | 2731 | gtk_widget_show(eventbox); |
2534 | gtk_widget_modify_bg(eventbox, GTK_STATE_NORMAL, &color); | 2732 | gtk_widget_modify_bg(eventbox, GTK_STATE_NORMAL, &color); |
2535 | gtk_container_add(GTK_CONTAINER(eventbox), ginfo->markb_label); | 2733 | gtk_container_add(GTK_CONTAINER(eventbox), ginfo->markb_label); |