mirror of
https://github.com/gryf/wmdocklib.git
synced 2025-12-18 20:10:23 +01:00
1569327 release 1.1 is broken
trying to clean up things. wmdocklib now contains the modules to install. examples all the scripts. only pywmhdmon.py has been tested.
This commit is contained in:
@@ -1,8 +0,0 @@
|
|||||||
1. If you don't have pywmgeneral installed, install it first. Can be found
|
|
||||||
at http://pywmdockapps.sourceforge.net.
|
|
||||||
|
|
||||||
2. Copy pywmhdmon.py to somewhere in your path (like ~/bin or
|
|
||||||
/usr/local/bin).
|
|
||||||
|
|
||||||
3. Copy the sample.pywmhdmonrc to ~/.pywmhdmonrc and edit as you like.
|
|
||||||
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
[WHAT]
|
|
||||||
pywmhdmon is a WindowMaker dockapp that displays the available space on
|
|
||||||
up to four of your filesystems. It also contains a bar showing the
|
|
||||||
current HD activity. It currently only works on system which has a
|
|
||||||
/proc/stat like file. The application is easy to configure, invoke it
|
|
||||||
with --help or see the sample rc-file for more information.
|
|
||||||
|
|
||||||
[WHY]
|
|
||||||
As usual, I didn't find a dockapp that fitted me. And I really like to
|
|
||||||
see the current disk activity since my disks are so quiet that I can't
|
|
||||||
hear when they work.
|
|
||||||
|
|
||||||
[BUGS]
|
|
||||||
The activity bar does not work with the proc filesystem that comes with
|
|
||||||
the 2.6 kernels. It is just a matter of rewriting the app to parse the
|
|
||||||
new format, but I'm low on time personally.
|
|
||||||
|
|
||||||
[CONTACT]
|
|
||||||
Contact me with anything regarding this program, see
|
|
||||||
http://pywmdockapps.sourceforge.net/ for ways to do this.
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
from pywmhdmon import *
|
|
||||||
@@ -1,589 +0,0 @@
|
|||||||
#!/usr/bin/env python2.3
|
|
||||||
|
|
||||||
"""pywmhdmon.py
|
|
||||||
|
|
||||||
WindowMaker dockapp to monitor the free space on your partitions and
|
|
||||||
the disk activity.
|
|
||||||
|
|
||||||
Copyright (C) 2003 Kristoffer Erlandsson
|
|
||||||
|
|
||||||
Licensed under the GNU General Public License.
|
|
||||||
|
|
||||||
|
|
||||||
Changes
|
|
||||||
|
|
||||||
2005-09-02 Mario Frasca
|
|
||||||
added -s option for skipping an amount of configuration items.
|
|
||||||
changed some single quotes to double quotes for use in emacs.
|
|
||||||
updated the rc sample file
|
|
||||||
|
|
||||||
2004-07-16 Mario Frasca
|
|
||||||
recognizes unmounted partitions.
|
|
||||||
configurable mouse actions.
|
|
||||||
'used' information for read-only media.
|
|
||||||
recognizes #-started numerical-coded colors.
|
|
||||||
|
|
||||||
2003-09-01 Kristoffer Erlandsson
|
|
||||||
Fixed a bug where the numbers wouldn't show if they were between 1000 and 1024.
|
|
||||||
|
|
||||||
2003-06-25 Kristoffer Erlandsson
|
|
||||||
Fixed a bug where a mouse click caused the app to enter an infinite loop
|
|
||||||
|
|
||||||
2003-06-24 Kristoffer Erlandsson
|
|
||||||
Additional fine tuning
|
|
||||||
|
|
||||||
2003-06-23 Kristoffer Erlandsson
|
|
||||||
First working version
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
usage = '''pywmhdmon.py [options]
|
|
||||||
Available options are:
|
|
||||||
-h, --help print this help
|
|
||||||
-t, --textcolor <color> set the text color
|
|
||||||
-f, --barfgcolor <color> set the foregroundcolor of the act. bar
|
|
||||||
-g, --barbgcolor <color> set the background color of the act. bar
|
|
||||||
-b, --background <color> set the background color
|
|
||||||
-r, --rgbfile <file> set the rgb file to get color codes from
|
|
||||||
-c, --configfile <file> set the config file to use
|
|
||||||
-p, --procstat <file> set the location of /proc/stat
|
|
||||||
-s, --skipconf <num> determines how many configuration items to skip
|
|
||||||
'''
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import time
|
|
||||||
import getopt
|
|
||||||
import os
|
|
||||||
|
|
||||||
from pywmgeneral import pywmhelpers
|
|
||||||
|
|
||||||
width = 64
|
|
||||||
height = 64
|
|
||||||
|
|
||||||
xOffset = 4
|
|
||||||
yOffset = 4
|
|
||||||
|
|
||||||
lettersStartX = 0
|
|
||||||
lettersStartY = 74
|
|
||||||
letterWidth = 6
|
|
||||||
letterHeight = 8
|
|
||||||
|
|
||||||
digitsStartX = 0
|
|
||||||
digitsStartY = 64
|
|
||||||
digitWidth = 6
|
|
||||||
digitHeight = 8
|
|
||||||
|
|
||||||
graphStartX = 7
|
|
||||||
graphStartY = 53
|
|
||||||
graphHeight = 4
|
|
||||||
|
|
||||||
graphBgStartX = 72
|
|
||||||
graphBgStartY = 53
|
|
||||||
|
|
||||||
graphLineStartX = 66
|
|
||||||
graphLineStartY = 58
|
|
||||||
|
|
||||||
letters = 'abcdefghijklmnopqrstuvwxyz'
|
|
||||||
digits = '0123456789:/-%. '
|
|
||||||
|
|
||||||
defaultConfigFile = os.environ['HOME']+'/.pywmhdmonrc'
|
|
||||||
defaultRGBFiles = ('/usr/lib/X11/rgb.txt', '/usr/X11R6/lib/X11/rgb.txt')
|
|
||||||
defaultProcStat = '/proc/stat'
|
|
||||||
displayModes = ('bar', 'percent', 'free', 'used')
|
|
||||||
defaultMode = 'bar'
|
|
||||||
|
|
||||||
hdmon = None
|
|
||||||
|
|
||||||
class NotMounted(OSError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class PywmHDMon:
|
|
||||||
def __init__(self, pathsToMonitor, procStat='/proc/stat', actMonEnabled=1, skipping=0):
|
|
||||||
self._pathsToMonitor = pathsToMonitor
|
|
||||||
self._actMonEnabled = actMonEnabled
|
|
||||||
self._skipping = skipping
|
|
||||||
|
|
||||||
self._statFile = procStat
|
|
||||||
self._maxIODiff = 0
|
|
||||||
self._lastIO = -1
|
|
||||||
|
|
||||||
def addString(self, s, x, y):
|
|
||||||
try:
|
|
||||||
pywmhelpers.addString(s, x, y, letterWidth, letterHeight,
|
|
||||||
lettersStartX, lettersStartY, letters, digitWidth,
|
|
||||||
digitHeight, digitsStartX, digitsStartY, digits,
|
|
||||||
xOffset, yOffset, width, height)
|
|
||||||
except ValueError, e:
|
|
||||||
sys.stderr.write('Error when painting string:\n' + str(e) + '\n')
|
|
||||||
sys.exit(3)
|
|
||||||
|
|
||||||
def getHdInfo(self, path):
|
|
||||||
"""Get the free and total space of the filesystem which path is on.
|
|
||||||
|
|
||||||
Return a tuple with (<total space>, <free space>) in bytes. Raise
|
|
||||||
OSError if we can't stat the path. Raise NotMounted if not mounted.
|
|
||||||
These operations are quite costly, not adviced to perform these checks
|
|
||||||
more than once every 10 seconds.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# check if is mounted <- st_dev(/mount/point) == st_dev(/mount)
|
|
||||||
if path is not '/':
|
|
||||||
statOwn = os.stat(path)
|
|
||||||
|
|
||||||
# the following is a bit ugly: it removes the trailing
|
|
||||||
# dirname from the mount point. split by '/', leave the
|
|
||||||
# last string, join back, check for empty string.
|
|
||||||
statCnt = os.stat('/'.join(path.split('/')[:-1]) or '/')
|
|
||||||
if statOwn[2] == statCnt[2]:
|
|
||||||
raise NotMounted
|
|
||||||
stat = os.statvfs(path)
|
|
||||||
blockSize = stat.f_bsize
|
|
||||||
availableBlocks = stat.f_bavail
|
|
||||||
totalBlocks = stat.f_blocks
|
|
||||||
free = blockSize * availableBlocks
|
|
||||||
total = blockSize * totalBlocks
|
|
||||||
return (total, free)
|
|
||||||
|
|
||||||
def paintGraph(self, percentFilled, x, y, w, thin=None):
|
|
||||||
'''Paint a graph with percentFilled percent filled.
|
|
||||||
|
|
||||||
Paint at position x, y and with width w.
|
|
||||||
if thin == 1, make it a thin line instead of a block.
|
|
||||||
'''
|
|
||||||
paintWidth = int(round(percentFilled/100.0 * w))
|
|
||||||
if paintWidth > 0:
|
|
||||||
pywmhelpers.copyXPMArea(
|
|
||||||
graphLineStartX, graphLineStartY, paintWidth, thin or graphHeight,
|
|
||||||
x + xOffset, y + yOffset)
|
|
||||||
if w - paintWidth > 0:
|
|
||||||
pywmhelpers.copyXPMArea(
|
|
||||||
graphBgStartX, graphBgStartY, w - paintWidth, thin or graphHeight,
|
|
||||||
x + paintWidth + xOffset, y + yOffset)
|
|
||||||
|
|
||||||
def getY(self, line):
|
|
||||||
return 2 + (line - 1) * (letterHeight + 3)
|
|
||||||
|
|
||||||
def paintLabel(self, line, label):
|
|
||||||
self.addString(label, 1, self.getY(line))
|
|
||||||
|
|
||||||
def paintHdData(self, line, data, mode):
|
|
||||||
total, free = data
|
|
||||||
xStart = width - xOffset - 6 * letterWidth - 1
|
|
||||||
if total==0:
|
|
||||||
self.addString(' ', xStart, self.getY(line))
|
|
||||||
self.paintGraph(0, xStart, self.getY(line) + 4,
|
|
||||||
width - xOffset*2 - xStart - 2,
|
|
||||||
thin=1)
|
|
||||||
pass
|
|
||||||
elif mode == 'percent':
|
|
||||||
percent = (float(free) / float(total)) * 100.0
|
|
||||||
percentStr = (str(int(round(percent))) + '%').rjust(5)
|
|
||||||
self.addString(percentStr, xStart, self.getY(line))
|
|
||||||
elif mode == 'used':
|
|
||||||
totalStr = bytesToStr(total).rjust(5)
|
|
||||||
self.addString(totalStr, xStart, self.getY(line))
|
|
||||||
elif mode == 'free':
|
|
||||||
freeStr = bytesToStr(free).rjust(5)
|
|
||||||
self.addString(freeStr, xStart, self.getY(line))
|
|
||||||
elif mode == 'bar':
|
|
||||||
percentUsed = (float(total - free) / float(total)) * 100.0
|
|
||||||
self.paintGraph(percentUsed, xStart, self.getY(line) + 2,
|
|
||||||
width - xOffset*2 - xStart - 2)
|
|
||||||
else:
|
|
||||||
sys.stderr.write('Unknown display mode: %s, ignoring data.\n'
|
|
||||||
% mode)
|
|
||||||
def getHdActivity(self):
|
|
||||||
"""Return the current hd activity in percent.
|
|
||||||
|
|
||||||
Return how many percent of the max achieved activity during the
|
|
||||||
program's lifetime the current activity is. However, every time
|
|
||||||
this method is called we decrease the max achieved activity a
|
|
||||||
little bit to get a bit less affected by spikes. I think the
|
|
||||||
interesting thing is to see if the hard drive is active, not
|
|
||||||
really exactly how active.
|
|
||||||
"""
|
|
||||||
|
|
||||||
statFile = file(self._statFile, 'r')
|
|
||||||
diskIoStartTag = 'disk_io: '
|
|
||||||
ioLine = None
|
|
||||||
for line in statFile:
|
|
||||||
if line.startswith(diskIoStartTag):
|
|
||||||
ioLine = line
|
|
||||||
statFile.close()
|
|
||||||
if ioLine is None:
|
|
||||||
# Can't get HD activity
|
|
||||||
sys.stderr.write("Can't get hd activity from %s\n" %
|
|
||||||
self._statFile)
|
|
||||||
return 0.0
|
|
||||||
ioLine = ioLine[len(diskIoStartTag):]
|
|
||||||
disks = ioLine.split()
|
|
||||||
currIO = 0
|
|
||||||
for disk in disks:
|
|
||||||
dataPart = disk.split(':')[1].strip(')(')
|
|
||||||
infos = dataPart.split(',')
|
|
||||||
blocksRead = long(infos[2])
|
|
||||||
blocksWritten = long(infos[4])
|
|
||||||
currIO += blocksRead + blocksWritten
|
|
||||||
if self._lastIO == -1:
|
|
||||||
self._lastIO = currIO
|
|
||||||
currDiff = currIO - self._lastIO
|
|
||||||
self._lastIO = currIO
|
|
||||||
if currDiff > self._maxIODiff:
|
|
||||||
self._maxIODiff = currDiff
|
|
||||||
if self._maxIODiff <= 0:
|
|
||||||
self._maxIODiff = 0
|
|
||||||
return 0.0
|
|
||||||
currAct = (float(currDiff) / float(self._maxIODiff)) * 100.0
|
|
||||||
self._maxIODiff -= 1 # So spikes won't affect us too much.
|
|
||||||
return currAct
|
|
||||||
|
|
||||||
def updateHdActivity(self):
|
|
||||||
currentAct = self.getHdActivity()
|
|
||||||
self.paintGraph(currentAct, 3, height - yOffset*2 - 3 - graphHeight,
|
|
||||||
width - 2 * xOffset - 6)
|
|
||||||
|
|
||||||
def _checkEvents(self):
|
|
||||||
event = pywmhelpers.getEvent()
|
|
||||||
while event is not None:
|
|
||||||
if event['type'] == 'destroynotify':
|
|
||||||
sys.exit(0)
|
|
||||||
elif event['type'] == 'buttonrelease':
|
|
||||||
area = pywmhelpers.checkMouseRegion(event['x'],event['y'])
|
|
||||||
if area is not -1:
|
|
||||||
action = self._pathsToMonitor[area-1+self._skipping][3]
|
|
||||||
if action:
|
|
||||||
os.spawnvp(os.P_NOWAIT, action[0], action)
|
|
||||||
event = pywmhelpers.getEvent()
|
|
||||||
|
|
||||||
def updateMonitoredPaths(self):
|
|
||||||
index = 0
|
|
||||||
pageoffset = self._skipping
|
|
||||||
for i in self._pathsToMonitor:
|
|
||||||
index += 1
|
|
||||||
if index < pageoffset+1:
|
|
||||||
continue
|
|
||||||
if i is not None:
|
|
||||||
label, path, mode, action = i
|
|
||||||
self.paintLabel(index-pageoffset, label)
|
|
||||||
try:
|
|
||||||
hdData = self.getHdInfo(path)
|
|
||||||
except NotMounted:
|
|
||||||
hdData = (0, 0)
|
|
||||||
except OSError, e:
|
|
||||||
sys.stderr.write(
|
|
||||||
"Can't get hd data from %s: %s\n" % (path, str(e)))
|
|
||||||
hdData = (0, 0)
|
|
||||||
self.paintHdData(index-pageoffset, hdData, mode)
|
|
||||||
if index - pageoffset == 5:
|
|
||||||
break
|
|
||||||
|
|
||||||
def mainLoop(self):
|
|
||||||
self.updateMonitoredPaths()
|
|
||||||
while 1:
|
|
||||||
self._checkEvents()
|
|
||||||
if self._actMonEnabled:
|
|
||||||
self.updateHdActivity()
|
|
||||||
pywmhelpers.redraw()
|
|
||||||
time.sleep(0.1)
|
|
||||||
|
|
||||||
|
|
||||||
import signal
|
|
||||||
def handler(num, frame):
|
|
||||||
hdmon.updateMonitoredPaths()
|
|
||||||
signal.alarm(10)
|
|
||||||
|
|
||||||
def parseCommandLine(argv):
|
|
||||||
'''Parse the commandline. Return a dictionary with options and values.'''
|
|
||||||
shorts = 'ht:f:g:b:r:c:p:s:'
|
|
||||||
longs = ['help', 'textcolor=', 'background=', 'barfgcolor=',
|
|
||||||
'rgbfile=', 'configfile=', 'barbgcolor=', 'procstat=',
|
|
||||||
'skipconf=']
|
|
||||||
try:
|
|
||||||
opts, nonOptArgs = getopt.getopt(argv[1:], shorts, longs)
|
|
||||||
except getopt.GetoptError, e:
|
|
||||||
sys.stderr.write('Error when parsing commandline: ' + str(e) + '\n')
|
|
||||||
sys.stderr.write(usage)
|
|
||||||
sys.exit(2)
|
|
||||||
d = {}
|
|
||||||
for o, a in opts:
|
|
||||||
if o in ('-h', '--help'):
|
|
||||||
sys.stdout.write(usage)
|
|
||||||
sys.exit(0)
|
|
||||||
if o in ('-t', '--textcolor'):
|
|
||||||
d['textcolor'] = a
|
|
||||||
if o in ('-b', '--background'):
|
|
||||||
d['background'] = a
|
|
||||||
if o in ('-r', '--rgbfile'):
|
|
||||||
d['rgbfile'] = a
|
|
||||||
if o in ('-c', '--configfile'):
|
|
||||||
d['configfile'] = a
|
|
||||||
if o in ('-g', '--barbgcolor'):
|
|
||||||
d['barbgcolor'] = a
|
|
||||||
if o in ('-f', '--barfgcolor'):
|
|
||||||
d['barfgcolor'] = a
|
|
||||||
if o in ('-p', '--procstat'):
|
|
||||||
d['procstat'] = a
|
|
||||||
if o in ('-s', '--skipconf'):
|
|
||||||
d['skipconf'] = a
|
|
||||||
return d
|
|
||||||
|
|
||||||
def parseColors(defaultRGBFileList, config, xpm):
|
|
||||||
rgbFileName = ''
|
|
||||||
for fn in defaultRGBFileList:
|
|
||||||
if os.access(fn, os.R_OK):
|
|
||||||
rgbFileName = fn
|
|
||||||
break
|
|
||||||
rgbFileName = config.get('rgbfile', rgbFileName)
|
|
||||||
useColors = 1
|
|
||||||
if not os.access(rgbFileName, os.R_OK):
|
|
||||||
sys.stderr.write(
|
|
||||||
"Can't read the RGB file, try setting it differently using -r,\n")
|
|
||||||
sys.stderr.write(
|
|
||||||
"Ignoring your color settings, using the defaults.\n")
|
|
||||||
useColors = 0
|
|
||||||
if useColors:
|
|
||||||
# Colors is a list with (<config_key>, <xpm-key>) pairs.
|
|
||||||
colors = (('barfgcolor', 'graph'),
|
|
||||||
('barbgcolor', 'graphbg'),
|
|
||||||
('textcolor', 'text'),
|
|
||||||
('background', 'background'))
|
|
||||||
for key, value in colors:
|
|
||||||
col = config.get(key)
|
|
||||||
if not col is None:
|
|
||||||
if col[0] is '#': code=col
|
|
||||||
else: code = pywmhelpers.getColorCode(col, rgbFileName)
|
|
||||||
if code is None:
|
|
||||||
sys.stderr.write('Bad colorcode for %s, ignoring.\n' % key)
|
|
||||||
else:
|
|
||||||
pywmhelpers.setColor(xpm, value, code)
|
|
||||||
|
|
||||||
def makeNumDigits(num, numDigits):
|
|
||||||
'''Make a floating point number a certain number of digits, including
|
|
||||||
decimal. Return a string containing it.
|
|
||||||
'''
|
|
||||||
lenOfIntPart = len(str(int(num)))
|
|
||||||
if lenOfIntPart > numDigits:
|
|
||||||
# Can't convert a number to less digits then it's integer part...
|
|
||||||
return ''
|
|
||||||
decimalsNeeded = numDigits - lenOfIntPart
|
|
||||||
s = '%' + str(lenOfIntPart) + '.' + str(decimalsNeeded) + 'f'
|
|
||||||
s = s % round(num, decimalsNeeded)
|
|
||||||
return s
|
|
||||||
|
|
||||||
def bytesToStr(bytes):
|
|
||||||
"""Convert a number of bytes to a nice printable string.
|
|
||||||
|
|
||||||
May raise ValueError if bytes can't be seen as an float.
|
|
||||||
"""
|
|
||||||
bytes = float(bytes)
|
|
||||||
kb = 1024
|
|
||||||
mb = 1024 * 1024
|
|
||||||
gb = 1024 * mb
|
|
||||||
tb = 1024 * gb
|
|
||||||
pb = 1024 * tb
|
|
||||||
if bytes < kb:
|
|
||||||
size = bytes
|
|
||||||
letter = 'B'
|
|
||||||
#return makeNumDigits(bytes, numDigits) + 'B'
|
|
||||||
elif bytes < mb:
|
|
||||||
size = bytes / kb
|
|
||||||
letter = 'k'
|
|
||||||
#return makeNumDigits(bytes/kb, numDigits) + 'k'
|
|
||||||
elif bytes < gb:
|
|
||||||
size = bytes / mb
|
|
||||||
letter = 'M'
|
|
||||||
#return makeNumDigits(bytes/mb, numDigits) + 'M'
|
|
||||||
elif bytes < tb:
|
|
||||||
size = bytes / gb
|
|
||||||
letter = 'G'
|
|
||||||
#return makeNumDigits(bytes/gb, numDigits) + 'G'
|
|
||||||
elif bytes < pb:
|
|
||||||
size = bytes / tb
|
|
||||||
letter = 'T'
|
|
||||||
#return makeNumDigits(bytes/tb, numDigits) + 'T'
|
|
||||||
else:
|
|
||||||
size = bytes / pb
|
|
||||||
letter = 'p'
|
|
||||||
#return makeNumDigits(bytes/pb, numDigits) + 'P'
|
|
||||||
if size >= 1000:
|
|
||||||
res = makeNumDigits(size, 4)
|
|
||||||
else:
|
|
||||||
res = makeNumDigits(size, 3)
|
|
||||||
res += letter
|
|
||||||
return res
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
clConfig = parseCommandLine(sys.argv)
|
|
||||||
configFile = clConfig.get('configfile', defaultConfigFile)
|
|
||||||
configFile = os.path.expanduser(configFile)
|
|
||||||
fileConfig = pywmhelpers.readConfigFile(configFile, sys.stderr)
|
|
||||||
config = fileConfig
|
|
||||||
for i in clConfig.iteritems():
|
|
||||||
config[i[0]] = i[1]
|
|
||||||
parseColors(defaultRGBFiles, config, xpm)
|
|
||||||
|
|
||||||
pathsToMonitor = []
|
|
||||||
for i in range(1,1000):
|
|
||||||
labelStr = str(i) + '.label'
|
|
||||||
pathStr = str(i) + '.path'
|
|
||||||
modeStr = str(i) + '.displaymode'
|
|
||||||
actionStr = str(i) + '.action'
|
|
||||||
label = config.get(labelStr)
|
|
||||||
if not label: break
|
|
||||||
path = config.get(pathStr)
|
|
||||||
action = config.get(actionStr)
|
|
||||||
if action: action=eval(action)
|
|
||||||
displayMode = config.get(modeStr, defaultMode)
|
|
||||||
if not displayMode in displayModes:
|
|
||||||
sys.stderr.write(
|
|
||||||
'Unknown display mode: %s, using default.\n' % displayMode)
|
|
||||||
displayMode = defaultMode
|
|
||||||
pathsToMonitor.append((label[:3], path, displayMode, action))
|
|
||||||
pywmhelpers.addMouseRegion(i,
|
|
||||||
8, 8 + (i - 1) * (letterHeight + 3),
|
|
||||||
58, 4 + i * (letterHeight + 3))
|
|
||||||
procStat = config.get('procstat', defaultProcStat)
|
|
||||||
skipping = int(config.get('skipconf', 0))
|
|
||||||
actMonEnabled = int(config.get('monitoring'))
|
|
||||||
if not os.access(procStat, os.R_OK):
|
|
||||||
sys.stderr.write(
|
|
||||||
"Can't read your procstat file, try setting it with -p. ")
|
|
||||||
sys.stderr.write("Disabling the HD activity bar.\n")
|
|
||||||
actMonEnabled = 0
|
|
||||||
try:
|
|
||||||
programName = sys.argv[0].split(os.sep)[-1]
|
|
||||||
except IndexError:
|
|
||||||
programName = ''
|
|
||||||
sys.argv[0] = programName
|
|
||||||
pywmhelpers.setDefaultPixmap(xpm)
|
|
||||||
pywmhelpers.openXwindow(sys.argv, width, height)
|
|
||||||
|
|
||||||
signal.signal(signal.SIGCHLD, handler)
|
|
||||||
signal.signal(signal.SIGALRM, handler)
|
|
||||||
signal.alarm(10)
|
|
||||||
|
|
||||||
global hdmon
|
|
||||||
hdmon = PywmHDMon(pathsToMonitor, procStat, actMonEnabled, skipping)
|
|
||||||
hdmon.mainLoop()
|
|
||||||
|
|
||||||
|
|
||||||
xpm = \
|
|
||||||
['160 100 13 1',
|
|
||||||
' \tc #208120812081',
|
|
||||||
'.\tc #00000000FFFF',
|
|
||||||
'o\tc #C71BC30BC71B',
|
|
||||||
'O\tc #861782078E38',
|
|
||||||
'+\tc #EFBEF3CEEFBE',
|
|
||||||
'@\tc #618561856185',
|
|
||||||
'#\tc #9E79A2899E79',
|
|
||||||
'$\tc #410341034103',
|
|
||||||
'o\tc #2020b2b2aaaa s indicator',
|
|
||||||
'/\tc #2020b2b2aaaa s graph',
|
|
||||||
'-\tc #707070707070 s graphbg',
|
|
||||||
'X\tc #000000000000 s background',
|
|
||||||
'%\tc #2081B2CAAEBA s text',
|
|
||||||
' ...............................................................................................',
|
|
||||||
' .///..XXX..ooo..XXX..XXX.......................................................................',
|
|
||||||
' .///..XXX..ooo..XXX..XXX.......................................................................',
|
|
||||||
' .///..XXX..ooo..XXX..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..ooo..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..ooo..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..ooo..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..ooo.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..ooo.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..ooo.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...-------------------------------------------------------------------------------------...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...-------------------------------------------------------------------------------------...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...-------------------------------------------------------------------------------------...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...-------------------------------------------------------------------------------------...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///////////////////////////////////////////////////////////////////////////////////////////...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///////////////////////////////////////////////////////////////////////////////////////////...',
|
|
||||||
' .///////////////////////////////////////////////////////////////////////////////////////////...',
|
|
||||||
' .///////////////////////////////////////////////////////////////////////////////////////////...',
|
|
||||||
' ...............................................................................................',
|
|
||||||
' ...............................................................................................',
|
|
||||||
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%%%%%XXX%XXX%%%%%X%%%%%X%XXX%X%%%%%X%%%%%X%%%%%X%%%%%X%%%%%XXXXXXXXXX%XXXXXXXXXX%X%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XX%%XXXXXXX%XXXXX%X%XXX%X%XXXXX%XXXXXXXXX%X%XXX%X%XXX%XX%%XXXXXX%XXXXXXXXXXXX%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XXX%XXXXXXX%XXXXX%X%XXX%X%XXXXX%XXXXXXXXX%X%XXX%X%XXX%XX%%XXXXX%%XXXXXXXXXXX%%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XXX%XXX%%%%%XX%%%%X%%%%%X%%%%%X%%%%%XXXXX%X%%%%%X%%%%%XXXXXXXXX%XXX%%%%%XXXX%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XXX%XXX%XXXXXXXXX%XXXXX%XXXXX%X%XXX%XXXXX%X%XXX%XXXXX%XXXXXXXX%%XXXXXXXXXXX%%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XXX%XXX%XXXXXXXXX%XXXXX%XXXXX%X%XXX%XXXXX%X%XXX%XXXXX%XX%%XXXX%XXXXXXXXXXXX%XXXXX%%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%%%%%XX%%%XX%%%%%X%%%%%XXXXX%X%%%%%X%%%%%XXXXX%X%%%%%X%%%%%XX%%XXXX%XXXXXXXXXXXX%X%XXX%%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
|
|
||||||
'XX%%%XX%%%%XXX%%%%X%%%%XX%%%%XX%%%%%X%%%%%X%XXX%XXX%XXXXXXX%X%XXX%X%XXXXX%XXX%X%%%%XX%%%%%X%%%%%X%%%%%X%%%%%X%%%%%X%%%%%X%XXX%X%XXX%X%XXX%X%XXX%X%XXX%X%%%%%XXXX',
|
|
||||||
'X%XXX%X%XXX%X%XXXXX%XXX%X%XXXXX%XXXXX%XXXXX%XXX%XXX%XXXXXXX%X%XXX%X%XXXXX%%X%%X%XXX%X%XXX%X%XXX%X%XXX%X%XXX%X%XXXXXXX%XXX%XXX%X%XXX%X%XXX%X%XXX%X%XXX%XXXXX%XXXX',
|
|
||||||
'X%XXX%X%XXX%X%XXXXX%XXX%X%XXXXX%XXXXX%XXXXX%XXX%XXX%XXXXXXX%X%XX%XX%XXXXX%X%X%X%XXX%X%XXX%X%XXX%X%XXX%X%XXX%X%XXXXXXX%XXX%XXX%X%XXX%X%XXX%XX%X%XX%XXX%XXXX%XXXXX',
|
|
||||||
'X%%%%%X%%%%XX%XXXXX%XXX%X%%%%XX%%%%XX%X%%%X%%%%%XXX%XXXXXXX%X%%%XXX%XXXXX%XXX%X%XXX%X%XXX%X%%%%%X%%XX%X%%%%XX%%%%%XXX%XXX%XXX%X%XXX%X%XXX%XXX%XXX%%%%%XXX%XXXXXX',
|
|
||||||
'X%XXX%X%XXX%X%XXXXX%XXX%X%XXXXX%XXXXX%XXX%X%XXX%XXX%XXXXXXX%X%XX%XX%XXXXX%XXX%X%XXX%X%XXX%X%XXXXX%X%X%X%XXX%XXXXX%XXX%XXX%XXX%X%XXX%X%X%X%XX%X%XXXXXX%XX%XXXXXXX',
|
|
||||||
'X%XXX%X%XXX%X%XXXXX%XXX%X%XXXXX%XXXXX%XXX%X%XXX%XXX%XXX%XXX%X%XXX%X%XXXXX%XXX%X%XXX%X%XXX%X%XXXXX%XX%%X%XXX%XXXXX%XXX%XXX%XXX%X%XXX%X%%X%%X%XXX%XXXXX%X%XXXXXXXX',
|
|
||||||
'X%XXX%X%%%%XXX%%%%X%%%%XX%%%%XX%XXXXX%%%%%X%XXX%XXX%XXXX%%%XX%XXX%X%%%%XX%XXX%X%XXX%X%%%%%X%XXXXX%%%%%X%XXX%X%%%%%XXX%XXXX%%%%XX%%%XX%XXX%X%XXX%X%%%%%X%%%%%XXXX',
|
|
||||||
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................']
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
[DEFAULT]
|
|
||||||
|
|
||||||
# Displaymodes are used, free, percent or bar, displays the used size,
|
|
||||||
# free size, free percent and a bar representing space, respectively.
|
|
||||||
|
|
||||||
1.label=/
|
|
||||||
1.path=/
|
|
||||||
#1.displaymode=free
|
|
||||||
|
|
||||||
2.label=usr
|
|
||||||
2.path=/usr
|
|
||||||
#2.displaymode=free
|
|
||||||
|
|
||||||
3.label=home
|
|
||||||
3.path=/home
|
|
||||||
#3.displaymode=free
|
|
||||||
|
|
||||||
4.label=cd
|
|
||||||
4.path=/mnt/cd
|
|
||||||
4.displaymode=used
|
|
||||||
4.action=['/home/mario/bin/tmount', '/mnt/cd', 'eject']
|
|
||||||
|
|
||||||
5.label=jr
|
|
||||||
5.path=/mnt/jr
|
|
||||||
5.displaymode=used
|
|
||||||
5.action=['/home/mario/bin/tmount', '/mnt/jr', 'eject']
|
|
||||||
|
|
||||||
6.label=sm
|
|
||||||
6.path=/mnt/sm
|
|
||||||
6.displaymode=free
|
|
||||||
6.action=['/home/mario/bin/tmount', '/mnt/sm']
|
|
||||||
|
|
||||||
7.label=cf
|
|
||||||
7.path=/mnt/cf
|
|
||||||
7.displaymode=free
|
|
||||||
7.action=['/home/mario/bin/tmount', '/mnt/cf']
|
|
||||||
|
|
||||||
8.label=flo
|
|
||||||
8.path=/mnt/flo
|
|
||||||
8.displaymode=free
|
|
||||||
8.action=['/home/mario/bin/tmount', '/mnt/flo']
|
|
||||||
|
|
||||||
textcolor=light sea green
|
|
||||||
background=black
|
|
||||||
barfgcolor=light sea green
|
|
||||||
barbgcolor=grey45
|
|
||||||
monitoring=0
|
|
||||||
|
|
||||||
#rgbfile=/usr/lib/X11/rgb.txt
|
|
||||||
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# tmount - toggle mount / eject
|
|
||||||
#
|
|
||||||
# usage: tmount mountpoint ejectable
|
|
||||||
#
|
|
||||||
# parameter mountpoint: the mount point, without trailing '/'
|
|
||||||
# ejectable: not empty indicates that the media is software ejectable
|
|
||||||
# action: if the indicated file system is not mounted, mounts it
|
|
||||||
# otherwise unmounts it
|
|
||||||
# if mounting fails or when unmounting, ejects software ejectable
|
|
||||||
# media.
|
|
||||||
|
|
||||||
if [ "$2" == "" ]; then eject=echo
|
|
||||||
else eject=eject
|
|
||||||
fi
|
|
||||||
|
|
||||||
mountpointIndicated=$1
|
|
||||||
mountpointFound=`df $1 | tail -1 | cut -d% -f2`
|
|
||||||
|
|
||||||
if [ $mountpointIndicated = $mountpointFound ]
|
|
||||||
then
|
|
||||||
|
|
||||||
umount $mountpointIndicated
|
|
||||||
$eject $mountpointIndicated
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
# my smartmedia does not mount correctly after a media change
|
|
||||||
# second try always succeeds. ask me why! if neither mount
|
|
||||||
# attempt succeeds, then attempt ejecting ejectable media
|
|
||||||
|
|
||||||
mount $mountpointIndicated || mount $mountpointIndicated || $eject $mountpointIndicated
|
|
||||||
|
|
||||||
fi
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
1. If you don't have pywmgeneral installed, install it first. Can be found
|
|
||||||
at http://pywmdockapps.sourceforge.net
|
|
||||||
|
|
||||||
2. Copy pywmseti.py to somewhere in your path (like ~/bin or
|
|
||||||
/usr/local/bin).
|
|
||||||
|
|
||||||
3. Copy the sample.pywmseti to ~/.pywmseti and edit as you like.
|
|
||||||
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
[WHAT]
|
|
||||||
Pywmseti is an WindowMaker dockapp for monitoring your seti@home progress.
|
|
||||||
The application displays how many workunits you have done and the progress
|
|
||||||
on the current one. You start/stop the seti@home process by simply clicking
|
|
||||||
anywhere in the application. It also displays the time spent on the workunit
|
|
||||||
(or since you started the program if you restart it in the middle of a
|
|
||||||
workunit). Invoke the program with --help or see the sample rc-file for
|
|
||||||
more information about customization.
|
|
||||||
|
|
||||||
[WHY]
|
|
||||||
No one of the existing monitors suited my needs. And the more Python the
|
|
||||||
world gets, the better it'll be! ;)
|
|
||||||
|
|
||||||
[CONTACT]
|
|
||||||
Mail anything related to this program to me, Mario Frasca <mfrasca@interia.pl>
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
from pywmseti import *
|
|
||||||
@@ -1,551 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
'''pywmseti.py
|
|
||||||
|
|
||||||
WindowMaker dockapp to monitor the progress of your seti@home.
|
|
||||||
|
|
||||||
Copyright (C) 2003 Kristoffer Erlandsson
|
|
||||||
|
|
||||||
Licensed under the GNU General Public License.
|
|
||||||
|
|
||||||
|
|
||||||
Changes
|
|
||||||
|
|
||||||
2003-06-24 Kristoffer Erlandsson
|
|
||||||
Added event handling for graceful shutdown
|
|
||||||
|
|
||||||
2003-06-17 Kristoffer Erlandsson
|
|
||||||
First workingish version
|
|
||||||
|
|
||||||
'''
|
|
||||||
usage = '''pywmseti.py [options]
|
|
||||||
Available options are:
|
|
||||||
-h, --help print this help
|
|
||||||
-t, --textcolor <color> set the text color
|
|
||||||
-p, --progressbarcolor <color> set the color of the progress bar
|
|
||||||
-g, --barbgcolor <color> set the background color of the progress bar
|
|
||||||
-i, --indicatorcolor <color> set the color of the running indicator
|
|
||||||
-b, --background <color> set the background color
|
|
||||||
-d, --setidir <directory> set the directory where seti@home resides
|
|
||||||
-n, --nice <value> set the nice value to run seti@home with
|
|
||||||
-r, --rgbfile <file> set the rgb file to get color codes from
|
|
||||||
-c, --configfile <file> set the config file to use
|
|
||||||
'''
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import time
|
|
||||||
import getopt
|
|
||||||
import os
|
|
||||||
|
|
||||||
from pywmgeneral import pywmhelpers
|
|
||||||
|
|
||||||
width = 64
|
|
||||||
height = 64
|
|
||||||
|
|
||||||
xOffset = 4
|
|
||||||
yOffset = 4
|
|
||||||
|
|
||||||
lettersStartX = 0
|
|
||||||
lettersStartY = 74
|
|
||||||
letterWidth = 6
|
|
||||||
letterHeight = 8
|
|
||||||
|
|
||||||
digitsStartX = 0
|
|
||||||
digitsStartY = 64
|
|
||||||
digitWidth = 6
|
|
||||||
digitHeight = 8
|
|
||||||
|
|
||||||
graphStartX = 7
|
|
||||||
graphStartY = 53
|
|
||||||
graphLength = 50
|
|
||||||
graphHeight = 4
|
|
||||||
|
|
||||||
graphBgStartX = 72
|
|
||||||
graphBgStartY = 53
|
|
||||||
|
|
||||||
graphLineStartX = 66
|
|
||||||
graphLineStartY = 58
|
|
||||||
|
|
||||||
runningIndX = 71
|
|
||||||
runningIndY = 1
|
|
||||||
runningIndWidth = 3
|
|
||||||
runningIndHeight = 15
|
|
||||||
numRunningInds = 4
|
|
||||||
|
|
||||||
letters = 'abcdefghijklmnopqrstuvwxyz'
|
|
||||||
digits = '0123456789:/-% '
|
|
||||||
|
|
||||||
defaultConfigFile = '~/.pywmsetirc'
|
|
||||||
defaultRGBFiles = ['/usr/lib/X11/rgb.txt', '/usr/X11R6/lib/X11/rgb.txt']
|
|
||||||
|
|
||||||
stateFileName = 'state.sah'
|
|
||||||
uinfoFileName = 'user_info.sah'
|
|
||||||
pidFileName = 'pid.sah'
|
|
||||||
execFileName = 'setiathome'
|
|
||||||
|
|
||||||
class PywmSeti:
|
|
||||||
def __init__(self, statePath, uinfoPath, pidPath, execCmd):
|
|
||||||
self._statePath = statePath
|
|
||||||
self._uinfoPath = uinfoPath
|
|
||||||
self._pidPath = pidPath
|
|
||||||
self._execCmd = execCmd
|
|
||||||
self._currentRunningInd = 0
|
|
||||||
self._lastTime = time.time()
|
|
||||||
self._lastNumResults = -1
|
|
||||||
self._progress = 0
|
|
||||||
|
|
||||||
def addString(self, s, x, y):
|
|
||||||
try:
|
|
||||||
pywmhelpers.addString(s, x, y, letterWidth, letterHeight,
|
|
||||||
lettersStartX, lettersStartY, letters, digitWidth,
|
|
||||||
digitHeight, digitsStartX, digitsStartY, digits,
|
|
||||||
xOffset, yOffset, width, height)
|
|
||||||
except ValueError, e:
|
|
||||||
sys.stderr.write('Error when painting string:\n' + str(e) + '\n')
|
|
||||||
sys.exit(3)
|
|
||||||
|
|
||||||
def getCenterStartPos(self, s):
|
|
||||||
return pywmhelpers.getCenterStartPos(s, letterWidth, width, xOffset)
|
|
||||||
|
|
||||||
def getVertSpacing(self, numLines, margin):
|
|
||||||
return pywmhelpers.getVertSpacing(numLines, margin, height,
|
|
||||||
letterHeight, yOffset)
|
|
||||||
|
|
||||||
def getProgress(self, lines):
|
|
||||||
'''Return the progess of the current workunit.
|
|
||||||
|
|
||||||
Supply the lines of the statefile as argument.
|
|
||||||
'''
|
|
||||||
for line in lines:
|
|
||||||
if line.startswith('prog='):
|
|
||||||
try:
|
|
||||||
progress = float(line.split('=')[-1])
|
|
||||||
except ValueError:
|
|
||||||
progress = 0
|
|
||||||
return progress
|
|
||||||
return 0
|
|
||||||
|
|
||||||
def getNumResults(self, lines):
|
|
||||||
'''Return the number of results produced.
|
|
||||||
|
|
||||||
Supply the lines in the user info file as argument.
|
|
||||||
'''
|
|
||||||
for line in lines:
|
|
||||||
if line.startswith('nresults='):
|
|
||||||
try:
|
|
||||||
results = int(line.split('=')[-1])
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
return results
|
|
||||||
sys.stderr.write(
|
|
||||||
"Error when reading uinfo file! Can't get number of results.\n")
|
|
||||||
return -1
|
|
||||||
|
|
||||||
def pidIsRunning(self, pid):
|
|
||||||
'''Determine if the process with PID pid is running.
|
|
||||||
|
|
||||||
Return 1 if it is running.
|
|
||||||
Return 0 if it is not running.
|
|
||||||
Return -1 if we do not have permission to signal the process
|
|
||||||
This could be slightly non-portal, but I can not find any better
|
|
||||||
way to do it.
|
|
||||||
'''
|
|
||||||
try:
|
|
||||||
os.kill(pid, 0)
|
|
||||||
except OSError, e:
|
|
||||||
if e.errno == 1:
|
|
||||||
return -1
|
|
||||||
return 0
|
|
||||||
return 1
|
|
||||||
|
|
||||||
def openFileRead(self, fileName):
|
|
||||||
try:
|
|
||||||
f = file(fileName, 'r')
|
|
||||||
except IOError, e:
|
|
||||||
sys.stderr.write('Error when opening %s: %s\n' % (fileName, str(e)))
|
|
||||||
return None
|
|
||||||
return f
|
|
||||||
|
|
||||||
|
|
||||||
def paintCurrentRunningIndicator(self):
|
|
||||||
'''Paint the running indicator.
|
|
||||||
'''
|
|
||||||
indX = runningIndX + self._currentRunningInd * \
|
|
||||||
(runningIndWidth + 2)
|
|
||||||
indY = runningIndY
|
|
||||||
w = runningIndWidth
|
|
||||||
h = runningIndHeight
|
|
||||||
targX = width - xOffset - w - 5
|
|
||||||
targY = yOffset + 5
|
|
||||||
pywmhelpers.copyXPMArea(indX, indY, w, h, targX, targY)
|
|
||||||
|
|
||||||
def updateRunning(self):
|
|
||||||
'''Update the information regarding if we got seti@home running or not.
|
|
||||||
|
|
||||||
Return a tuple with (running, startStopenabled).
|
|
||||||
startStopEnabled is 1 if we own the process and got the permissions
|
|
||||||
to start and stop it, or if there is no process running.
|
|
||||||
'''
|
|
||||||
pidFile = self.openFileRead(self._pidPath)
|
|
||||||
if pidFile is None:
|
|
||||||
sys.stderr.write("Can't read pid file")
|
|
||||||
self._running = 0
|
|
||||||
self._startStopEnabled = 0
|
|
||||||
return
|
|
||||||
try:
|
|
||||||
self._pid = int(pidFile.read().strip())
|
|
||||||
except ValueError:
|
|
||||||
sys.stderr.write("Can't get pid from %s.\n" % self._pidPath)
|
|
||||||
self._running = 0
|
|
||||||
self._startStopEnabled = 0
|
|
||||||
return
|
|
||||||
pidFile.close()
|
|
||||||
self._running = self.pidIsRunning(self._pid)
|
|
||||||
if self._running == -1 and self._startStopEnabled:
|
|
||||||
sys.stderr.write(
|
|
||||||
"An other seti@home process which you don't own is running.\n")
|
|
||||||
sys.stderr.write(
|
|
||||||
"Starting and stopping of the process is disabled.\n")
|
|
||||||
self._startStopenabled = 0
|
|
||||||
if self._running == -1:
|
|
||||||
self._running = 1
|
|
||||||
else:
|
|
||||||
# If no process is running (we could have stopped the one
|
|
||||||
# running from an other process), enable starting and stopping.
|
|
||||||
self._startStopEnabled = 1
|
|
||||||
if self._running:
|
|
||||||
self._currentRunningInd = (self._currentRunningInd - 1) \
|
|
||||||
% numRunningInds
|
|
||||||
else:
|
|
||||||
self._currentRunningInd = 0
|
|
||||||
self.paintCurrentRunningIndicator()
|
|
||||||
|
|
||||||
def updateProgress(self):
|
|
||||||
'''Update the progress on the current workunit.'''
|
|
||||||
stateFile = self.openFileRead(self._statePath)
|
|
||||||
if stateFile is None:
|
|
||||||
# Can't open file, probably in progress of gettin a new workunit.
|
|
||||||
progress = 0
|
|
||||||
else:
|
|
||||||
progress = self.getProgress(stateFile.readlines())
|
|
||||||
stateFile.close()
|
|
||||||
self._progress = progress
|
|
||||||
percent = int(progress * 100.0)
|
|
||||||
graphSize = int(round(progress * graphLength))
|
|
||||||
pywmhelpers.copyXPMArea(
|
|
||||||
graphLineStartX, graphLineStartY, graphSize, graphHeight,
|
|
||||||
graphStartX, graphStartY)
|
|
||||||
pywmhelpers.copyXPMArea(
|
|
||||||
graphBgStartX, graphBgStartY, graphLength - graphSize, graphHeight,
|
|
||||||
graphStartX + graphSize, graphStartY)
|
|
||||||
self.addString((str(percent) + '%').ljust(4), 4, 32)
|
|
||||||
|
|
||||||
def updateNumResults(self):
|
|
||||||
'''Update the number of workunits done.'''
|
|
||||||
uinfoFile = self.openFileRead(self._uinfoPath)
|
|
||||||
numResults = self.getNumResults(uinfoFile.readlines())
|
|
||||||
if self._lastNumResults == -1:
|
|
||||||
self._lastNumResults = numResults
|
|
||||||
if numResults != self._lastNumResults and self._progress < 0.03:
|
|
||||||
# If we just got a new number of results and the progress of the
|
|
||||||
# current workunit is under 3%, assume we started working on a new
|
|
||||||
# workunit. The times this could be missleading is if we have an
|
|
||||||
# other seti@home process running on an other computer, but this is
|
|
||||||
# accurate enough I think.
|
|
||||||
self.nextWorkUnitStarted()
|
|
||||||
self._lastNumResults = numResults
|
|
||||||
uinfoFile.close()
|
|
||||||
self.addString(str(numResults)[:7], 4, 4)
|
|
||||||
|
|
||||||
def updateTime(self):
|
|
||||||
'''Update the time line.
|
|
||||||
|
|
||||||
We display the time that we have been on the current work unit, since
|
|
||||||
either the last one was done or since we started the program.
|
|
||||||
'''
|
|
||||||
timeSpent = time.time() - self._lastTime
|
|
||||||
hours = int(timeSpent / 3600)
|
|
||||||
mins = int((timeSpent - hours * 3600) / 60)
|
|
||||||
hours = str(hours)[:3]
|
|
||||||
mins = str(mins).zfill(2)
|
|
||||||
s = (hours + ':' + mins).ljust(6)
|
|
||||||
self.addString(s, 4, 18)
|
|
||||||
|
|
||||||
def nextWorkUnitStarted(self):
|
|
||||||
self._lastTime = time.time()
|
|
||||||
|
|
||||||
def handleMouseClick(self, region):
|
|
||||||
if region == 0:
|
|
||||||
if self._startStopEnabled:
|
|
||||||
if self._running:
|
|
||||||
try:
|
|
||||||
os.kill(self._pid, 15)
|
|
||||||
except OSError, e:
|
|
||||||
sys.stderr.write(
|
|
||||||
"Error when ending process: "+str(e)+'\n')
|
|
||||||
else:
|
|
||||||
os.system(self._execCmd) # Use fork instead?
|
|
||||||
|
|
||||||
def _checkForEvents(self):
|
|
||||||
'''Check for, and handle, X events.'''
|
|
||||||
event = pywmhelpers.getEvent()
|
|
||||||
while not event is None:
|
|
||||||
if event['type'] == 'buttonrelease':
|
|
||||||
region = pywmhelpers.checkMouseRegion(event['x'],
|
|
||||||
event['y'])
|
|
||||||
self.handleMouseClick(region)
|
|
||||||
elif event['type'] == 'destroynotify':
|
|
||||||
sys.exit(0)
|
|
||||||
event = pywmhelpers.getEvent()
|
|
||||||
|
|
||||||
def mainLoop(self):
|
|
||||||
counter = -1
|
|
||||||
self._startStopEnabled = 1
|
|
||||||
while 1:
|
|
||||||
counter += 1
|
|
||||||
self._checkForEvents()
|
|
||||||
if counter % 10 == 0:
|
|
||||||
self.updateRunning()
|
|
||||||
if counter % 100 == 0:
|
|
||||||
self.updateProgress()
|
|
||||||
self.updateNumResults()
|
|
||||||
self.updateTime()
|
|
||||||
if counter == 999999:
|
|
||||||
counter = -1
|
|
||||||
pywmhelpers.redraw()
|
|
||||||
time.sleep(0.1)
|
|
||||||
|
|
||||||
|
|
||||||
def parseCommandLine(argv):
|
|
||||||
'''Parse the commandline. Return a dictionary with options and values.'''
|
|
||||||
shorts = 'ht:b:n:d:r:c:p:g:i:'
|
|
||||||
longs = ['help', 'textcolor=', 'background=', 'setidir=', 'nice=',
|
|
||||||
'rgbfile=', 'configfile=', 'progressbarcolor=', 'barbgcolor=',
|
|
||||||
'indicatorcolor=']
|
|
||||||
try:
|
|
||||||
opts, nonOptArgs = getopt.getopt(argv[1:], shorts, longs)
|
|
||||||
except getopt.GetoptError, e:
|
|
||||||
sys.stderr.write('Error when parsing commandline: ' + str(e) + '\n')
|
|
||||||
sys.stderr.write(usage)
|
|
||||||
sys.exit(2)
|
|
||||||
d = {}
|
|
||||||
for o, a in opts:
|
|
||||||
if o in ('-h', '--help'):
|
|
||||||
sys.stdout.write(usage)
|
|
||||||
sys.exit(0)
|
|
||||||
if o in ('-t', '--textcolor'):
|
|
||||||
d['textcolor'] = a
|
|
||||||
if o in ('-b', '--background'):
|
|
||||||
d['background'] = a
|
|
||||||
if o in ('-d', '--setidir'):
|
|
||||||
d['setidir'] = a
|
|
||||||
if o in ('-n', '--nice'):
|
|
||||||
d['nice'] = a
|
|
||||||
if o in ('-r', '--rgbfile'):
|
|
||||||
d['rgbfile'] = a
|
|
||||||
if o in ('-c', '--configfile'):
|
|
||||||
d['configfile'] = a
|
|
||||||
if o in ('-p', '--progressbarcolor'):
|
|
||||||
d['progressbarcolor'] = a
|
|
||||||
if o in ('-g', '--barbgcolor'):
|
|
||||||
d['barbgcolor'] = a
|
|
||||||
if o in ('-i', '--indicatorcolor'):
|
|
||||||
d['indicatorcolor'] = a
|
|
||||||
return d
|
|
||||||
|
|
||||||
def parseColors(defaultRGBFileNames, config, xpm):
|
|
||||||
rgbFileName = ''
|
|
||||||
for fn in defaultRGBFileNames:
|
|
||||||
if os.access(fn, os.R_OK):
|
|
||||||
rgbFileName = fn
|
|
||||||
break
|
|
||||||
rgbFileName = config.get('rgbfile', rgbFileName)
|
|
||||||
useColors = 1
|
|
||||||
if not os.access(rgbFileName, os.R_OK):
|
|
||||||
sys.stderr.write(
|
|
||||||
"Can't read the RGB file, try setting it differently using -r,\n")
|
|
||||||
sys.stderr.write(
|
|
||||||
"Ignoring your color settings, using the defaults.\n")
|
|
||||||
useColors = 0
|
|
||||||
if useColors:
|
|
||||||
# Colors is a list with (<config_key>, <xpm-key>) pairs.
|
|
||||||
colors = (('indicatorcolor', 'indicator'),
|
|
||||||
('progressbarcolor', 'graph'),
|
|
||||||
('barbgcolor', 'graphbg'),
|
|
||||||
('textcolor', 'text'),
|
|
||||||
('background', 'background'))
|
|
||||||
for key, value in colors:
|
|
||||||
col = config.get(key)
|
|
||||||
if not col is None:
|
|
||||||
code = pywmhelpers.getColorCode(col, rgbFileName)
|
|
||||||
if code is None:
|
|
||||||
sys.stderr.write('Bad colorcode for %s, ignoring.\n' % key)
|
|
||||||
else:
|
|
||||||
pywmhelpers.setColor(xpm, value, code)
|
|
||||||
|
|
||||||
def main():
|
|
||||||
clConfig = parseCommandLine(sys.argv)
|
|
||||||
configFile = clConfig.get('configfile', defaultConfigFile)
|
|
||||||
configFile = os.path.expanduser(configFile)
|
|
||||||
fileConfig = pywmhelpers.readConfigFile(configFile, sys.stderr)
|
|
||||||
# Merge the two configs, let the commandline options overwrite those in the
|
|
||||||
# configuration file.
|
|
||||||
config = fileConfig
|
|
||||||
for i in clConfig.iteritems():
|
|
||||||
config[i[0]] = i[1]
|
|
||||||
# Get the configurations
|
|
||||||
parseColors(defaultRGBFiles, config, xpm)
|
|
||||||
setiDir = config.get('setidir')
|
|
||||||
if setiDir is None:
|
|
||||||
sys.stderr.write(
|
|
||||||
'You have to supply a directory where seti@home resides. Either in\n')
|
|
||||||
sys.stderr.write(
|
|
||||||
'the configuration file or with -d/--setidir.\n')
|
|
||||||
sys.exit(3)
|
|
||||||
setiDir = os.path.expanduser(setiDir)
|
|
||||||
try:
|
|
||||||
os.chdir(setiDir)
|
|
||||||
except OSError, e:
|
|
||||||
sys.stderr.write('Error when accessing seti directory: %s\n' % str(e))
|
|
||||||
sys.exit(4)
|
|
||||||
statePath = os.path.join(setiDir, stateFileName)
|
|
||||||
uinfoPath = os.path.join(setiDir, uinfoFileName)
|
|
||||||
pidPath = os.path.join(setiDir, pidFileName)
|
|
||||||
execPath = os.path.join(setiDir, execFileName)
|
|
||||||
niceVal = config.get('nice')
|
|
||||||
if niceVal is None:
|
|
||||||
execCmd = execPath
|
|
||||||
else:
|
|
||||||
execCmd = execPath + ' -nice %s' % niceVal + '&'
|
|
||||||
try:
|
|
||||||
programName = sys.argv[0].split(os.sep)[-1]
|
|
||||||
except IndexError:
|
|
||||||
programName = ''
|
|
||||||
sys.argv[0] = programName
|
|
||||||
pywmhelpers.setDefaultPixmap(xpm)
|
|
||||||
pywmhelpers.openXwindow(sys.argv, width, height)
|
|
||||||
pywmhelpers.addMouseRegion(0, xOffset, yOffset, width - 2 * xOffset,
|
|
||||||
height - 2 * yOffset)
|
|
||||||
pwms = PywmSeti(statePath, uinfoPath, pidPath, execCmd)
|
|
||||||
pwms.mainLoop()
|
|
||||||
|
|
||||||
xpm = \
|
|
||||||
['160 100 13 1',
|
|
||||||
' \tc #208120812081',
|
|
||||||
'.\tc #00000000FFFF',
|
|
||||||
'o\tc #C71BC30BC71B',
|
|
||||||
'O\tc #861782078E38',
|
|
||||||
'+\tc #EFBEF3CEEFBE',
|
|
||||||
'@\tc #618561856185',
|
|
||||||
'#\tc #9E79A2899E79',
|
|
||||||
'$\tc #410341034103',
|
|
||||||
'o\tc #2020b2b2aaaa s indicator',
|
|
||||||
'/\tc #2020b2b2aaaa s graph',
|
|
||||||
'-\tc #707070707070 s graphbg',
|
|
||||||
'X\tc #000000000000 s background',
|
|
||||||
'%\tc #2081B2CAAEBA s text',
|
|
||||||
' ...............................................................................................',
|
|
||||||
' .///..XXX..ooo..XXX..XXX.......................................................................',
|
|
||||||
' .///..XXX..ooo..XXX..XXX.......................................................................',
|
|
||||||
' .///..XXX..ooo..XXX..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..ooo..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..ooo..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..ooo..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..ooo.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..ooo.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..ooo.......................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...-------------------------------------------------------------------------------------...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...-------------------------------------------------------------------------------------...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...-------------------------------------------------------------------------------------...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...-------------------------------------------------------------------------------------...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///////////////////////////////////////////////////////////////////////////////////////////...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///////////////////////////////////////////////////////////////////////////////////////////...',
|
|
||||||
' .///////////////////////////////////////////////////////////////////////////////////////////...',
|
|
||||||
' .///////////////////////////////////////////////////////////////////////////////////////////...',
|
|
||||||
' ...............................................................................................',
|
|
||||||
' ...............................................................................................',
|
|
||||||
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%%%%%XXX%XXX%%%%%X%%%%%X%XXX%X%%%%%X%%%%%X%%%%%X%%%%%X%%%%%XXXXXXXXXX%XXXXXXXXXX%X%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XX%%XXXXXXX%XXXXX%X%XXX%X%XXXXX%XXXXXXXXX%X%XXX%X%XXX%XX%%XXXXXX%XXXXXXXXXXXX%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XXX%XXXXXXX%XXXXX%X%XXX%X%XXXXX%XXXXXXXXX%X%XXX%X%XXX%XX%%XXXXX%%XXXXXXXXXXX%%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XXX%XXX%%%%%XX%%%%X%%%%%X%%%%%X%%%%%XXXXX%X%%%%%X%%%%%XXXXXXXXX%XXX%%%%%XXXX%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XXX%XXX%XXXXXXXXX%XXXXX%XXXXX%X%XXX%XXXXX%X%XXX%XXXXX%XXXXXXXX%%XXXXXXXXXXX%%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XXX%XXX%XXXXXXXXX%XXXXX%XXXXX%X%XXX%XXXXX%X%XXX%XXXXX%XX%%XXXX%XXXXXXXXXXXX%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%%%%%XX%%%XX%%%%%X%%%%%XXXXX%X%%%%%X%%%%%XXXXX%X%%%%%X%%%%%XX%%XXXX%XXXXXXXXXXXX%X%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
|
|
||||||
'XX%%%XX%%%%XXX%%%%X%%%%XX%%%%XX%%%%%X%%%%%X%XXX%XXX%XXXXXXX%X%XXX%X%XXXXX%XXX%X%%%%XX%%%%%X%%%%%X%%%%%X%%%%%X%%%%%X%%%%%X%XXX%X%XXX%X%XXX%X%XXX%X%XXX%X%%%%%XXXX',
|
|
||||||
'X%XXX%X%XXX%X%XXXXX%XXX%X%XXXXX%XXXXX%XXXXX%XXX%XXX%XXXXXXX%X%XXX%X%XXXXX%%X%%X%XXX%X%XXX%X%XXX%X%XXX%X%XXX%X%XXXXXXX%XXX%XXX%X%XXX%X%XXX%X%XXX%X%XXX%XXXXX%XXXX',
|
|
||||||
'X%XXX%X%XXX%X%XXXXX%XXX%X%XXXXX%XXXXX%XXXXX%XXX%XXX%XXXXXXX%X%XX%XX%XXXXX%X%X%X%XXX%X%XXX%X%XXX%X%XXX%X%XXX%X%XXXXXXX%XXX%XXX%X%XXX%X%XXX%XX%X%XX%XXX%XXXX%XXXXX',
|
|
||||||
'X%%%%%X%%%%XX%XXXXX%XXX%X%%%%XX%%%%XX%X%%%X%%%%%XXX%XXXXXXX%X%%%XXX%XXXXX%XXX%X%XXX%X%XXX%X%%%%%X%%XX%X%%%%XX%%%%%XXX%XXX%XXX%X%XXX%X%XXX%XXX%XXX%%%%%XXX%XXXXXX',
|
|
||||||
'X%XXX%X%XXX%X%XXXXX%XXX%X%XXXXX%XXXXX%XXX%X%XXX%XXX%XXXXXXX%X%XX%XX%XXXXX%XXX%X%XXX%X%XXX%X%XXXXX%X%X%X%XXX%XXXXX%XXX%XXX%XXX%X%XXX%X%X%X%XX%X%XXXXXX%XX%XXXXXXX',
|
|
||||||
'X%XXX%X%XXX%X%XXXXX%XXX%X%XXXXX%XXXXX%XXX%X%XXX%XXX%XXX%XXX%X%XXX%X%XXXXX%XXX%X%XXX%X%XXX%X%XXXXX%XX%%X%XXX%XXXXX%XXX%XXX%XXX%X%XXX%X%%X%%X%XXX%XXXXX%X%XXXXXXXX',
|
|
||||||
'X%XXX%X%%%%XXX%%%%X%%%%XX%%%%XX%XXXXX%%%%%X%XXX%XXX%XXXX%%%XX%XXX%X%%%%XX%XXX%X%XXX%X%%%%%X%XXXXX%%%%%X%XXX%X%%%%%XXX%XXXX%%%%XX%%%XX%XXX%X%XXX%X%%%%%X%%%%%XXXX',
|
|
||||||
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................']
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
[DEFAULT]
|
|
||||||
setidir=/home/erl/setiathome
|
|
||||||
# Nice value to start the seti@home process with on click.
|
|
||||||
nice=19
|
|
||||||
textcolor=light sea green
|
|
||||||
progressbarcolor=light sea green
|
|
||||||
barbgcolor=grey45
|
|
||||||
indicatorcolor=light sea green
|
|
||||||
background=black
|
|
||||||
|
|
||||||
#rgbfile=/usr/lib/X11/rgb.txt
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
1. If you don't have pywmgeneral installed, install it first. Can be found
|
|
||||||
at http://pywmdockapps.sourceforge.net
|
|
||||||
|
|
||||||
2. Copy pywmsysmon.py to somewhere in your path (like ~/bin or
|
|
||||||
/usr/local/bin).
|
|
||||||
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
[WHAT]
|
|
||||||
pywmsysmon is a WindowMaker dockapp that displays your cpu and memory
|
|
||||||
usages. The upper graph shows your cpu usage history and the lower
|
|
||||||
"progress bar" shows your current memory usage excluding cached and
|
|
||||||
buffered data. This program currently only works on systems which got
|
|
||||||
the /proc/stat and /proc/meminfo files available. Invoke the program
|
|
||||||
with --help for information about customization.
|
|
||||||
|
|
||||||
[WHY]
|
|
||||||
As usual, I didn't find a dockapp that fitted me.
|
|
||||||
|
|
||||||
[CONTACT]
|
|
||||||
Mail anything related to this program to me, Mario Frasca <mfrasca@interia.pl>
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
from pywmsysmon import *
|
|
||||||
@@ -1,465 +0,0 @@
|
|||||||
#! /usr/bin/env python
|
|
||||||
|
|
||||||
'''pywmsysmon.py
|
|
||||||
|
|
||||||
WindowMaker system monitor dockapp written in Python. It displays your CPU
|
|
||||||
usage and your available/used memory.
|
|
||||||
|
|
||||||
Copyright (C) 2003 Kristoffer Erlandsson
|
|
||||||
|
|
||||||
Licensed under the GNU General Public License.
|
|
||||||
|
|
||||||
Changes
|
|
||||||
2003-06-28 Kristoffer Erlandsson
|
|
||||||
Fixed a bug which caused infinite loop if the mouse was clicked
|
|
||||||
|
|
||||||
2003-06-24 Kristoffer Erlandsson
|
|
||||||
First working version
|
|
||||||
'''
|
|
||||||
usage='''pywmsysmon.py [options]
|
|
||||||
Available options are:
|
|
||||||
-h, --help print this help
|
|
||||||
-f, --barfgcolor <color> set the foreground color of the memory bar
|
|
||||||
-g, --barbgcolor <color> set the background color of the memory bar
|
|
||||||
-b, --background <color> set the background color
|
|
||||||
-p, --graphforeground <color> set the cpu graph foreground color
|
|
||||||
-a, --graphbackground <color> set the cpu graph background color
|
|
||||||
-r, --rgbfile <file> set the rgb file to get color codes from
|
|
||||||
-s, --procstat <file> set the location of /proc/stat
|
|
||||||
-m, --procmeminfo <file> set the location of /proc/meminfo
|
|
||||||
-i, --ignorenice ignore nice valued cpu usage
|
|
||||||
-u, --updatedelay <value> delay (in seconds) between cpu graph updates
|
|
||||||
'''
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import time
|
|
||||||
import getopt
|
|
||||||
import os
|
|
||||||
|
|
||||||
from pywmgeneral import pywmhelpers
|
|
||||||
|
|
||||||
width = 64
|
|
||||||
height = 64
|
|
||||||
|
|
||||||
xOffset = 4
|
|
||||||
yOffset = 4
|
|
||||||
|
|
||||||
lettersStartX = 0
|
|
||||||
lettersStartY = 74
|
|
||||||
letterWidth = 6
|
|
||||||
letterHeight = 8
|
|
||||||
|
|
||||||
digitsStartX = 0
|
|
||||||
digitsStartY = 64
|
|
||||||
digitWidth = 6
|
|
||||||
digitHeight = 8
|
|
||||||
|
|
||||||
hGraphStartX = 7
|
|
||||||
hGraphStartY = 53
|
|
||||||
hGraphHeight = 4
|
|
||||||
hGraphWidth = width - xOffset * 2 - 6
|
|
||||||
|
|
||||||
hGraphBgStartX = 72
|
|
||||||
hGraphBgStartY = 53
|
|
||||||
|
|
||||||
hGraphLineStartX = 66
|
|
||||||
hGraphLineStartY = 58
|
|
||||||
|
|
||||||
vGraphStartX = 7
|
|
||||||
vGraphStartY = 7
|
|
||||||
vGraphHeight = 43
|
|
||||||
vGraphWidth = 50
|
|
||||||
|
|
||||||
vGraphLineStartX = 95
|
|
||||||
vGraphLineStartY = 1
|
|
||||||
|
|
||||||
vGraphBgStartX = 97
|
|
||||||
vGraphBgStartY = 1
|
|
||||||
|
|
||||||
letters = 'abcdefghijklmnopqrstuvwxyz'
|
|
||||||
digits = '0123456789:/-%. '
|
|
||||||
|
|
||||||
defaultConfigFile = '~/.pywmhdmonrc'
|
|
||||||
defaultRGBFiles = ('/usr/lib/X11/rgb.txt', '/usr/X11R6/lib/X11/rgb.txt')
|
|
||||||
defaultProcStat = '/proc/stat'
|
|
||||||
defaultProcMeminfo = '/proc/meminfo'
|
|
||||||
|
|
||||||
class PywmSysMon:
|
|
||||||
def __init__(self, procMeminfo, procStat, ignoreNice=0, updateDelay=10):
|
|
||||||
self._procStat = procStat
|
|
||||||
self._procMeminfo = procMeminfo
|
|
||||||
self._ignoreNice = ignoreNice
|
|
||||||
|
|
||||||
self._lastUsed = 0
|
|
||||||
self._lastTotal = 0
|
|
||||||
|
|
||||||
self._usageHistory = [0.0] * vGraphWidth
|
|
||||||
|
|
||||||
self._cpuUpdateDelay = updateDelay
|
|
||||||
self._memUpdateDelay = 30
|
|
||||||
|
|
||||||
def addUsageToHist(self, cpuUsage):
|
|
||||||
self._usageHistory = self._usageHistory[1:]
|
|
||||||
self._usageHistory.append(cpuUsage)
|
|
||||||
|
|
||||||
def getMemInfo(self):
|
|
||||||
'''Get memory information.
|
|
||||||
|
|
||||||
Return a tuple with (total_mem, used_mem, buffered_mem, cached_mem).
|
|
||||||
'''
|
|
||||||
try:
|
|
||||||
meminfoFile = file(self._procMeminfo, 'r')
|
|
||||||
except IOError, e:
|
|
||||||
sys.stderr.write("Can't open meminfo file: %s.\n" % str(e))
|
|
||||||
sys.exit(2)
|
|
||||||
theLine = None
|
|
||||||
for line in meminfoFile:
|
|
||||||
if line.startswith('Mem:'):
|
|
||||||
theLine = line
|
|
||||||
if theLine is None:
|
|
||||||
sys.stderr.write("Can't find memory information in %s.\n" %
|
|
||||||
self._procMeminfo)
|
|
||||||
sys.exit(4)
|
|
||||||
parts = [long(x) for x in theLine.split()[1:]]
|
|
||||||
total, used, free, shared, buffers, cached = parts
|
|
||||||
return (total, used, buffers, cached)
|
|
||||||
|
|
||||||
def freeMem(self, memData):
|
|
||||||
'''Take a tuple as returned from getMemInfo and return the free mem.
|
|
||||||
'''
|
|
||||||
total, used, buffers, cached = memData
|
|
||||||
reallyUsed = used - buffers - cached
|
|
||||||
free = total - reallyUsed
|
|
||||||
return free
|
|
||||||
|
|
||||||
def getCPUUsage(self):
|
|
||||||
'''Get the current CPU usage.
|
|
||||||
|
|
||||||
Only works for systems where this can be found in a /proc/stat like
|
|
||||||
file. Return the usage in percent.
|
|
||||||
'''
|
|
||||||
try:
|
|
||||||
statFile = file(self._procStat, 'r')
|
|
||||||
except IOError, e:
|
|
||||||
sys.stderr.write("Can't open statfile: %s.\n" % str(e))
|
|
||||||
sys.exit(2)
|
|
||||||
line = statFile.readline()
|
|
||||||
statFile.close()
|
|
||||||
cpu, nice, system, idle = [long(x) for x in line.split()[1:]]
|
|
||||||
used = cpu + system
|
|
||||||
if not self._ignoreNice:
|
|
||||||
used += nice
|
|
||||||
total = cpu + nice + system + idle
|
|
||||||
if total - self._lastTotal <= 0 or self._lastTotal == 0:
|
|
||||||
cpuUsage = 0.0
|
|
||||||
else:
|
|
||||||
cpuUsage = 100.0 * (float(used - self._lastUsed) / float(total -
|
|
||||||
self._lastTotal))
|
|
||||||
self._lastUsed = used
|
|
||||||
self._lastTotal = total
|
|
||||||
return cpuUsage
|
|
||||||
|
|
||||||
def addString(self, s, x, y):
|
|
||||||
try:
|
|
||||||
pywmhelpers.addString(s, x, y, letterWidth, letterHeight,
|
|
||||||
lettersStartX, lettersStartY, letters, digitWidth,
|
|
||||||
digitHeight, digitsStartX, digitsStartY, digits,
|
|
||||||
xOffset, yOffset, width, height)
|
|
||||||
except ValueError, e:
|
|
||||||
sys.stderr.write('Error when painting string:\n' + str(e) + '\n')
|
|
||||||
sys.exit(3)
|
|
||||||
|
|
||||||
def paintGraph(self, percentFilled, x, y, w):
|
|
||||||
'''Paint a graph with percentFilled percent filled.
|
|
||||||
|
|
||||||
Paint at position x, y and with width w.
|
|
||||||
'''
|
|
||||||
paintWidth = int(round(percentFilled/100.0 * w))
|
|
||||||
if paintWidth > 0:
|
|
||||||
pywmhelpers.copyXPMArea(
|
|
||||||
hGraphLineStartX, hGraphLineStartY, paintWidth, hGraphHeight,
|
|
||||||
x, y)
|
|
||||||
if w - paintWidth > 0:
|
|
||||||
pywmhelpers.copyXPMArea(
|
|
||||||
hGraphBgStartX, hGraphBgStartY, w - paintWidth, hGraphHeight,
|
|
||||||
x + paintWidth, y)
|
|
||||||
|
|
||||||
def drawVertLine(self, sourceX, sourceY, targX, targY, length):
|
|
||||||
'''Draw a vertical line.
|
|
||||||
'''
|
|
||||||
if length > 0:
|
|
||||||
pywmhelpers.copyXPMArea(sourceX, sourceY, 1, length, targX, targY)
|
|
||||||
|
|
||||||
def drawCPUUsageHistory(self):
|
|
||||||
'''Draw the complete CPU usage graph according to what's in the history.
|
|
||||||
'''
|
|
||||||
count = 0
|
|
||||||
for histItem in self._usageHistory:
|
|
||||||
lengthFilled = int(round(vGraphHeight * (histItem/100.0)))
|
|
||||||
lengthNotFilled = vGraphHeight - lengthFilled
|
|
||||||
self.drawVertLine(vGraphBgStartX, vGraphBgStartY,
|
|
||||||
vGraphStartX + count, vGraphStartY,
|
|
||||||
lengthNotFilled)
|
|
||||||
self.drawVertLine(vGraphLineStartX, vGraphLineStartY,
|
|
||||||
vGraphStartX + count,
|
|
||||||
vGraphStartY + lengthNotFilled, lengthFilled)
|
|
||||||
count += 1
|
|
||||||
|
|
||||||
def updateCPUInfo(self):
|
|
||||||
'''Update the current cpu usage graph.'''
|
|
||||||
currentUsage = self.getCPUUsage()
|
|
||||||
self.addUsageToHist(currentUsage)
|
|
||||||
self.drawCPUUsageHistory()
|
|
||||||
|
|
||||||
def updateMemInfo(self):
|
|
||||||
'''Update the current memory usage graph.'''
|
|
||||||
memInfo = self.getMemInfo()
|
|
||||||
total = memInfo[0]
|
|
||||||
free = self.freeMem(memInfo)
|
|
||||||
percentUsed = 100.0 * (float(total - free) / float(total))
|
|
||||||
self.paintGraph(percentUsed, hGraphStartX, hGraphStartY, hGraphWidth)
|
|
||||||
|
|
||||||
def _checkForEvents(self):
|
|
||||||
event = pywmhelpers.getEvent()
|
|
||||||
while not event is None:
|
|
||||||
if event['type'] == 'destroynotify':
|
|
||||||
sys.exit(0)
|
|
||||||
event = pywmhelpers.getEvent()
|
|
||||||
|
|
||||||
def mainLoop(self):
|
|
||||||
counter = -1
|
|
||||||
while 1:
|
|
||||||
counter += 1
|
|
||||||
self._checkForEvents()
|
|
||||||
if counter % self._cpuUpdateDelay == 0:
|
|
||||||
self.updateCPUInfo()
|
|
||||||
if counter % self._memUpdateDelay == 0:
|
|
||||||
self.updateMemInfo()
|
|
||||||
if counter == 999999:
|
|
||||||
counter = -1
|
|
||||||
pywmhelpers.redraw()
|
|
||||||
time.sleep(0.1)
|
|
||||||
|
|
||||||
def parseCommandLine(argv):
|
|
||||||
'''Parse the commandline. Return a dictionary with options and values.'''
|
|
||||||
shorts = 'hf:g:b:p:a:r:s:m:iu:'
|
|
||||||
longs = ['help=', 'barbgcolor=', 'barfgcolor=', 'background=',
|
|
||||||
'graphforeground=', 'graphbackground=', 'rgbfile=', 'procstat=',
|
|
||||||
'procmeminfo=', 'ignorenice', 'updatedelay=']
|
|
||||||
try:
|
|
||||||
opts, nonOptArgs = getopt.getopt(argv[1:], shorts, longs)
|
|
||||||
except getopt.GetoptError, e:
|
|
||||||
sys.stderr.write('Error when parsing commandline: ' + str(e) + '\n')
|
|
||||||
sys.stderr.write(usage)
|
|
||||||
sys.exit(2)
|
|
||||||
d = {}
|
|
||||||
for o, a in opts:
|
|
||||||
if o in ('-h', '--help'):
|
|
||||||
sys.stdout.write(usage)
|
|
||||||
sys.exit(0)
|
|
||||||
if o in ('-b', '--background'):
|
|
||||||
d['background'] = a
|
|
||||||
if o in ('-r', '--rgbfile'):
|
|
||||||
d['rgbfile'] = a
|
|
||||||
if o in ('-g', '--barbgcolor'):
|
|
||||||
d['barbgcolor'] = a
|
|
||||||
if o in ('-f', '--barfgcolor'):
|
|
||||||
d['barfgcolor'] = a
|
|
||||||
if o in ('-s', '--procstat'):
|
|
||||||
d['procstat'] = a
|
|
||||||
if o in ('-p', '--graphforeground'):
|
|
||||||
d['graphforeground'] = a
|
|
||||||
if o in ('-a', '--graphbackground'):
|
|
||||||
d['graphbackground'] = a
|
|
||||||
if o in ('-m', '--procmeminfo'):
|
|
||||||
d['procmeminfo'] = a
|
|
||||||
if o in ('-i', '--ignorenice'):
|
|
||||||
d['ignorenice'] = 1
|
|
||||||
if o in ('-u', '--updatedelay'):
|
|
||||||
try:
|
|
||||||
d['updatedelay'] = int(a) * 10
|
|
||||||
except ValueError:
|
|
||||||
sys.stderr.write(
|
|
||||||
"Value for updatedelay has to be an integer.\n")
|
|
||||||
sys.exit(2)
|
|
||||||
return d
|
|
||||||
|
|
||||||
def parseColors(defaultRGBFileList, config, xpm):
|
|
||||||
rgbFileName = ''
|
|
||||||
for fn in defaultRGBFileList:
|
|
||||||
if os.access(fn, os.R_OK):
|
|
||||||
rgbFileName = fn
|
|
||||||
break
|
|
||||||
rgbFileName = config.get('rgbfile', rgbFileName)
|
|
||||||
useColors = 1
|
|
||||||
if not os.access(rgbFileName, os.R_OK):
|
|
||||||
sys.stderr.write(
|
|
||||||
"Can't read the RGB file, try setting it differently using -r,\n")
|
|
||||||
sys.stderr.write(
|
|
||||||
"Ignoring your color settings, using the defaults.\n")
|
|
||||||
useColors = 0
|
|
||||||
if useColors:
|
|
||||||
# Colors is a list with (<config_key>, <xpm-key>) pairs.
|
|
||||||
colors = (('barfgcolor', 'graph'),
|
|
||||||
('barbgcolor', 'graphbg'),
|
|
||||||
('background', 'background'),
|
|
||||||
('graphforeground', 'vgraph'),
|
|
||||||
('graphbackground', 'vgraphbg'))
|
|
||||||
for key, value in colors:
|
|
||||||
col = config.get(key)
|
|
||||||
if not col is None:
|
|
||||||
code = pywmhelpers.getColorCode(col, rgbFileName)
|
|
||||||
if code is None:
|
|
||||||
sys.stderr.write('Bad colorcode for %s, ignoring.\n' % key)
|
|
||||||
else:
|
|
||||||
pywmhelpers.setColor(xpm, value, code)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
config = parseCommandLine(sys.argv)
|
|
||||||
parseColors(defaultRGBFiles, config, xpm)
|
|
||||||
procStat = config.get('procstat', defaultProcStat)
|
|
||||||
if not os.access(procStat, os.R_OK):
|
|
||||||
sys.stderr.write(
|
|
||||||
"Can't read your procstat file, try setting it with -s.\n")
|
|
||||||
sys.exit(4)
|
|
||||||
procMeminfo = config.get('procmeminfo', defaultProcMeminfo)
|
|
||||||
if not os.access(procMeminfo, os.R_OK):
|
|
||||||
sys.stderr.write(
|
|
||||||
"Can't read your procmeminfo file, try setting it with -m.\n")
|
|
||||||
sys.exit(4)
|
|
||||||
ignoreNice = config.get('ignorenice', 0)
|
|
||||||
updateDelay = config.get('updatedelay', 30)
|
|
||||||
try:
|
|
||||||
programName = sys.argv[0].split(os.sep)[-1]
|
|
||||||
except IndexError:
|
|
||||||
programName = ''
|
|
||||||
sys.argv[0] = programName
|
|
||||||
pywmhelpers.setDefaultPixmap(xpm)
|
|
||||||
pywmhelpers.openXwindow(sys.argv, width, height)
|
|
||||||
pywmsysmon = PywmSysMon(procMeminfo, procStat, ignoreNice, updateDelay)
|
|
||||||
pywmsysmon.mainLoop()
|
|
||||||
|
|
||||||
|
|
||||||
xpm = \
|
|
||||||
['160 100 15 1',
|
|
||||||
' \tc #208120812081',
|
|
||||||
'.\tc #00000000FFFF',
|
|
||||||
'o\tc #C71BC30BC71B',
|
|
||||||
'O\tc #861782078E38',
|
|
||||||
'+\tc #EFBEF3CEEFBE',
|
|
||||||
'@\tc #618561856185',
|
|
||||||
'#\tc #9E79A2899E79',
|
|
||||||
'$\tc #410341034103',
|
|
||||||
'o\tc #2020b2b2aaaa s indicator',
|
|
||||||
'/\tc #2020b2b2aaaa s graph',
|
|
||||||
'-\tc #707070707070 s graphbg',
|
|
||||||
'|\tc #2020b2b2aaaa s vgraph',
|
|
||||||
'I\tc #707070707070 s vgraphbg',
|
|
||||||
'X\tc #000000000000 s background',
|
|
||||||
'%\tc #2081B2CAAEBA s text',
|
|
||||||
' ...............................................................................................',
|
|
||||||
' .///..XXX..ooo..XXX..XXX......|.I..............................................................',
|
|
||||||
' .///..XXX..ooo..XXX..XXX......|.I..............................................................',
|
|
||||||
' .///..XXX..ooo..XXX..XXX......|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX......|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX......|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX......|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..ooo..XXX......|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..ooo..XXX......|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..ooo..XXX......|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX......|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX......|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..XXX......|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..ooo......|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..ooo......|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..XXX..XXX..XXX..ooo......|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///..........................|.I..............................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...-------------------------------------------------------------------------------------...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...-------------------------------------------------------------------------------------...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...-------------------------------------------------------------------------------------...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...-------------------------------------------------------------------------------------...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///...........................................................................................',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///////////////////////////////////////////////////////////////////////////////////////////...',
|
|
||||||
' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .///////////////////////////////////////////////////////////////////////////////////////////...',
|
|
||||||
' .///////////////////////////////////////////////////////////////////////////////////////////...',
|
|
||||||
' .///////////////////////////////////////////////////////////////////////////////////////////...',
|
|
||||||
' ...............................................................................................',
|
|
||||||
' ...............................................................................................',
|
|
||||||
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%%%%%XXX%XXX%%%%%X%%%%%X%XXX%X%%%%%X%%%%%X%%%%%X%%%%%X%%%%%XXXXXXXXXX%XXXXXXXXXX%X%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XX%%XXXXXXX%XXXXX%X%XXX%X%XXXXX%XXXXXXXXX%X%XXX%X%XXX%XX%%XXXXXX%XXXXXXXXXXXX%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XXX%XXXXXXX%XXXXX%X%XXX%X%XXXXX%XXXXXXXXX%X%XXX%X%XXX%XX%%XXXXX%%XXXXXXXXXXX%%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XXX%XXX%%%%%XX%%%%X%%%%%X%%%%%X%%%%%XXXXX%X%%%%%X%%%%%XXXXXXXXX%XXX%%%%%XXXX%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XXX%XXX%XXXXXXXXX%XXXXX%XXXXX%X%XXX%XXXXX%X%XXX%XXXXX%XXXXXXXX%%XXXXXXXXXXX%%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%XXX%XXX%XXX%XXXXXXXXX%XXXXX%XXXXX%X%XXX%XXXXX%X%XXX%XXXXX%XX%%XXXX%XXXXXXXXXXXX%XXXXX%%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'X%%%%%XX%%%XX%%%%%X%%%%%XXXXX%X%%%%%X%%%%%XXXXX%X%%%%%X%%%%%XX%%XXXX%XXXXXXXXXXXX%X%XXX%%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
|
|
||||||
'XX%%%XX%%%%XXX%%%%X%%%%XX%%%%XX%%%%%X%%%%%X%XXX%XXX%XXXXXXX%X%XXX%X%XXXXX%XXX%X%%%%XX%%%%%X%%%%%X%%%%%X%%%%%X%%%%%X%%%%%X%XXX%X%XXX%X%XXX%X%XXX%X%XXX%X%%%%%XXXX',
|
|
||||||
'X%XXX%X%XXX%X%XXXXX%XXX%X%XXXXX%XXXXX%XXXXX%XXX%XXX%XXXXXXX%X%XXX%X%XXXXX%%X%%X%XXX%X%XXX%X%XXX%X%XXX%X%XXX%X%XXXXXXX%XXX%XXX%X%XXX%X%XXX%X%XXX%X%XXX%XXXXX%XXXX',
|
|
||||||
'X%XXX%X%XXX%X%XXXXX%XXX%X%XXXXX%XXXXX%XXXXX%XXX%XXX%XXXXXXX%X%XX%XX%XXXXX%X%X%X%XXX%X%XXX%X%XXX%X%XXX%X%XXX%X%XXXXXXX%XXX%XXX%X%XXX%X%XXX%XX%X%XX%XXX%XXXX%XXXXX',
|
|
||||||
'X%%%%%X%%%%XX%XXXXX%XXX%X%%%%XX%%%%XX%X%%%X%%%%%XXX%XXXXXXX%X%%%XXX%XXXXX%XXX%X%XXX%X%XXX%X%%%%%X%%XX%X%%%%XX%%%%%XXX%XXX%XXX%X%XXX%X%XXX%XXX%XXX%%%%%XXX%XXXXXX',
|
|
||||||
'X%XXX%X%XXX%X%XXXXX%XXX%X%XXXXX%XXXXX%XXX%X%XXX%XXX%XXXXXXX%X%XX%XX%XXXXX%XXX%X%XXX%X%XXX%X%XXXXX%X%X%X%XXX%XXXXX%XXX%XXX%XXX%X%XXX%X%X%X%XX%X%XXXXXX%XX%XXXXXXX',
|
|
||||||
'X%XXX%X%XXX%X%XXXXX%XXX%X%XXXXX%XXXXX%XXX%X%XXX%XXX%XXX%XXX%X%XXX%X%XXXXX%XXX%X%XXX%X%XXX%X%XXXXX%XX%%X%XXX%XXXXX%XXX%XXX%XXX%X%XXX%X%%X%%X%XXX%XXXXX%X%XXXXXXXX',
|
|
||||||
'X%XXX%X%%%%XXX%%%%X%%%%XX%%%%XX%XXXXX%%%%%X%XXX%XXX%XXXX%%%XX%XXX%X%%%%XX%XXX%X%XXX%X%%%%%X%XXXXX%%%%%X%XXX%X%%%%%XXX%XXXX%%%%XX%%%XX%XXX%X%XXX%X%%%%%X%%%%%XXXX',
|
|
||||||
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................',
|
|
||||||
'................................................................................................................................................................']
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
18
setup.py
18
setup.py
@@ -7,11 +7,11 @@ XIncludes = '/usr/X11R6/include'
|
|||||||
|
|
||||||
from distutils.core import setup, Extension
|
from distutils.core import setup, Extension
|
||||||
|
|
||||||
module1 = Extension('pywmgeneral',
|
module1 = Extension('wmdocklib.pywmgeneral',
|
||||||
libraries = ['Xpm', 'Xext', 'X11'],
|
libraries = ['Xpm', 'Xext', 'X11'],
|
||||||
library_dirs = [XLibDir],
|
library_dirs = [XLibDir],
|
||||||
include_dirs = [XIncludes],
|
include_dirs = [XIncludes],
|
||||||
sources = ['pywmgeneral/pywmgeneral.c'])
|
sources = ['wmdocklib/pywmgeneral.c'])
|
||||||
|
|
||||||
setup(name="pywmdockapps",
|
setup(name="pywmdockapps",
|
||||||
version = "$Revision$"[11:-2],
|
version = "$Revision$"[11:-2],
|
||||||
@@ -23,11 +23,11 @@ setup(name="pywmdockapps",
|
|||||||
author_email="mfrasca@zonnet.nl",
|
author_email="mfrasca@zonnet.nl",
|
||||||
url="http://ibo.sourceforge.net",
|
url="http://ibo.sourceforge.net",
|
||||||
license="(L)GPL",
|
license="(L)GPL",
|
||||||
py_modules=['pywmdatetime.pywmdatetime',
|
packages=['wmdocklib',
|
||||||
'pywmgeneral.pywmhelpers',
|
],
|
||||||
'pywmgeneric.pywmgeneric',
|
scripts=['examples/pywmdatetime.py',
|
||||||
'pywmhdmon.pywmhdmon',
|
'examples/pywmhdmon.py',
|
||||||
'pywmseti.pywmseti',
|
'examples/pywmseti.py',
|
||||||
'pywmsysmon.pywmsysmon',
|
'examples/pywmsysmon.py',
|
||||||
],
|
'examples/setup.py'],
|
||||||
ext_modules = [module1])
|
ext_modules = [module1])
|
||||||
|
|||||||
Reference in New Issue
Block a user