diff --git a/src/sysprof/style.css b/src/sysprof/style.css
index 627e0ec0..9ea82c6d 100644
--- a/src/sysprof/style.css
+++ b/src/sysprof/style.css
@@ -91,3 +91,7 @@ timescrubber timecode {
font-feature-settings: 'tnum';
font-size: .8em;
}
+
+flamegraph {
+ font-size: 10px;
+}
diff --git a/src/sysprof/sysprof-flame-graph.c b/src/sysprof/sysprof-flame-graph.c
index e26c3a1f..cc1b9b5a 100644
--- a/src/sysprof/sysprof-flame-graph.c
+++ b/src/sysprof/sysprof-flame-graph.c
@@ -28,6 +28,8 @@
#include "sysprof-flame-graph.h"
+#define ROW_HEIGHT 14
+
struct _SysprofFlameGraph
{
GtkWidget parent_instance;
@@ -59,9 +61,9 @@ static void
sysprof_flame_graph_snapshot_node (GtkSnapshot *snapshot,
SysprofCallgraphNode *node,
const graphene_rect_t *area,
- double row_height,
double min_width,
const GdkRGBA *default_color,
+ PangoLayout *layout,
int depth)
{
SysprofCallgraphCategory category;
@@ -84,9 +86,20 @@ sysprof_flame_graph_snapshot_node (GtkSnapshot *snapshot,
gtk_snapshot_append_color (snapshot,
color,
&GRAPHENE_RECT_INIT (area->origin.x,
- area->origin.y + area->size.height - row_height,
+ area->origin.y + area->size.height - ROW_HEIGHT - 1,
area->size.width,
- row_height));
+ ROW_HEIGHT));
+
+ if (area->size.width > ROW_HEIGHT)
+ {
+ pango_layout_set_text (layout, node->summary->symbol->name, -1);
+ pango_layout_set_width (layout, PANGO_SCALE * area->size.width);
+
+ gtk_snapshot_save (snapshot);
+ gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (round (area->origin.x), round (area->origin.y) + area->size.height - ROW_HEIGHT));
+ gtk_snapshot_append_layout (snapshot, layout, &(GdkRGBA) {1,1,1,1});
+ gtk_snapshot_restore (snapshot);
+ }
if (node->children != NULL)
{
@@ -98,7 +111,7 @@ sysprof_flame_graph_snapshot_node (GtkSnapshot *snapshot,
child_area.origin.x = area->origin.x;
child_area.origin.y = area->origin.y;
- child_area.size.height = area->size.height - row_height;
+ child_area.size.height = area->size.height - ROW_HEIGHT - 1;
for (SysprofCallgraphNode *child = node->children; child; child = child->next)
{
@@ -128,9 +141,9 @@ sysprof_flame_graph_snapshot_node (GtkSnapshot *snapshot,
sysprof_flame_graph_snapshot_node (snapshot,
child,
&child_area,
- row_height,
min_width,
default_color,
+ layout,
depth + 1);
child_area.origin.x += width;
@@ -144,7 +157,7 @@ sysprof_flame_graph_snapshot (GtkWidget *widget,
{
SysprofFlameGraph *self = (SysprofFlameGraph *)widget;
SysprofColorIter iter;
- double row_height;
+ PangoLayout *layout;
g_assert (SYSPROF_IS_FLAME_GRAPH (self));
g_assert (GTK_IS_SNAPSHOT (snapshot));
@@ -153,17 +166,48 @@ sysprof_flame_graph_snapshot (GtkWidget *widget,
return;
sysprof_color_iter_init (&iter);
- row_height = gtk_widget_get_height (widget) / (double)self->callgraph->height;
-
+ layout = gtk_widget_create_pango_layout (widget, NULL);
+ pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END);
sysprof_flame_graph_snapshot_node (snapshot,
&self->callgraph->root,
&GRAPHENE_RECT_INIT (0, 0,
gtk_widget_get_width (widget),
gtk_widget_get_height (widget)),
- row_height,
1. / (double)gtk_widget_get_scale_factor (widget),
sysprof_color_iter_next (&iter),
+ layout,
0);
+ g_object_unref (layout);
+}
+
+static void
+sysprof_flame_graph_measure (GtkWidget *widget,
+ GtkOrientation orientation,
+ int for_size,
+ int *minimum,
+ int *natural,
+ int *minimum_baseline,
+ int *natural_baseline)
+{
+ SysprofFlameGraph *self = (SysprofFlameGraph *)widget;
+
+ g_assert (SYSPROF_IS_FLAME_GRAPH (self));
+
+ *minimum_baseline = -1;
+ *natural_baseline = -1;
+
+ if (orientation == GTK_ORIENTATION_VERTICAL)
+ {
+ if (self->callgraph != NULL)
+ *minimum = ROW_HEIGHT * self->callgraph->height + self->callgraph->height + 1;
+
+ *natural = *minimum;
+ }
+ else
+ {
+ *minimum = 1;
+ *natural = 500;
+ }
}
static void
@@ -225,6 +269,7 @@ sysprof_flame_graph_class_init (SysprofFlameGraphClass *klass)
object_class->set_property = sysprof_flame_graph_set_property;
widget_class->snapshot = sysprof_flame_graph_snapshot;
+ widget_class->measure = sysprof_flame_graph_measure;
properties[PROP_CALLGRAPH] =
g_param_spec_object ("callgraph", NULL, NULL,
@@ -232,11 +277,14 @@ sysprof_flame_graph_class_init (SysprofFlameGraphClass *klass)
(G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
g_object_class_install_properties (object_class, N_PROPS, properties);
+
+ gtk_widget_class_set_css_name (widget_class, "flamegraph");
}
static void
sysprof_flame_graph_init (SysprofFlameGraph *self)
{
+ gtk_widget_add_css_class (GTK_WIDGET (self), "view");
}
GtkWidget *
@@ -263,6 +311,6 @@ sysprof_flame_graph_set_callgraph (SysprofFlameGraph *self,
if (g_set_object (&self->callgraph, callgraph))
{
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_CALLGRAPH]);
- gtk_widget_queue_draw (GTK_WIDGET (self));
+ gtk_widget_queue_resize (GTK_WIDGET (self));
}
}
diff --git a/src/sysprof/sysprof-samples-section.ui b/src/sysprof/sysprof-samples-section.ui
index 092d2374..13594888 100644
--- a/src/sysprof/sysprof-samples-section.ui
+++ b/src/sysprof/sysprof-samples-section.ui
@@ -154,10 +154,15 @@
flamegraph-symbolic
Flamegraph
-