diff --git a/src/libsysprof-analyze/sysprof-document-frame-private.h b/src/libsysprof-analyze/sysprof-document-frame-private.h index a7e0e5b2..b743b549 100644 --- a/src/libsysprof-analyze/sysprof-document-frame-private.h +++ b/src/libsysprof-analyze/sysprof-document-frame-private.h @@ -41,6 +41,7 @@ struct _SysprofDocumentFrameClass { GObjectClass parent_class; const char *type_name; + char *(*dup_tooltip) (SysprofDocumentFrame *self); }; SysprofDocumentFrame *_sysprof_document_frame_new (GMappedFile *mapped, diff --git a/src/libsysprof-analyze/sysprof-document-frame.c b/src/libsysprof-analyze/sysprof-document-frame.c index b47b258e..c191a35c 100644 --- a/src/libsysprof-analyze/sysprof-document-frame.c +++ b/src/libsysprof-analyze/sysprof-document-frame.c @@ -47,12 +47,24 @@ enum { PROP_PID, PROP_TIME, PROP_TIME_OFFSET, + PROP_TIME_STRING, + PROP_TOOLTIP, PROP_TYPE_NAME, N_PROPS }; static GParamSpec *properties[N_PROPS]; +static char * +sysprof_document_frame_real_dup_tooltip (SysprofDocumentFrame *self) +{ + g_autofree char *time_string = sysprof_document_frame_dup_time_string (self); + + return g_strdup_printf ("%s: %s", + time_string, + SYSPROF_DOCUMENT_FRAME_GET_CLASS (self)->type_name); +} + static const char * sysprof_document_frame_get_type_name (SysprofDocumentFrame *self) { @@ -98,6 +110,14 @@ sysprof_document_frame_get_property (GObject *object, g_value_set_int64 (value, sysprof_document_frame_get_time_offset (self)); break; + case PROP_TIME_STRING: + g_value_take_string (value, sysprof_document_frame_dup_time_string (self)); + break; + + case PROP_TOOLTIP: + g_value_take_string (value, sysprof_document_frame_dup_tooltip (self)); + break; + case PROP_TYPE_NAME: g_value_set_static_string (value, sysprof_document_frame_get_type_name (self)); break; @@ -116,6 +136,7 @@ sysprof_document_frame_class_init (SysprofDocumentFrameClass *klass) object_class->get_property = sysprof_document_frame_get_property; klass->type_name = N_("Frame"); + klass->dup_tooltip = sysprof_document_frame_real_dup_tooltip; properties[PROP_CPU] = g_param_spec_int ("cpu", NULL, NULL, @@ -145,11 +166,21 @@ sysprof_document_frame_class_init (SysprofDocumentFrameClass *klass) 0, (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + properties[PROP_TIME_STRING] = + g_param_spec_string ("time-string", NULL, NULL, + NULL, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + properties[PROP_TYPE_NAME] = g_param_spec_string ("type-name", NULL, NULL, NULL, (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + properties[PROP_TOOLTIP] = + g_param_spec_string ("tooltip", NULL, NULL, + NULL, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_properties (object_class, N_PROPS, properties); } @@ -282,3 +313,51 @@ sysprof_document_frame_equal (const SysprofDocumentFrame *a, { return a->frame == b->frame; } + +/** + * sysprof_document_frame_dup_time_string: + * @self: a #SysprofDocumentFrame + * + * Gets the time formatted as a string such as `00:00:00.1234`. + * + * Returns: (transfer full): a new string + */ +char * +sysprof_document_frame_dup_time_string (SysprofDocumentFrame *self) +{ + int hours; + int minutes; + int seconds; + double time; + + g_return_val_if_fail (SYSPROF_IS_DOCUMENT_FRAME (self), NULL); + + time = self->time_offset / (double)SYSPROF_NSEC_PER_SEC; + + hours = time / (60 * 60); + time -= hours * (60 * 60); + + minutes = time / 60; + time -= minutes * 60; + + seconds = time / SYSPROF_NSEC_PER_SEC; + time -= seconds * SYSPROF_NSEC_PER_SEC; + + return g_strdup_printf ("%02d:%02d:%02d.%04d", hours, minutes, seconds, (int)(time * 10000)); +} + +/** + * sysprof_document_frame_dup_tooltip: + * @self: a #SysprofDocumentFrame + * + * Returns a new string containing suggested tooltip text. + * + * Returns: (transfer full): a string + */ +char * +sysprof_document_frame_dup_tooltip (SysprofDocumentFrame *self) +{ + g_return_val_if_fail (SYSPROF_IS_DOCUMENT_FRAME (self), NULL); + + return SYSPROF_DOCUMENT_FRAME_GET_CLASS (self)->dup_tooltip (self); +} diff --git a/src/libsysprof-analyze/sysprof-document-frame.h b/src/libsysprof-analyze/sysprof-document-frame.h index 279219a1..57662960 100644 --- a/src/libsysprof-analyze/sysprof-document-frame.h +++ b/src/libsysprof-analyze/sysprof-document-frame.h @@ -35,18 +35,22 @@ typedef struct _SysprofDocumentFrame SysprofDocumentFrame; typedef struct _SysprofDocumentFrameClass SysprofDocumentFrameClass; SYSPROF_AVAILABLE_IN_ALL -GType sysprof_document_frame_get_type (void) G_GNUC_CONST; +GType sysprof_document_frame_get_type (void) G_GNUC_CONST; SYSPROF_AVAILABLE_IN_ALL -int sysprof_document_frame_get_cpu (SysprofDocumentFrame *self); +int sysprof_document_frame_get_cpu (SysprofDocumentFrame *self); SYSPROF_AVAILABLE_IN_ALL -int sysprof_document_frame_get_pid (SysprofDocumentFrame *self); +int sysprof_document_frame_get_pid (SysprofDocumentFrame *self); SYSPROF_AVAILABLE_IN_ALL -gint64 sysprof_document_frame_get_time (SysprofDocumentFrame *self); +gint64 sysprof_document_frame_get_time (SysprofDocumentFrame *self); SYSPROF_AVAILABLE_IN_ALL -gint64 sysprof_document_frame_get_time_offset (SysprofDocumentFrame *self); +gint64 sysprof_document_frame_get_time_offset (SysprofDocumentFrame *self); SYSPROF_AVAILABLE_IN_ALL -gboolean sysprof_document_frame_equal (const SysprofDocumentFrame *a, - const SysprofDocumentFrame *b); +gboolean sysprof_document_frame_equal (const SysprofDocumentFrame *a, + const SysprofDocumentFrame *b); +SYSPROF_AVAILABLE_IN_ALL +char *sysprof_document_frame_dup_tooltip (SysprofDocumentFrame *self); +SYSPROF_AVAILABLE_IN_ALL +char *sysprof_document_frame_dup_time_string (SysprofDocumentFrame *self); G_DEFINE_AUTOPTR_CLEANUP_FUNC (SysprofDocumentFrame, g_object_unref) diff --git a/src/libsysprof-analyze/sysprof-document-mark.c b/src/libsysprof-analyze/sysprof-document-mark.c index 712fd14d..66698fe6 100644 --- a/src/libsysprof-analyze/sysprof-document-mark.c +++ b/src/libsysprof-analyze/sysprof-document-mark.c @@ -50,6 +50,23 @@ G_DEFINE_FINAL_TYPE (SysprofDocumentMark, sysprof_document_mark, SYSPROF_TYPE_DO static GParamSpec *properties [N_PROPS]; +static char * +sysprof_document_mark_dup_tooltip (SysprofDocumentFrame *frame) +{ + SysprofDocumentMark *self = (SysprofDocumentMark *)frame; + g_autofree char *time_string = NULL; + + g_assert (SYSPROF_IS_DOCUMENT_MARK (self)); + + time_string = sysprof_document_frame_dup_time_string (SYSPROF_DOCUMENT_FRAME (self)); + + return g_strdup_printf ("%s: %s: %s: %s", + time_string, + sysprof_document_mark_get_group (self), + sysprof_document_mark_get_name (self), + sysprof_document_mark_get_message (self)); +} + static void sysprof_document_mark_get_property (GObject *object, guint prop_id, @@ -94,6 +111,7 @@ sysprof_document_mark_class_init (SysprofDocumentMarkClass *klass) object_class->get_property = sysprof_document_mark_get_property; document_frame_class->type_name = N_("Mark"); + document_frame_class->dup_tooltip = sysprof_document_mark_dup_tooltip; properties [PROP_DURATION] = g_param_spec_int64 ("duration", NULL, NULL,