[gnome-system-monitor] Added option to draw CPU usage chart as a stacked area chart. https://bugzilla.gnome.org/show_bug.cg



commit b5a2e25abf1a1e566af44708b25076eae4657afe
Author: Robert Roth <robert roth off gmail com>
Date:   Fri Nov 9 22:04:37 2012 +0200

    Added option to draw CPU usage chart as a stacked area chart.
    https://bugzilla.gnome.org/show_bug.cgi?id=635939

 data/preferences.ui                               |   25 +++++++++++----
 src/load-graph.cpp                                |   32 +++++++++++++++-----
 src/org.gnome.gnome-system-monitor.gschema.xml.in |    8 +++++
 src/procdialogs.cpp                               |   18 +++++++++++
 src/procman-app.cpp                               |   14 +++++++++
 src/procman-app.h                                 |    1 +
 src/settings-keys.cpp                             |    1 +
 src/settings-keys.h                               |    1 +
 8 files changed, 85 insertions(+), 15 deletions(-)
---
diff --git a/data/preferences.ui b/data/preferences.ui
index 12f5b05..23af053 100644
--- a/data/preferences.ui
+++ b/data/preferences.ui
@@ -24,7 +24,6 @@
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
                 <property name="use_stock">True</property>
               </object>
               <packing>
@@ -39,7 +38,6 @@
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
                 <property name="use_stock">True</property>
               </object>
               <packing>
@@ -162,7 +160,6 @@
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
                                 <property name="hexpand">True</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="xalign">0</property>
                                 <property name="draw_indicator">True</property>
@@ -181,7 +178,6 @@
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
                                 <property name="hexpand">True</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="xalign">0</property>
                                 <property name="draw_indicator">True</property>
@@ -200,7 +196,6 @@
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
                                 <property name="hexpand">True</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="xalign">0</property>
                                 <property name="draw_indicator">True</property>
@@ -431,7 +426,6 @@
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
                                 <property name="hexpand">True</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="xalign">0</property>
                                 <property name="draw_indicator">True</property>
@@ -443,6 +437,24 @@
                                 <property name="height">1</property>
                               </packing>
                             </child>
+                            <child>
+                              <object class="GtkCheckButton" id="draw_stacked_button">
+                                <property name="label" translatable="yes">_Draw CPU chart as stacked area chart</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="hexpand">True</property>
+                                <property name="use_underline">True</property>
+                                <property name="xalign">0</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">0</property>
+                                <property name="top_attach">2</property>
+                                <property name="width">1</property>
+                                <property name="height">1</property>
+                              </packing>
+                            </child>
                           </object>
                           <packing>
                             <property name="left_attach">0</property>
@@ -569,7 +581,6 @@
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
                                 <property name="hexpand">True</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="xalign">0</property>
                                 <property name="draw_indicator">True</property>
