From c5af1f95c63f8b380dfbf11b54733ec5b8626303 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Thu, 6 Jul 2023 11:18:46 -0700 Subject: [PATCH] libsysprof-gtk: allow tracks to format values for display --- src/libsysprof-gtk/sysprof-session-discover.c | 25 ++++++++++++++++++- src/libsysprof-gtk/sysprof-session-private.h | 2 ++ src/libsysprof-gtk/sysprof-session.c | 8 +++++- src/libsysprof-gtk/sysprof-track-private.h | 8 +++--- src/libsysprof-gtk/sysprof-track.c | 24 ++++++++++++++++++ src/libsysprof-gtk/sysprof-tracks-view.c | 6 +++-- 6 files changed, 66 insertions(+), 7 deletions(-) diff --git a/src/libsysprof-gtk/sysprof-session-discover.c b/src/libsysprof-gtk/sysprof-session-discover.c index bfa92809..a933938b 100644 --- a/src/libsysprof-gtk/sysprof-session-discover.c +++ b/src/libsysprof-gtk/sysprof-session-discover.c @@ -38,6 +38,7 @@ typedef enum _LineFlags LINE_FLAGS_NO_SPLINE = 1 << 1, LINE_FLAGS_FILL = 1 << 2, LINE_FLAGS_IGNORE_RANGE_ON_SUBCHART = 1 << 3, + LINE_FLAGS_FORMAT_MEMORY = 1 << 4, } LineFlags; typedef struct _SysprofTrackSamples @@ -102,7 +103,8 @@ static const SysprofTrackCounter discovery_counters[] = { { N_("Memory"), "Memory", "Used", NULL, NULL, - LINE_FLAGS_FILL, + .0, .0, + LINE_FLAGS_FILL | LINE_FLAGS_FORMAT_MEMORY, }, { N_("FPS"), "gtk", "fps", "gtk", "*", @@ -383,6 +385,15 @@ create_chart_for_counters (SysprofTrack *track, return GTK_WIDGET (chart); } +static char * +format_value_as_memory (SysprofTrack *track, + SysprofDocumentCounterValue *value, + gpointer user_data) +{ + gint64 v = sysprof_document_counter_value_get_value_int64 (value); + return g_format_size (v); +} + static void sysprof_session_discover_counters (SysprofSession *self, SysprofDocument *document, @@ -421,6 +432,12 @@ sysprof_session_discover_counters (SysprofSession *self, "title", info->track_name, NULL); + if ((info->flags & LINE_FLAGS_FORMAT_MEMORY) != 0) + g_signal_connect (track, + "format-item-for-display", + G_CALLBACK (format_value_as_memory), + NULL); + g_signal_connect_data (track, "create-chart", G_CALLBACK (create_chart_for_counters), @@ -453,6 +470,12 @@ sysprof_session_discover_counters (SysprofSession *self, "title", sysprof_document_counter_get_name (subtrack_counter), NULL); + if ((info->flags & LINE_FLAGS_FORMAT_MEMORY) != 0) + g_signal_connect (subtrack, + "format-item-for-display", + G_CALLBACK (format_value_as_memory), + NULL); + g_signal_connect_data (subtrack, "create-chart", G_CALLBACK (create_chart_for_counters), diff --git a/src/libsysprof-gtk/sysprof-session-private.h b/src/libsysprof-gtk/sysprof-session-private.h index 561f1cc5..9fbbd4b5 100644 --- a/src/libsysprof-gtk/sysprof-session-private.h +++ b/src/libsysprof-gtk/sysprof-session-private.h @@ -21,6 +21,7 @@ #pragma once #include "sysprof-session.h" +#include "sysprof-track.h" G_BEGIN_DECLS @@ -28,6 +29,7 @@ void _sysprof_session_discover_tracks (SysprofSession *session, SysprofDocument *document, GListStore *tracks); char *_sysprof_session_describe (SysprofSession *self, + SysprofTrack *track, gpointer item); G_END_DECLS diff --git a/src/libsysprof-gtk/sysprof-session.c b/src/libsysprof-gtk/sysprof-session.c index 8238f3f4..2ec38d0a 100644 --- a/src/libsysprof-gtk/sysprof-session.c +++ b/src/libsysprof-gtk/sysprof-session.c @@ -23,7 +23,7 @@ #include #include "sysprof-session-private.h" -#include "sysprof-track.h" +#include "sysprof-track-private.h" #include "sysprof-value-axis.h" struct _SysprofSession @@ -420,13 +420,19 @@ append_time_string (GString *str, char * _sysprof_session_describe (SysprofSession *self, + SysprofTrack *track, gpointer item) { + g_autofree char *text = NULL; + g_return_val_if_fail (SYSPROF_IS_SESSION (self), NULL); if (self->document == NULL) return NULL; + if ((text = _sysprof_track_format_item_for_display (track, item))) + return g_steal_pointer (&text); + if (SYSPROF_IS_DOCUMENT_MARK (item)) { SysprofDocumentMark *mark = item; diff --git a/src/libsysprof-gtk/sysprof-track-private.h b/src/libsysprof-gtk/sysprof-track-private.h index cae00540..fdc61c75 100644 --- a/src/libsysprof-gtk/sysprof-track-private.h +++ b/src/libsysprof-gtk/sysprof-track-private.h @@ -24,8 +24,10 @@ G_BEGIN_DECLS -GtkWidget *_sysprof_track_create_chart (SysprofTrack *track); -void _sysprof_track_add_subtrack (SysprofTrack *self, - SysprofTrack *subtrack); +GtkWidget *_sysprof_track_create_chart (SysprofTrack *self); +void _sysprof_track_add_subtrack (SysprofTrack *self, + SysprofTrack *subtrack); +char *_sysprof_track_format_item_for_display (SysprofTrack *self, + gpointer item); G_END_DECLS diff --git a/src/libsysprof-gtk/sysprof-track.c b/src/libsysprof-gtk/sysprof-track.c index 9e902008..1a91a4eb 100644 --- a/src/libsysprof-gtk/sysprof-track.c +++ b/src/libsysprof-gtk/sysprof-track.c @@ -42,6 +42,7 @@ enum { enum { CREATE_CHART, + FORMAT_ITEM_FOR_DISPLAY, N_SIGNALS }; @@ -160,6 +161,15 @@ sysprof_track_class_init (SysprofTrackClass *klass) g_signal_accumulator_first_wins, NULL, NULL, GTK_TYPE_WIDGET, 0); + + signals[FORMAT_ITEM_FOR_DISPLAY] = + g_signal_new ("format-item-for-display", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + g_signal_accumulator_first_wins, NULL, + NULL, + G_TYPE_STRING, 1, G_TYPE_OBJECT); } static void @@ -245,3 +255,17 @@ _sysprof_track_create_chart (SysprofTrack *self) return ret; } + +char * +_sysprof_track_format_item_for_display (SysprofTrack *self, + gpointer item) +{ + char *ret = NULL; + + g_return_val_if_fail (SYSPROF_IS_TRACK (self), NULL); + g_return_val_if_fail (G_IS_OBJECT (item), NULL); + + g_signal_emit (self, signals[FORMAT_ITEM_FOR_DISPLAY], 0, item, &ret); + + return ret; +} diff --git a/src/libsysprof-gtk/sysprof-tracks-view.c b/src/libsysprof-gtk/sysprof-tracks-view.c index 1f2fe29b..1fb1dae4 100644 --- a/src/libsysprof-gtk/sysprof-tracks-view.c +++ b/src/libsysprof-gtk/sysprof-tracks-view.c @@ -94,9 +94,11 @@ set_motion (SysprofTracksView *self, if (pick != NULL) { SysprofChartLayer *layer = SYSPROF_CHART_LAYER (gtk_widget_get_ancestor (pick, SYSPROF_TYPE_CHART_LAYER)); + SysprofTrackView *track_view = SYSPROF_TRACK_VIEW (gtk_widget_get_ancestor (pick, SYSPROF_TYPE_TRACK_VIEW)); - if (layer != NULL) + if (layer != NULL && track_view != NULL) { + SysprofTrack *track = sysprof_track_view_get_track (track_view); g_autoptr(GObject) item = NULL; g_autofree char *text = NULL; double layer_x; @@ -107,7 +109,7 @@ set_motion (SysprofTracksView *self, x, y, &layer_x, &layer_y); if ((item = sysprof_chart_layer_lookup_item (layer, layer_x, layer_y))) - text = _sysprof_session_describe (self->session, item); + text = _sysprof_session_describe (self->session, track, item); gtk_label_set_label (self->informative, text);