aboutsummaryrefslogtreecommitdiffstats
path: root/trace-graph.c
diff options
context:
space:
mode:
Diffstat (limited to 'trace-graph.c')
-rw-r--r--trace-graph.c216
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
551void 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
583void trace_graph_refresh_filters(struct graph_info *ginfo)
584{
585 trace_graph_update_filters(ginfo, ginfo->task_filter,
586 ginfo->hide_tasks);
587}
588
551static void 589static void
552filter_clear_tasks_clicked (gpointer data) 590filter_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
769static void button_press(struct graph_info *ginfo, gint x, guint state) 807static void draw_info_box(struct graph_info *ginfo, const gchar *buffer,
808 gint x, gint y);
809
810static void stop_zoom_tip(struct graph_info *ginfo)
811{
812 clear_info_box(ginfo);
813}
814
815static 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
825static 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
2461static 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
2494int 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
2544int 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
2569static 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
2575static 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
2581static 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
2398struct graph_info * 2587struct graph_info *
2399trace_graph_create_with_callbacks(struct tracecmd_input *handle, 2588trace_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);