diff options
| author | Steven Rostedt <srostedt@redhat.com> | 2009-12-17 17:34:33 -0500 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2009-12-17 22:55:27 -0500 |
| commit | 0e861e7f795e33abb4d20e191ba97c36525ed0b3 (patch) | |
| tree | c8b6a33b5ef10877d74420360a06dbc5830524ac /trace-graph.c | |
| parent | 540cf9cdbfaa7190f07d5c20a4a2d720601858b4 (diff) | |
trace-graph: Add labels when enough room permits
Add labels to the graph if there's enough room to show them.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'trace-graph.c')
| -rw-r--r-- | trace-graph.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/trace-graph.c b/trace-graph.c index b2ff3b2..1f5e4cf 100644 --- a/trace-graph.c +++ b/trace-graph.c | |||
| @@ -654,17 +654,88 @@ static void set_color_by_pid(GtkWidget *widget, GdkGC *gc, gint pid) | |||
| 654 | gdk_gc_set_foreground(gc, &color); | 654 | gdk_gc_set_foreground(gc, &color); |
| 655 | } | 655 | } |
| 656 | 656 | ||
| 657 | static void draw_event_label(struct graph_info *ginfo, gint cpu, | ||
| 658 | gint event_id, gint pid, | ||
| 659 | gint p1, gint p2, gint p3, | ||
| 660 | gint width_16, PangoFontDescription *font) | ||
| 661 | { | ||
| 662 | struct event *event; | ||
| 663 | PangoLayout *layout; | ||
| 664 | struct trace_seq s; | ||
| 665 | gint text_width; | ||
| 666 | gint text_height; | ||
| 667 | gint x, y; | ||
| 668 | |||
| 669 | |||
| 670 | /* No room to print */ | ||
| 671 | if (((p3 - p2) < width_16 / 2 || | ||
| 672 | (p2 - p1) < width_16 / 2)) | ||
| 673 | return; | ||
| 674 | |||
| 675 | /* Check if we can show some data */ | ||
| 676 | |||
| 677 | event = pevent_data_event_from_type(ginfo->pevent, event_id); | ||
| 678 | |||
| 679 | trace_seq_init(&s); | ||
| 680 | trace_seq_printf(&s, "%s-%d\n%s\n", | ||
| 681 | pevent_data_comm_from_pid(ginfo->pevent, pid), | ||
| 682 | pid, event->name); | ||
| 683 | |||
| 684 | layout = gtk_widget_create_pango_layout(ginfo->draw, s.buffer); | ||
| 685 | pango_layout_set_font_description(layout, font); | ||
| 686 | |||
| 687 | pango_layout_get_pixel_size(layout, &text_width, &text_height); | ||
| 688 | |||
| 689 | if ((p3 - p2) < text_width / 2 || | ||
| 690 | (p2 - p1) < text_width / 2) { | ||
| 691 | g_object_unref(layout); | ||
| 692 | return; | ||
| 693 | } | ||
| 694 | |||
| 695 | x = p2 - text_width / 2; | ||
| 696 | y = (CPU_TOP(cpu) - text_height + 5); | ||
| 697 | gdk_draw_layout(ginfo->curr_pixmap, ginfo->draw->style->black_gc, | ||
| 698 | x, y, layout); | ||
| 699 | |||
| 700 | |||
| 701 | gdk_draw_line(ginfo->curr_pixmap, ginfo->draw->style->black_gc, | ||
| 702 | p2, CPU_TOP(cpu) - 5, p2, CPU_TOP(cpu) - 1); | ||
| 703 | |||
| 704 | g_object_unref(layout); | ||
| 705 | } | ||
| 706 | |||
| 657 | static void draw_cpu(struct graph_info *ginfo, gint cpu, | 707 | static void draw_cpu(struct graph_info *ginfo, gint cpu, |
| 658 | gint new_width) | 708 | gint new_width) |
| 659 | { | 709 | { |
| 710 | static PangoFontDescription *font; | ||
| 711 | PangoLayout *layout; | ||
| 660 | gint height = CPU_MIDDLE(cpu); | 712 | gint height = CPU_MIDDLE(cpu); |
| 661 | struct record *record; | 713 | struct record *record; |
| 662 | static GdkGC *gc; | 714 | static GdkGC *gc; |
| 715 | static gint width_16; | ||
| 663 | guint64 ts; | 716 | guint64 ts; |
| 664 | gint last_pid = -1; | 717 | gint last_pid = -1; |
| 665 | gint last_x = 0; | 718 | gint last_x = 0; |
| 666 | gint pid; | 719 | gint pid; |
| 667 | gint x; | 720 | gint x; |
| 721 | gint p1 = 0, p2 = 0, p3 = 0; | ||
| 722 | gint last_event_id = 0; | ||
| 723 | gint event_id; | ||
| 724 | |||
| 725 | /* Calculate the size of 16 characters */ | ||
| 726 | if (!width_16) { | ||
| 727 | gchar buf[17]; | ||
| 728 | gint text_height; | ||
| 729 | |||
| 730 | memset(buf, 'a', 16); | ||
| 731 | buf[16] = 0; | ||
| 732 | |||
| 733 | font = pango_font_description_from_string("Sans 8"); | ||
| 734 | layout = gtk_widget_create_pango_layout(ginfo->draw, buf); | ||
| 735 | pango_layout_set_font_description(layout, font); | ||
| 736 | pango_layout_get_pixel_size(layout, &width_16, &text_height); | ||
| 737 | g_object_unref(layout); | ||
| 738 | } | ||
| 668 | 739 | ||
| 669 | if (!gc) | 740 | if (!gc) |
| 670 | gc = gdk_gc_new(ginfo->draw->window); | 741 | gc = gdk_gc_new(ginfo->draw->window); |
| @@ -689,6 +760,8 @@ static void draw_cpu(struct graph_info *ginfo, gint cpu, | |||
| 689 | if (!check_sched_switch(ginfo, record, &pid, NULL)) | 760 | if (!check_sched_switch(ginfo, record, &pid, NULL)) |
| 690 | pid = pevent_data_pid(ginfo->pevent, record); | 761 | pid = pevent_data_pid(ginfo->pevent, record); |
| 691 | 762 | ||
| 763 | event_id = pevent_data_type(ginfo->pevent, record); | ||
| 764 | |||
| 692 | if (last_pid != pid) { | 765 | if (last_pid != pid) { |
| 693 | 766 | ||
| 694 | if (last_pid < 0) | 767 | if (last_pid < 0) |
| @@ -711,9 +784,29 @@ static void draw_cpu(struct graph_info *ginfo, gint cpu, | |||
| 711 | 784 | ||
| 712 | gdk_draw_line(ginfo->curr_pixmap, gc, // ginfo->draw->style->black_gc, | 785 | gdk_draw_line(ginfo->curr_pixmap, gc, // ginfo->draw->style->black_gc, |
| 713 | x, CPU_TOP(cpu), x, CPU_BOTTOM(cpu)); | 786 | x, CPU_TOP(cpu), x, CPU_BOTTOM(cpu)); |
| 787 | |||
| 788 | /* Figure out if we can show the text for the previous record */ | ||
| 789 | |||
| 790 | p3 = x; | ||
| 791 | |||
| 792 | /* Make sure p2 will be non-zero the next iteration */ | ||
| 793 | if (!p3) | ||
| 794 | p3 = 1; | ||
| 795 | |||
| 796 | /* first record, continue */ | ||
| 797 | if (p2) | ||
| 798 | draw_event_label(ginfo, cpu, last_event_id, last_pid, | ||
| 799 | p1, p2, p3, width_16, font); | ||
| 800 | |||
| 801 | p1 = p2; | ||
| 802 | p2 = p3; | ||
| 803 | last_event_id = event_id; | ||
| 714 | free(record); | 804 | free(record); |
| 715 | } | 805 | } |
| 716 | 806 | ||
| 807 | draw_event_label(ginfo, cpu, last_event_id, last_pid, | ||
| 808 | p1, p2, ginfo->draw_width, width_16, font); | ||
| 809 | |||
| 717 | 810 | ||
| 718 | if (last_pid > 0) { | 811 | if (last_pid > 0) { |
| 719 | x = ginfo->draw_width; | 812 | x = ginfo->draw_width; |
