--- /dev/null
+From 4c5a36e4c0cbe38f2e26b6b3c8b02e88b4b939f7 Mon Sep 17 00:00:00 2001
+From: Jason Siefken <siefkenj@gmail.com>
+Date: Tue, 11 Oct 2011 02:15:05 -0700
+Subject: Added prettier drawing operations and css colors
+
+https://bugzilla.gnome.org/show_bug.cgi?id=661443
+---
+ extensions/systemMonitor/extension.js | 186 ++++++++++++++++++++++--------
+ extensions/systemMonitor/stylesheet.css | 25 +++--
+ 2 files changed, 152 insertions(+), 59 deletions(-)
+
+diff --git a/extensions/systemMonitor/extension.js b/extensions/systemMonitor/extension.js
+index db7fe59..39801ab 100644
+--- a/extensions/systemMonitor/extension.js
++++ b/extensions/systemMonitor/extension.js
+@@ -9,6 +9,9 @@ const Shell = imports.gi.Shell;
+
+ const Main = imports.ui.main;
+
++const INDICATOR_UPDATE_INTERVAL = 500;
++const INDICATOR_NUM_GRID_LINES = 3;
++
+ let _cpuIndicator;
+ let _memIndicator;
+ let _box;
+@@ -19,29 +22,24 @@ function Indicator() {
+
+ Indicator.prototype = {
+ _init: function() {
+- this._initValues();
+- this.actor = new St.DrawingArea({ style_class: "extension-systemMonitor-indicator-area",
+- reactive: true});
+- this.actor.connect('repaint', Lang.bind(this, this._draw));
+- this.actor.connect('button-press-event', function() {
++ this._initValues();
++ this.drawing_area = new St.DrawingArea({ reactive: true });
++ this.drawing_area.width = 100; this.drawing_area.height = 100;
++ this.drawing_area.connect('repaint', Lang.bind(this, this._draw));
++ this.drawing_area.connect('button-press-event', function() {
+ let app = Shell.AppSystem.get_default().lookup_app('gnome-system-monitor.desktop');
+ app.open_new_window(-1);
+ });
+
+- this._timeoutId = Mainloop.timeout_add(250, Lang.bind(this, function () {
+- this._updateValues();
+- this.actor.queue_repaint();
+- return true;
+- }));
+- },
++ this.actor = new St.Bin({ style_class: "extension-systemMonitor-indicator-area",
++ reactive: true});
++ this.actor.add_actor(this.drawing_area);
+
+- destroy: function() {
+- if (this._timeoutId) {
+- Mainloop.source_remove(this._timeoutId);
+- this._timeoutId = 0;
+- }
+-
+- this.actor.destroy();
++ Mainloop.timeout_add(INDICATOR_UPDATE_INTERVAL, Lang.bind(this, function () {
++ this._updateValues();
++ this.drawing_area.queue_repaint();
++ return true;
++ }));
+ },
+
+ _initValues: function() {
+@@ -54,23 +52,83 @@ Indicator.prototype = {
+ let [width, height] = area.get_surface_size();
+ let themeNode = this.actor.get_theme_node();
+ let cr = area.get_context();
+- for (let i = this.values.length - 1; i >= 0; i--) {
+- let color = themeNode.get_color(this.values[i].color);
+- cr.moveTo(0, height);
+- let k;
+- for (k = 0; k < this.values[i].values.length; k++) {
+- cr.lineTo(k, (1 - this.values[i].values[k]) * height);
++
++ //draw the background grid
++ let color = themeNode.get_color(this.gridColor);
++ let gridOffset = Math.floor(height / (INDICATOR_NUM_GRID_LINES + 1));
++ for (let i = 1; i <= INDICATOR_NUM_GRID_LINES; ++i) {
++ cr.moveTo(0, i * gridOffset + .5);
++ cr.lineTo(width, i * gridOffset + .5);
++ }
++ Clutter.cairo_set_source_color(cr, color);
++ cr.setLineWidth(1);
++ cr.setDash([4,1], 0);
++ cr.stroke();
++
++ //draw the foreground
++
++ function makePath(values, reverse, nudge) {
++ if (nudge == null) {
++ nudge = 0;
+ }
+- if (k > width)
+- this.values[i].values.shift();
+- cr.lineTo(k, height);
+- cr.lineTo(0, height);
+- cr.closePath();
+- Clutter.cairo_set_source_color(cr, color);
++ //if we are going in reverse, we are completing the bottom of a chart, so use lineTo
++ if (reverse) {
++ cr.lineTo(values.length - 1, (1 - values[values.length - 1]) * height + nudge);
++ for (let k = values.length - 2; k >= 0; --k) {
++ cr.lineTo(k, (1 - values[k]) * height + nudge);
++ }
++ } else {
++ cr.moveTo(0, (1 - values[0]) * height + nudge);
++ for (let k = 1; k < values.length; ++k) {
++ cr.lineTo(k, (1 - values[k]) * height + nudge);
++ }
+
+- cr.fill();
++ }
++ }
++
++ let renderStats = this.renderStats;
++
++ // Make sure we don't have more sample points than pixels
++ renderStats.map(Lang.bind(this, function(k){
++ let stat = this.stats[k];
++ if (stat.values.length > width) {
++ stat.values = stat.values.slice(stat.values.length - width, stat.values.length);
++ }
++ }));
++
++ for (let i = 0; i < renderStats.length; ++i) {
++ let stat = this.stats[renderStats[i]];
++ // We outline at full opacity and fill with 40% opacity
++ let outlineColor = themeNode.get_color(stat.color);
++ let color = new Clutter.Color(outlineColor);
++ color.alpha = color.alpha * .4;
++
++ // Render the background between us and the next level
++ makePath(stat.values, false);
++ // If there is a process below us, render the cpu between us and it, otherwise,
++ // render to the bottom of the chart
++ if (i == renderStats.length - 1) {
++ cr.lineTo(stat.values.length - 1, height);
++ cr.lineTo(0, height);
++ cr.closePath();
++ } else {
++ let nextStat = this.stats[renderStats[i+1]];
++ makePath(nextStat.values, true);
++ }
++ cr.closePath()
++ Clutter.cairo_set_source_color(cr, color);
++ cr.fill();
++
++ // Render the outline of this level
++ makePath(stat.values, false, .5);
++ Clutter.cairo_set_source_color(cr, outlineColor);
++ cr.setLineWidth(1.0);
++ cr.setDash([], 0);
++ cr.stroke();
+ }
++
+ }
++
+ };
+
+ function CpuIndicator() {
+@@ -80,14 +138,28 @@ function CpuIndicator() {
+ CpuIndicator.prototype = {
+ __proto__: Indicator.prototype,
+
++ _init: function() {
++ Indicator.prototype._init.call(this);
++ this.gridColor = '-grid-color';
++ this.renderStats = [ 'cpu-user', 'cpu-sys', 'cpu-iowait' ];
++
++ // Make sure renderStats is sorted as necessary for rendering
++ let renderStatOrder = {'cpu-total': 0, 'cpu-user': 1, 'cpu-sys': 2, 'cpu-iowait': 3};
++ this.renderStats = this.renderStats.sort(function(a,b) {
++ return renderStatOrder[a] - renderStatOrder[b];
++ });
++ },
++
+ _initValues: function() {
+ this._prev = new GTop.glibtop_cpu;
+ GTop.glibtop_get_cpu(this._prev);
+
+- this.values = [];
+- this.values.push({color: "-cpu-user-color", values: []});
+- this.values.push({color: "-cpu-sys-color", values: []});
+- this.values.push({color: "-cpu-iowait-color", values: []});
++ this.stats = {
++ 'cpu-user': {color: '-cpu-user-color', values: []},
++ 'cpu-sys': {color: '-cpu-sys-color', values: []},
++ 'cpu-iowait': {color: '-cpu-iowait-color', values: []},
++ 'cpu-total': {color: '-cpu-total-color', values: []}
++ };
+ },
+
+ _updateValues: function() {
+@@ -98,15 +170,16 @@ CpuIndicator.prototype = {
+ let user = cpu.user - this._prev.user;
+ let sys = cpu.sys - this._prev.sys;
+ let iowait = cpu.iowait - this._prev.iowait;
++ let idle = cpu.idle - this._prev.idle;
+
+- t = user / total;
+- this.values[0].values.push(t);
+-
+- t += sys / total;
+- this.values[1].values.push(t);
+ t += iowait / total;
+- this.values[2].values.push(t);
+-
++ this.stats['cpu-iowait'].values.push(t);
++ t += sys / total;
++ this.stats['cpu-sys'].values.push(t);
++ t += user / total;
++ this.stats['cpu-user'].values.push(t);
++ this.stats['cpu-total'].values.push(1 - idle / total);
++
+ this._prev = cpu;
+ }
+ };
+@@ -117,24 +190,37 @@ function MemoryIndicator() {
+
+ MemoryIndicator.prototype = {
+ __proto__: Indicator.prototype,
++
++ _init: function() {
++ Indicator.prototype._init.call(this);
++ this.gridColor = '-grid-color';
++ this.renderStats = [ 'mem-user', 'mem-other', 'mem-cached' ];
++
++ // Make sure renderStats is sorted as necessary for rendering
++ let renderStatOrder = { 'mem-cached': 0, 'mem-other': 1, 'mem-user': 2 };
++ this.renderStats = this.renderStats.sort(function(a,b) {
++ return renderStatOrder[a] - renderStatOrder[b];
++ });
++ },
+
+ _initValues: function() {
+ this.mem = new GTop.glibtop_mem;
+- this.values = [];
+- this.values.push({ color: "-mem-user-color", values: [] });
+- this.values.push({ color: "-mem-other-color", values: [] });
+- this.values.push({ color: "-mem-cached-color", values: [] });
++ this.stats = {
++ 'mem-user': { color: "-mem-user-color", values: [] },
++ 'mem-other': { color: "-mem-other-color", values: [] },
++ 'mem-cached': { color: "-mem-cached-color", values: [] }
++ };
+ },
+
+ _updateValues: function() {
+ GTop.glibtop_get_mem(this.mem);
+
+ let t = this.mem.user / this.mem.total;
+- this.values[0].values.push(t);
++ this.stats['mem-user'].values.push(t);
+ t += (this.mem.used - this.mem.user - this.mem.cached) / this.mem.total;
+- this.values[1].values.push(t);
++ this.stats['mem-other'].values.push(t);
+ t += this.mem.cached / this.mem.total;
+- this.values[2].values.push(t);
++ this.stats['mem-cached'].values.push(t);
+ }
+ };
+
+@@ -143,7 +229,7 @@ function init() {
+ }
+
+ function enable() {
+- _cpuIndicator = new CpuIndicator();
++ _cpuIndicator = new CpuIndicator();
+ _memIndicator = new MemoryIndicator();
+ _box = new St.BoxLayout({ style_class: 'extension-systemMonitor-container' });
+ _box.add(_cpuIndicator.actor);
+diff --git a/extensions/systemMonitor/stylesheet.css b/extensions/systemMonitor/stylesheet.css
+index 26aad6b..daad48d 100644
+--- a/extensions/systemMonitor/stylesheet.css
++++ b/extensions/systemMonitor/stylesheet.css
+@@ -1,16 +1,23 @@
+ .extension-systemMonitor-container {
+ spacing: 5px;
++ padding-left: 5px;
++ padding-right: 5px;
++ padding-bottom: 1px;
++ padding-top: 0px;
+ }
+
+ .extension-systemMonitor-indicator-area {
+- border: 1px solid #000;
++ border: 1px solid #8d8d8d;
++ border-radius: 3px;
+ width: 100px;
+- height: 34px;
+- -cpu-user-color: #f00;
+- -cpu-sys-color: #0f0;
+- -cpu-iowait-color: #00f;
+- -mem-user-color: #ff0;
+- -mem-cached-color: #0ff;
+- -mem-other-color: #111;
+- background-color: #fff;
++ height: 30px;
++ -grid-color: #575757;
++ -cpu-total-color: rgb(0,154,62);
++ -cpu-user-color: rgb(69,154,0);
++ -cpu-sys-color: rgb(255,253,81);
++ -cpu-iowait-color: rgb(210,148,0);
++ -mem-user-color: rgb(210,148,0);
++ -mem-cached-color: rgb(90,90,90);
++ -mem-other-color: rgb(205,203,41);
++ background-color: #1e1e1e;
+ }
+--
+1.7.7.2
+
--- /dev/null
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/gnome-extra/gnome-shell-extensions/gnome-shell-extensions-3.2.0-r2.ebuild,v 1.1 2011/11/06 01:42:59 tetromino Exp $
+
+EAPI="4"
+GCONF_DEBUG="no"
+GNOME2_LA_PUNT="yes"
+
+inherit gnome2
+
+DESCRIPTION="JavaScript extensions for GNOME Shell"
+HOMEPAGE="http://live.gnome.org/GnomeShell/Extensions"
+
+LICENSE="GPL-2"
+SLOT="0"
+IUSE="examples"
+KEYWORDS="~amd64 ~x86"
+
+COMMON_DEPEND="
+ >=dev-libs/glib-2.26
+ >=gnome-base/gnome-desktop-2.91.6:3[introspection]
+ >=gnome-base/libgtop-2.28.3[introspection]
+ app-admin/eselect-gnome-shell-extensions"
+RDEPEND="${COMMON_DEPEND}
+ >=dev-libs/gjs-1.29
+ dev-libs/gobject-introspection
+ =gnome-base/gnome-shell-3.2*
+ media-libs/clutter:1.0[introspection]
+ net-libs/telepathy-glib[introspection]
+ x11-libs/gtk+:3[introspection]
+ x11-libs/pango[introspection]"
+DEPEND="${COMMON_DEPEND}
+ sys-devel/gettext
+ >=dev-util/pkgconfig-0.22
+ >=dev-util/intltool-0.26
+ gnome-base/gnome-common"
+
+pkg_setup() {
+ DOCS="NEWS README"
+ G2CONF="${G2CONF}
+ --enable-extensions=all
+ --disable-schemas-compile"
+}
+
+src_prepare() {
+ gnome2_src_prepare
+
+ # Useful patches from upstream, will be in the next release
+ epatch "${FILESDIR}/${P}-dock-popup-menus.patch"
+ epatch "${FILESDIR}/${P}-dock-gnome-3.2.patch"
+ epatch "${FILESDIR}/${P}-systemMonitor-CSS.patch"
+ epatch "${FILESDIR}/${P}-systemMonitor-enable-disable.patch"
+
+ # Extensions work with gnome-3.2*, not just 3.2.0
+ epatch "${FILESDIR}/${PN}-3.2.0-gnome-3.2.1.patch"
+
+ # xrandr-indicator crashes gnome-shell with <gjs-0.7.15;
+ # see gnome bug 649077. For simplicity, just disable it for gnome-3.0.
+ # sed -e 's:\(ALL_EXTENSIONS=.*\)xrandr-indicator:\1:' \
+ # -i configure || die
+}
+
+src_install() {
+ gnome2_src_install
+
+ local example="example@gnome-shell-extensions.gnome.org"
+ if use examples; then
+ mv "${ED}usr/share/gnome-shell/extensions/${example}" \
+ "${ED}usr/share/doc/${PF}/" || die
+ else
+ rm -r "${ED}usr/share/gnome-shell/extensions/${example}" || die
+ fi
+}
+
+pkg_postinst() {
+ gnome2_pkg_postinst
+
+ ebegin "Updating list of installed extensions"
+ eselect gnome-shell-extensions update
+ eend $?
+ elog
+ elog "Installed extensions installed are initially disabled by default."
+ elog "To change the system default and enable some extensions, you can use"
+ elog "# eselect gnome-shell-extensions"
+ elog "Alternatively, you can use the org.gnome.shell enabled-extensions"
+ elog "gsettings key to change the disabled extension list per-user, or"
+ elog "use the gnome-extra/gnome-tweak-tool GUI."
+ elog
+}