aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2015-04-02 13:56:13 +0200
committerMattias Andrée <maandree@operamail.com>2015-04-02 13:56:13 +0200
commit19898b034368721be62059b1fe2f6c4287632f9b (patch)
tree3f491b28949707b988b2375dd5034c6be7b2c1ea
parentadd random plugin (diff)
downloadxpybar-19898b034368721be62059b1fe2f6c4287632f9b.tar.gz
xpybar-19898b034368721be62059b1fe2f6c4287632f9b.tar.bz2
xpybar-19898b034368721be62059b1fe2f6c4287632f9b.tar.xz
add swaps plugin
Signed-off-by: Mattias Andrée <maandree@operamail.com>
-rw-r--r--Makefile4
-rw-r--r--TODO1
-rw-r--r--examples/plugins/swaps35
-rw-r--r--src/plugins/swaps.py56
4 files changed, 93 insertions, 3 deletions
diff --git a/Makefile b/Makefile
index e691341..317093b 100644
--- a/Makefile
+++ b/Makefile
@@ -32,13 +32,13 @@ PLUGINS = chase clock cpuinfo cpuonline cpu df discstats ipaddress \
kmsg leapsec linereader loadavg lunar mem moc network \
pacman snmp snmp6 softirqs solar uname uptime users \
vmstat weather xdisplay xkb alsa dentrystate inodestate \
- files hdparm tzclock ropty ping inotify random
+ files hdparm tzclock ropty ping inotify random swaps
PLUGIN_EXAMPLES = chase clock cpu cpuinfo cpuonline df discstats \
ipaddress kmsg loadavg lunar mem moc network \
pacman uname uptime users xdisplay xkb alsa \
dentrystate inodestate files tzclock ropty ping \
- inotify random
+ inotify random swaps
TRICK_EXAMPLES = localutcclock anytzclock
diff --git a/TODO b/TODO
index 91b2145..6a293c1 100644
--- a/TODO
+++ b/TODO
@@ -44,7 +44,6 @@ List of plugins to implement:
/proc/net/unix
/proc/sysvipc
/proc/locks
- /proc/swaps
Demo plugins:
diff --git a/examples/plugins/swaps b/examples/plugins/swaps
new file mode 100644
index 0000000..51bd7b5
--- /dev/null
+++ b/examples/plugins/swaps
@@ -0,0 +1,35 @@
+# -*- python -*-
+
+# A xpybar configuration example testing the features of plugins.swaps
+
+import time
+import threading
+
+from plugins.swaps import Swaps
+from plugins.clock import Clock
+
+
+OUTPUT, HEIGHT, YPOS, TOP = 0, 12, 24, True
+
+
+clock = Clock(sync_to = Clock.SECONDS)
+
+start_ = start
+def start():
+ start_()
+ async(lambda : clock.continuous_sync(lambda : bar.invalidate()))
+
+
+swaps_ = Swaps()
+HEIGHT *= len(swaps_.swaps)
+def redraw():
+ def title_and_extend(swap):
+ data = list(zip(swaps_.headers, swap))
+ usage = int(swap[swaps_.header_map['Used']]) / int(swap[swaps_.header_map['Size']])
+ usage = '%i%%' % int(usage * 100 + 0.5)
+ data.append(('Usage', usage))
+ return data
+ text = '\n'.join(' │ '.join('%s: %s' % (h, v) for (h, v) in title_and_extend(swap)) for swap in swaps_.swaps)
+ bar.clear()
+ bar.draw_coloured_text(0, 10, 0, 2, text)
+
diff --git a/src/plugins/swaps.py b/src/plugins/swaps.py
new file mode 100644
index 0000000..e09a034
--- /dev/null
+++ b/src/plugins/swaps.py
@@ -0,0 +1,56 @@
+# -*- python -*-
+'''
+xpybar – xmobar replacement written in python
+Copyright © 2014, 2015 Mattias Andrée (maandree@member.fsf.org)
+
+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 3 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, see <http://www.gnu.org/licenses/>.
+'''
+
+
+class Swaps:
+ '''
+ Swap statistics
+
+ @variable headers:list<str> The titles of the fields
+ @variable header_map:dict<str, int> Map from field title to field index (the reverse of `headers`)
+ @variable swaps:list<list<str>> List of swaps spaces, each element in this list is a list of
+ fields identified by `headers`
+ '''
+
+ def __init__(self):
+ '''
+ Constructor
+ '''
+ with open('/proc/swaps', 'rb') as file:
+ data = file.read()
+ data = data.decode('utf-8', 'replace').rstrip('\n').replace('\t', ' ')
+ data = data.split('\n')
+ self.headers, self.swaps = Swaps.__split(data[0]), [Swaps.__split(line) for line in data[1:]]
+ self.header_map = dict((t, i) for i, t in enumerate(self.headers))
+
+
+ def refresh(self):
+ '''
+ Update the variable `swaps`
+ '''
+ with open('/proc/swaps', 'rb') as file:
+ data = file.read()
+ data = data.decode('utf-8', 'replace').rstrip('\n').replace('\t', ' ').split('\n')[1:]
+ self.swaps = [Swaps.__split(line) for line in data]
+
+
+ @staticmethod
+ def __split(line):
+ return [field for field in line.split(' ') if not field == '']
+