Blame src/graphing/dzl-cpu-graph.c

Packit Service c6b782
/* dzl-cpu-graph.c
Packit Service c6b782
 *
Packit Service c6b782
 * Copyright (C) 2015 Christian Hergert <christian@hergert.me>
Packit Service c6b782
 *
Packit Service c6b782
 * This file is free software; you can redistribute it and/or modify it
Packit Service c6b782
 * under the terms of the GNU Lesser General Public License as
Packit Service c6b782
 * published by the Free Software Foundation; either version 3 of the
Packit Service c6b782
 * License, or (at your option) any later version.
Packit Service c6b782
 *
Packit Service c6b782
 * This file is distributed in the hope that it will be useful, but
Packit Service c6b782
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service c6b782
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service c6b782
 * Lesser General Public License for more details.
Packit Service c6b782
 *
Packit Service c6b782
 * You should have received a copy of the GNU General Public License
Packit Service c6b782
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service c6b782
 */
Packit Service c6b782
Packit Service c6b782
#include <glib/gi18n.h>
Packit Service c6b782
Packit Service c6b782
#include "config.h"
Packit Service c6b782
Packit Service c6b782
#include "dzl-cpu-graph.h"
Packit Service c6b782
#include "dzl-cpu-model.h"
Packit Service c6b782
#include "dzl-graph-line-renderer.h"
Packit Service c6b782
Packit Service c6b782
struct _DzlCpuGraph
Packit Service c6b782
{
Packit Service c6b782
  DzlGraphView parent_instance;
Packit Service c6b782
Packit Service c6b782
  gint64 timespan;
Packit Service c6b782
  guint  max_samples;
Packit Service c6b782
};
Packit Service c6b782
Packit Service c6b782
G_DEFINE_TYPE (DzlCpuGraph, dzl_cpu_graph, DZL_TYPE_GRAPH_VIEW)
Packit Service c6b782
Packit Service c6b782
enum {
Packit Service c6b782
  PROP_0,
Packit Service c6b782
  PROP_MAX_SAMPLES,
Packit Service c6b782
  PROP_TIMESPAN,
Packit Service c6b782
  LAST_PROP
Packit Service c6b782
};
Packit Service c6b782
Packit Service c6b782
static GParamSpec *properties[LAST_PROP];
Packit Service c6b782
Packit Service c6b782
static gchar *colors[] = {
Packit Service c6b782
  "#73d216",
Packit Service c6b782
  "#f57900",
Packit Service c6b782
  "#3465a4",
Packit Service c6b782
  "#ef2929",
Packit Service c6b782
  "#75507b",
Packit Service c6b782
  "#ce5c00",
Packit Service c6b782
  "#c17d11",
Packit Service c6b782
  "#cc0000",
Packit Service c6b782
};
Packit Service c6b782
Packit Service c6b782
GtkWidget *
Packit Service c6b782
dzl_cpu_graph_new (void)
Packit Service c6b782
{
Packit Service c6b782
  return g_object_new (DZL_TYPE_CPU_GRAPH, NULL);
Packit Service c6b782
}
Packit Service c6b782
Packit Service c6b782
static void
Packit Service c6b782
dzl_cpu_graph_constructed (GObject *object)
Packit Service c6b782
{
Packit Service c6b782
  static DzlCpuModel *model;
Packit Service c6b782
  DzlCpuGraph *self = (DzlCpuGraph *)object;
Packit Service c6b782
  guint n_columns;
Packit Service c6b782
  guint i;
Packit Service c6b782
Packit Service c6b782
  G_OBJECT_CLASS (dzl_cpu_graph_parent_class)->constructed (object);
Packit Service c6b782
Packit Service c6b782
  /*
Packit Service c6b782
   * Create a model, but allow it to be destroyed after the last
Packit Service c6b782
   * graph releases it. We will recreate it on demand.
Packit Service c6b782
   */
Packit Service c6b782
  if (model == NULL)
Packit Service c6b782
    {
Packit Service c6b782
      model = g_object_new (DZL_TYPE_CPU_MODEL,
Packit Service c6b782
                            "timespan", self->timespan,
Packit Service c6b782
                            "max-samples", self->max_samples + 1,
Packit Service c6b782
                            NULL);
Packit Service c6b782
      g_object_add_weak_pointer (G_OBJECT (model), (gpointer *)&model);
Packit Service c6b782
      dzl_graph_view_set_model (DZL_GRAPH_VIEW (self), DZL_GRAPH_MODEL (model));
Packit Service c6b782
      g_object_unref (model);
Packit Service c6b782
    }
Packit Service c6b782
  else
Packit Service c6b782
    {
Packit Service c6b782
      dzl_graph_view_set_model (DZL_GRAPH_VIEW (self), DZL_GRAPH_MODEL (model));
Packit Service c6b782
    }
Packit Service c6b782
Packit Service c6b782
  n_columns = dzl_graph_view_model_get_n_columns (DZL_GRAPH_MODEL (model));
Packit Service c6b782
Packit Service c6b782
  for (i = 0; i < n_columns; i++)
Packit Service c6b782
    {
Packit Service c6b782
      DzlGraphRenderer *renderer;
Packit Service c6b782
Packit Service c6b782
      renderer = g_object_new (DZL_TYPE_GRAPH_LINE_RENDERER,
Packit Service c6b782
                               "column", i,
Packit Service c6b782
                               "stroke-color", colors [i % G_N_ELEMENTS (colors)],
Packit Service c6b782
                               NULL);
Packit Service c6b782
      dzl_graph_view_add_renderer (DZL_GRAPH_VIEW (self), renderer);
Packit Service c6b782
      g_clear_object (&renderer);
Packit Service c6b782
    }
Packit Service c6b782
}
Packit Service c6b782
Packit Service c6b782
static void
Packit Service c6b782
dzl_cpu_graph_get_property (GObject    *object,
Packit Service c6b782
                           guint       prop_id,
Packit Service c6b782
                           GValue     *value,
Packit Service c6b782
                           GParamSpec *pspec)