diff --git a/src/load-graph.cpp b/src/load-graph.cpp
index 2f0505f..9cff2f9 100644
--- a/src/load-graph.cpp
+++ b/src/load-graph.cpp
@@ -139,7 +139,11 @@ void draw_background(LoadGraph *graph) {
             pango_cairo_show_layout (cr, layout);
         } else {
             // operation orders matters so it's 0 if i == num_bars
-            caption = g_strdup_printf("%d%%", 100 - i * (100 / num_bars));
+            guint max = 100;
+            if (graph->type == LOAD_GRAPH_CPU && !ProcmanApp::get()->config.solaris_mode) {
+                max = 100 * graph->n;
+            }
+            caption = g_strdup_printf("%d %%", max - i * (max / num_bars));
             pango_layout_set_text (layout, caption, -1);
             pango_layout_get_extents (layout, NULL, &extents);
             cairo_move_to (cr, graph->indent - 1.0 * extents.width / PANGO_SCALE + 20,
@@ -222,7 +226,8 @@ load_graph_draw (GtkWidget *widget,
     LoadGraph * const graph = static_cast<LoadGraph*>(data_ptr);
     GdkWindow *window;
 
-    guint i, j;
+    guint i;
+    gint j;
     gdouble sample_width, x_offset;
 
     window = gtk_widget_get_window (graph->disp);
@@ -255,10 +260,14 @@ load_graph_draw (GtkWidget *widget,
                      graph->real_draw_height + FRAME_WIDTH - 1);
     cairo_clip(cr);
 
-    for (j = 0; j < graph->n; ++j) {
-        cairo_move_to (cr, x_offset, (1.0f - graph->data[0][j]) * graph->real_draw_height);
+    bool drawStacked = graph->type == LOAD_GRAPH_CPU && ProcmanApp::get()->config.draw_stacked;
+    for (j = graph->n-1; j >= 0; j--) {
         gdk_cairo_set_source_rgba (cr, &(graph->colors [j]));
-
+        if (drawStacked) {
+            cairo_move_to (cr, x_offset, graph->real_draw_height);
+        } else {
+            cairo_move_to (cr, x_offset, (1.0f - graph->data[0][j]) * graph->real_draw_height);
+        }
         for (i = 1; i < LoadGraph::NUM_POINTS; ++i) {
             if (graph->data[i][j] == -1.0f)
                 continue;
@@ -270,8 +279,12 @@ load_graph_draw (GtkWidget *widget,
                             x_offset - (i * graph->graph_delx),
                             (1.0f - graph->data[i][j]) * graph->real_draw_height + 3.5f);
         }
-        cairo_stroke (cr);
-
+        if (drawStacked) {
+            cairo_rel_line_to (cr, x_offset - (LoadGraph::NUM_POINTS * graph->graph_delx), graph->real_draw_height);
+            cairo_fill(cr);
+        } else {
+            cairo_stroke (cr);
+        }
     }
 
     cairo_destroy (cr);
@@ -318,7 +331,10 @@ get_load (LoadGraph *graph)
         used  = NOW[i][CPU_USED]  - LAST[i][CPU_USED];
 
         load = used / MAX(total, 1.0f);
-        graph->data[0][i] = load;
+        graph->data[0][i] = load / graph->n;
+        if (i > 0) {
+            graph->data[0][i] += graph->data[0][i-1];
+        }
 
         /* Update label */
         text = g_strdup_printf("%.1f%%", load * 100.0f);
diff --git a/src/org.gnome.gnome-system-monitor.gschema.xml.in b/src/org.gnome.gnome-system-monitor.gschema.xml.in
index 65ddc1f..7455c2a 100644
--- a/src/org.gnome.gnome-system-monitor.gschema.xml.in
+++ b/src/org.gnome.gnome-system-monitor.gschema.xml.in
@@ -51,6 +51,14 @@
       </_description>
     </key>
 
+    <key type="b" name="cpu-stacked-area-chart">
+      <default>false
+      </default>
+      <_summary>Show CPU chart as stacked area chart</_summary>
+      <_description>If TRUE, system-monitor shows the CPU chart as a stacked area chart instead of a line chart.
+      </_description>
+    </key>
+
     <key name="smooth-refresh" type="b">
       <default>true
       </default>
diff --git a/src/procdialogs.cpp b/src/procdialogs.cpp
index e690e5b..df4869f 100644
--- a/src/procdialogs.cpp
+++ b/src/procdialogs.cpp
@@ -257,6 +257,17 @@ solaris_mode_toggled(GtkToggleButton *button, gpointer data)
     g_settings_set_boolean(settings, procman::settings::solaris_mode.c_str(), toggled);
 }
 
+static void
+draw_stacked_toggled(GtkToggleButton *button, gpointer data)
+{
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
+    GSettings *settings = app->settings;
+
+    gboolean toggled;
+    toggled = gtk_toggle_button_get_active(button);
+    g_settings_set_boolean(settings, procman::settings::draw_stacked.c_str(), toggled);
+}
+
 
 static void
 network_in_bits_toggled(GtkToggleButton *button, gpointer data)
@@ -504,6 +515,13 @@ procdialog_create_preferences_dialog (ProcmanApp *app)
     g_signal_connect(G_OBJECT(solaris_button), "toggled",
                      G_CALLBACK(solaris_mode_toggled), app);
 
+    GtkWidget *draw_stacked_button = GTK_WIDGET (gtk_builder_get_object (builder, "draw_stacked_button"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(draw_stacked_button),
+                                 g_settings_get_boolean(app->settings,
+                                                        procman::settings::draw_stacked.c_str()));
+    g_signal_connect(G_OBJECT(draw_stacked_button), "toggled",
+                     G_CALLBACK(draw_stacked_toggled), app);
+
     create_field_page (builder, app->tree, "processes_columns_treeview");
 
     update = (gfloat) app->config.graph_update_interval;
diff --git a/src/procman-app.cpp b/src/procman-app.cpp
index 5c160c5..0b7a1c3 100644
--- a/src/procman-app.cpp
+++ b/src/procman-app.cpp
@@ -54,9 +54,19 @@ solaris_mode_changed_cb(GSettings *settings, const gchar *key, gpointer data)
     ProcmanApp *app = static_cast<ProcmanApp *>(data);
 
     app->config.solaris_mode = g_settings_get_boolean(settings, key);
+    app->cpu_graph->clear_background();
     proctable_update_all (app);
 }
 
+static void
+draw_stacked_changed_cb(GSettings *settings, const gchar *key, gpointer data)
+{
+    ProcmanApp *app = static_cast<ProcmanApp *>(data);
+
+    app->config.draw_stacked = g_settings_get_boolean(settings, key);
+    app->cpu_graph->clear_background();
+}
+
 
 static void
 network_in_bits_changed_cb(GSettings *settings, const gchar *key, gpointer data)
@@ -252,6 +262,10 @@ ProcmanApp::load_settings()
     std::string detail_string("changed::" + procman::settings::solaris_mode);
     g_signal_connect(G_OBJECT(settings), detail_string.c_str(), G_CALLBACK(solaris_mode_changed_cb), this);
 
+    config.draw_stacked = g_settings_get_boolean(settings, procman::settings::draw_stacked.c_str());
+    detail_string = "changed::" + procman::settings::draw_stacked;
+    g_signal_connect(G_OBJECT(settings), detail_string.c_str(), G_CALLBACK(draw_stacked_changed_cb), this);
+
     config.network_in_bits = g_settings_get_boolean(settings, procman::settings::network_in_bits.c_str());
     detail_string = "changed::" + procman::settings::network_in_bits;
     g_signal_connect(G_OBJECT(settings), detail_string.c_str(), G_CALLBACK(network_in_bits_changed_cb), this);
diff --git a/src/procman-app.h b/src/procman-app.h
index 457a64c..3294944 100644
--- a/src/procman-app.h
+++ b/src/procman-app.h
@@ -66,6 +66,7 @@ struct ProcConfig
     GdkRGBA         frame_color;
     gint            num_cpus;
     bool solaris_mode;
+    bool draw_stacked;
     bool network_in_bits;
 };
 
diff --git a/src/settings-keys.cpp b/src/settings-keys.cpp
index f330d4c..5580ccd 100644
--- a/src/settings-keys.cpp
+++ b/src/settings-keys.cpp
@@ -7,6 +7,7 @@ namespace procman
     {
         const std::string root("/apps/procman");
         const std::string solaris_mode("solaris-mode");
+        const std::string draw_stacked("cpu-stacked-area-chart");
         const std::string open_files_tree_prefix("openfilestree");
         const std::string network_in_bits("network-in-bits");
     }
diff --git a/src/settings-keys.h b/src/settings-keys.h
index b30c720..4e89996 100644
--- a/src/settings-keys.h
+++ b/src/settings-keys.h
@@ -9,6 +9,7 @@ namespace procman
     {
         extern const std::string root;
         extern const std::string solaris_mode;
+        extern const std::string draw_stacked;
         extern const std::string open_files_tree_prefix;
         extern const std::string network_in_bits;
     }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]