diff --git a/lib/resources/ui/sp-visualizer-view.ui b/lib/resources/ui/sp-visualizer-view.ui
index 8dc003bc..638174ef 100644
--- a/lib/resources/ui/sp-visualizer-view.ui
+++ b/lib/resources/ui/sp-visualizer-view.ui
@@ -12,11 +12,25 @@
-
+
+ 0.0
+ 0.0
+ 0.0
+
diff --git a/lib/sp-visualizer-view.c b/lib/sp-visualizer-view.c
index 39f90f33..cb046dbc 100644
--- a/lib/sp-visualizer-view.c
+++ b/lib/sp-visualizer-view.c
@@ -29,10 +29,11 @@
typedef struct
{
SpCaptureReader *reader;
+ SpZoomManager *zoom_manager;
SpVisualizerList *list;
+ GtkAdjustment *scroll_adjustment;
SpVisualizerTicks *ticks;
- SpZoomManager *zoom_manager;
} SpVisualizerViewPrivate;
enum {
@@ -84,6 +85,41 @@ sp_visualizer_view_row_removed (SpVisualizerView *self,
g_signal_emit (self, signals [VISUALIZER_REMOVED], 0, widget);
}
+static void
+sp_visualizer_view_set_time_range (SpVisualizerView *self,
+ gint64 begin_time,
+ gint64 end_time)
+{
+ SpVisualizerViewPrivate *priv = sp_visualizer_view_get_instance_private (self);
+
+ g_assert (SP_IS_VISUALIZER_VIEW (self));
+
+ if (begin_time < end_time)
+ {
+ gint64 tmp = begin_time;
+ begin_time = end_time;
+ end_time = tmp;
+ }
+
+ sp_visualizer_list_set_time_range (priv->list, begin_time, end_time);
+ sp_visualizer_ticks_set_time_range (priv->ticks, begin_time, end_time);
+}
+
+static void
+sp_visualizer_view_adjustment_value_changed (SpVisualizerView *self,
+ GtkAdjustment *adjustment)
+{
+ gint64 begin_time;
+ gint64 end_time;
+
+ g_assert (SP_IS_VISUALIZER_VIEW (self));
+ g_assert (GTK_IS_ADJUSTMENT (adjustment));
+
+ begin_time = gtk_adjustment_get_value (adjustment);
+ end_time = begin_time + gtk_adjustment_get_page_size (adjustment);
+ sp_visualizer_view_set_time_range (self, begin_time, end_time);
+}
+
static void
sp_visualizer_view_notify_zoom (SpVisualizerView *self,
GParamSpec *pspec,
@@ -104,8 +140,8 @@ sp_visualizer_view_notify_zoom (SpVisualizerView *self,
end_time = begin_time + (NSEC_PER_SEC * 60.0 / zoom);
- sp_visualizer_list_set_time_range (priv->list, begin_time, end_time);
- sp_visualizer_ticks_set_time_range (priv->ticks, begin_time, end_time);
+ sp_visualizer_view_set_time_range (self, begin_time, end_time);
+ gtk_adjustment_set_page_size (priv->scroll_adjustment, end_time - begin_time);
}
static void
@@ -210,6 +246,7 @@ sp_visualizer_view_class_init (SpVisualizerViewClass *klass)
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/sysprof/ui/sp-visualizer-view.ui");
gtk_widget_class_bind_template_child_private (widget_class, SpVisualizerView, list);
+ gtk_widget_class_bind_template_child_private (widget_class, SpVisualizerView, scroll_adjustment);
gtk_widget_class_bind_template_child_private (widget_class, SpVisualizerView, ticks);
gtk_widget_class_set_css_name (widget_class, "visualizers");
@@ -233,6 +270,12 @@ sp_visualizer_view_init (SpVisualizerView *self)
G_CALLBACK (sp_visualizer_view_row_removed),
self,
G_CONNECT_SWAPPED);
+
+ g_signal_connect_object (priv->scroll_adjustment,
+ "value-changed",
+ G_CALLBACK (sp_visualizer_view_adjustment_value_changed),
+ self,
+ G_CONNECT_SWAPPED);
}
/**
@@ -261,9 +304,24 @@ sp_visualizer_view_set_reader (SpVisualizerView *self,
if (priv->reader != reader)
{
g_clear_pointer (&priv->reader, sp_capture_reader_unref);
- priv->reader = sp_capture_reader_ref (reader);
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_READER]);
sp_visualizer_list_set_reader (priv->list, reader);
+ if (reader != NULL)
+ {
+ gint64 begin_time = 0;
+ gint64 end_time = 0;
+
+ priv->reader = sp_capture_reader_ref (reader);
+ begin_time = sp_capture_reader_get_start_time (reader);
+ end_time = sp_capture_reader_get_end_time (reader);
+
+ g_object_set (priv->scroll_adjustment,
+ "lower", (gdouble)begin_time,
+ "upper", (gdouble)end_time,
+ "value", (gdouble)begin_time,
+ NULL);
+ }
+
if (priv->zoom_manager != NULL)
sp_visualizer_view_notify_zoom (self, NULL, priv->zoom_manager);
}