Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/rpms/sugar/0015-Add-cpu-and-memory-resource-indicator-to-frame.patch
diff options
context:
space:
mode:
Diffstat (limited to 'rpms/sugar/0015-Add-cpu-and-memory-resource-indicator-to-frame.patch')
-rw-r--r--rpms/sugar/0015-Add-cpu-and-memory-resource-indicator-to-frame.patch276
1 files changed, 276 insertions, 0 deletions
diff --git a/rpms/sugar/0015-Add-cpu-and-memory-resource-indicator-to-frame.patch b/rpms/sugar/0015-Add-cpu-and-memory-resource-indicator-to-frame.patch
new file mode 100644
index 0000000..4aa6700
--- /dev/null
+++ b/rpms/sugar/0015-Add-cpu-and-memory-resource-indicator-to-frame.patch
@@ -0,0 +1,276 @@
+From 29835fe3fd9c47665060836766ecc5cfd1fbb6c5 Mon Sep 17 00:00:00 2001
+From: anishmangal2002 <anishmangal2002@gmail.com>
+Date: Fri, 2 Jul 2010 20:45:28 +0530
+Subject: [PATCH sugar 15/74] Add cpu and memory resource indicator to frame
+
+This patch adds an icon to the frame, whose palette
+menu displays the memory and cpu resources. For computing
+free memory, the code reads the /proc/meminfo file (thanks
+quozl) and for computing cpu usage, the code reads the
+/proc/stat file.
+
+The frame icon is updated after every 5 seconds if required.
+Similarly, the palette menu entries are updated after every
+5 seconds as well.
+
+Signed-off-by: anishmangal2002 <anishmangal2002@gmail.com>
+[style fixes, increase weight of memory utilisation for "system mood" so
+bursts of CPU activity don't take us from "happy" directly to "sad";
+pop up on left click since there is no primary action]
+Signed-off-by: Sascha Silbe <sascha-pgp@silbe.org>
+Reviewed-by: Sascha Silbe <sascha-pgp@silbe.org>
+---
+ extensions/deviceicon/Makefile.am | 1 +
+ extensions/deviceicon/resources.py | 215 ++++++++++++++++++++++++++++++++++++
+ po/POTFILES.in | 1 +
+ 3 files changed, 217 insertions(+), 0 deletions(-)
+ create mode 100644 extensions/deviceicon/resources.py
+
+diff --git a/extensions/deviceicon/Makefile.am b/extensions/deviceicon/Makefile.am
+index 118d866..0d15c38 100644
+--- a/extensions/deviceicon/Makefile.am
++++ b/extensions/deviceicon/Makefile.am
+@@ -4,6 +4,7 @@ sugar_PYTHON = \
+ __init__.py \
+ battery.py \
+ network.py \
++ resources.py \
+ speaker.py \
+ touchpad.py \
+ volume.py
+diff --git a/extensions/deviceicon/resources.py b/extensions/deviceicon/resources.py
+new file mode 100644
+index 0000000..5e39d4e
+--- /dev/null
++++ b/extensions/deviceicon/resources.py
+@@ -0,0 +1,215 @@
++# Copyright (C) Anish Mangal <anishmangal2002@gmail.com>
++#
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++
++from gettext import gettext as _
++import logging
++import os
++
++import gobject
++import gtk
++import gconf
++
++from sugar.graphics.tray import TrayIcon
++from sugar.graphics.xocolor import XoColor
++from sugar.graphics.palette import Palette
++from sugar.graphics import style
++
++
++_SYSTEM_MOODS = ['-sad', '-normal', '-happy']
++_ICON_NAME = 'computer'
++_UPDATE_INTERVAL = 5 * 1000
++
++
++class DeviceView(TrayIcon):
++
++ FRAME_POSITION_RELATIVE = 500
++
++ def __init__(self):
++ client = gconf.client_get_default()
++ self._color = XoColor(client.get_string('/desktop/sugar/user/color'))
++ TrayIcon.__init__(self, icon_name=_ICON_NAME, xo_color=self._color)
++ self.create_palette()
++ self._icon_widget.connect('button-release-event', self._click_cb)
++
++ def create_palette(self):
++ self.palette = ResourcePalette(_('System resources'))
++ self.palette.set_group_id('frame')
++ self.palette.add_timer()
++ self.palette.connect('system-mood-changed',
++ self._system_mood_changed_cb)
++ return self.palette
++
++ def _system_mood_changed_cb(self, palette_, mood):
++ self.icon.props.icon_name = _ICON_NAME + mood
++
++ def _click_cb(self, widget, event):
++ self.palette_invoker.notify_right_click()
++
++
++class ResourcePalette(Palette):
++ __gsignals__ = {
++ 'system-mood-changed': (gobject.SIGNAL_RUN_FIRST,
++ gobject.TYPE_NONE,
++ ([str])),
++ }
++
++ def __init__(self, primary_text):
++ Palette.__init__(self, label=primary_text)
++
++ self.vbox = gtk.VBox()
++ self.set_content(self.vbox)
++
++ self._cpu_text = gtk.Label()
++ self.vbox.pack_start(self._cpu_text, padding=style.DEFAULT_PADDING)
++ self._cpu_bar = gtk.ProgressBar()
++ self._cpu_bar.set_size_request(
++ style.zoom(style.GRID_CELL_SIZE * 4), -1)
++ self.vbox.pack_start(self._cpu_bar, padding=style.DEFAULT_PADDING)
++
++ self._memory_text = gtk.Label()
++ self.vbox.pack_start(self._memory_text, padding=style.DEFAULT_PADDING)
++ self._memory_bar = gtk.ProgressBar()
++ self._memory_bar.set_size_request(
++ style.zoom(style.GRID_CELL_SIZE * 4), -1)
++ self.vbox.pack_start(self._memory_bar, padding=style.DEFAULT_PADDING)
++
++ self._system_mood = None
++ try:
++ self._cpu_times = self._get_cpu_times_list()
++ except IOError:
++ logging.exception('An error ocurred while attempting to '
++ 'read /proc/stat')
++ self._stop_computing_statistics()
++
++ self.vbox.show()
++ self._cpu_text.show()
++ self._cpu_bar.show()
++ self._memory_text.show()
++ self._memory_bar.show()
++
++ def add_timer(self):
++ gobject.timeout_add(_UPDATE_INTERVAL, self.__timer_cb)
++
++ def _get_cpu_times_list(self):
++ """Return various cpu times as read from /proc/stat
++
++ This method returns the following cpu times measured
++ in jiffies (1/100 of a second for x86 systems)
++ as an ordered list of numbers - [user, nice,
++ system, idle, iowait] where,
++
++ user: normal processes executing in user mode
++ nice: niced processes executing in user mode
++ system: processes executing in kernel mode
++ idle: twiddling thumbs
++ iowait: waiting for I/O to complete
++
++ Note: For systems having 2 or more CPU's, the above
++ numbers would be the cumulative sum of these times
++ for all CPU's present in the system.
++
++ """
++ return [int(count)
++ for count in file('/proc/stat').readline().split()[1:6]]
++
++ def _percentage_cpu_available(self):
++ """
++ Return free CPU resources as a percentage
++
++ """
++ _cpu_times_new = self._get_cpu_times_list()
++ _cpu_times_current = [(new - old)
++ for new, old in zip(_cpu_times_new, self._cpu_times)]
++ user_, nice_, system_, idle, iowait = _cpu_times_current
++ cpu_free = (idle + iowait) * 100.0 / sum(_cpu_times_current)
++ self._cpu_times = self._get_cpu_times_list()
++ return cpu_free
++
++ def _percentage_memory_available(self):
++ """
++ Return free memory as a percentage
++
++ """
++ for line in file('/proc/meminfo'):
++ name, value, unit_ = line.split()[:3]
++ if 'MemTotal:' == name:
++ total = int(value)
++ elif 'MemFree:' == name:
++ free = int(value)
++ elif 'Buffers:' == name:
++ buffers = int(value)
++ elif 'Cached:' == name:
++ cached = int(value)
++ elif 'Active:' == name:
++ break
++ return (free + buffers + cached) * 100.0 / total
++
++ def __timer_cb(self):
++ try:
++ cpu_in_use = 100 - self._percentage_cpu_available()
++ memory_in_use = 100 - self._percentage_memory_available()
++ except IOError:
++ logging.exception('An error ocurred while trying to '
++ 'retrieve resource usage statistics')
++ self._stop_and_show_error()
++ return False
++ else:
++ self._cpu_text.set_label(_('CPU in use: %d%%' % cpu_in_use))
++ self._cpu_bar.set_fraction(float(cpu_in_use) / 100)
++ self._memory_text.set_label(_('Memory in use: %d%%' %
++ memory_in_use))
++ self._memory_bar.set_fraction(float(memory_in_use) / 100)
++
++ # both cpu_free and memory_free lie between 0-100
++ system_mood = _SYSTEM_MOODS[
++ int(300 - (cpu_in_use + 2 * memory_in_use)) // 100]
++
++ # check if self._system_mood exists
++ try:
++ if self._system_mood != system_mood:
++ self.emit('system-mood-changed', system_mood)
++ self._system_mood = system_mood
++ except AttributeError:
++ self.emit('system-mood-changed', system_mood)
++ self._system_mood = system_mood
++
++ return True
++
++ def _stop_and_show_error(self):
++ """
++ Stop computing usage statistics and display an error message
++ since we've hit an exception.
++
++ """
++ # Use the existing _cpu_text label to display the error. Remove
++ # everything else.
++ self._cpu_text.set_size_request(
++ style.zoom(style.GRID_CELL_SIZE * 4), -1)
++ self._cpu_text.set_line_wrap(True)
++ self._cpu_text.set_text(_('Cannot compute CPU and memory usage '
++ 'statistics!'))
++ self.vbox.remove(self._cpu_bar)
++ self.vbox.remove(self._memory_text)
++ self.vbox.remove(self._memory_bar)
++ self.emit('system-mood-changed', '-error')
++
++
++def setup(tray):
++ if not (os.path.exists('/proc/stat') and os.path.exists('/proc/meminfo')):
++ logging.warning('Either /proc/stat or /proc/meminfo not present. Not '
++ 'adding the CPU and memory usage icon to the frame')
++ return
++ tray.add_device(DeviceView())
+diff --git a/po/POTFILES.in b/po/POTFILES.in
+index 9e46831..b799339 100644
+--- a/po/POTFILES.in
++++ b/po/POTFILES.in
+@@ -27,6 +27,7 @@ extensions/cpsection/updater/__init__.py
+ extensions/cpsection/updater/view.py
+ extensions/deviceicon/battery.py
+ extensions/deviceicon/network.py
++extensions/deviceicon/resources.py
+ extensions/deviceicon/speaker.py
+ extensions/deviceicon/touchpad.py
+ extensions/deviceicon/volume.py
+--
+1.7.6
+