Packit Service c6b782
{
Packit Service c6b782
  DzlCpuGraph *self = DZL_CPU_GRAPH (object);
Packit Service c6b782
Packit Service c6b782
  switch (prop_id)
Packit Service c6b782
    {
Packit Service c6b782
    case PROP_MAX_SAMPLES:
Packit Service c6b782
      g_value_set_uint (value, self->max_samples);
Packit Service c6b782
      break;
Packit Service c6b782
Packit Service c6b782
    case PROP_TIMESPAN:
Packit Service c6b782
      g_value_set_int64 (value, self->timespan);
Packit Service c6b782
      break;
Packit Service c6b782
Packit Service c6b782
    default:
Packit Service c6b782
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service c6b782
    }
Packit Service c6b782
}
Packit Service c6b782
Packit Service c6b782
static void
Packit Service c6b782
dzl_cpu_graph_set_property (GObject      *object,
Packit Service c6b782
                           guint         prop_id,
Packit Service c6b782
                           const GValue *value,
Packit Service c6b782
                           GParamSpec   *pspec)
Packit Service c6b782
{
Packit Service c6b782
  DzlCpuGraph *self = DZL_CPU_GRAPH (object);
Packit Service c6b782
Packit Service c6b782
  switch (prop_id)
Packit Service c6b782
    {
Packit Service c6b782
    case PROP_MAX_SAMPLES:
Packit Service c6b782
      self->max_samples = g_value_get_uint (value);
Packit Service c6b782
      break;
Packit Service c6b782
Packit Service c6b782
    case PROP_TIMESPAN:
Packit Service c6b782
      self->timespan = g_value_get_int64 (value);
Packit Service c6b782
      break;
Packit Service c6b782
Packit Service c6b782
    default:
Packit Service c6b782
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service c6b782
    }
Packit Service c6b782
}
Packit Service c6b782
Packit Service c6b782
static void
Packit Service c6b782
dzl_cpu_graph_class_init (DzlCpuGraphClass *klass)
Packit Service c6b782
{
Packit Service c6b782
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit Service c6b782
Packit Service c6b782
  object_class->constructed = dzl_cpu_graph_constructed;
Packit Service c6b782
  object_class->get_property = dzl_cpu_graph_get_property;
Packit Service c6b782
  object_class->set_property = dzl_cpu_graph_set_property;
Packit Service c6b782
Packit Service c6b782
  properties [PROP_TIMESPAN] =
Packit Service c6b782
    g_param_spec_int64 ("timespan",
Packit Service c6b782
                         "Timespan",
Packit Service c6b782
                         "Timespan",
Packit Service c6b782
                         0, G_MAXINT64,
Packit Service c6b782
                         0,
Packit Service c6b782
                         (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
Packit Service c6b782
Packit Service c6b782
  properties [PROP_MAX_SAMPLES] =
Packit Service c6b782
    g_param_spec_uint ("max-samples",
Packit Service c6b782
                       "Max Samples",
Packit Service c6b782
                       "Max Samples",
Packit Service c6b782
                       0, G_MAXUINT,
Packit Service c6b782
                       120,
Packit Service c6b782
                       (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
Packit Service c6b782
Packit Service c6b782
  g_object_class_install_properties (object_class, LAST_PROP, properties);
Packit Service c6b782
}
Packit Service c6b782
Packit Service c6b782
static void
Packit Service c6b782
dzl_cpu_graph_init (DzlCpuGraph *self)
Packit Service c6b782
{
Packit Service c6b782
  self->max_samples = 120;
Packit Service c6b782
  self->timespan = 60L * G_USEC_PER_SEC;
Packit Service c6b782
}