Compare commits
No commits in common. "master" and "v1.21.0" have entirely different histories.
1
.gitignore
vendored
1
.gitignore
vendored
@ -124,7 +124,6 @@ celerybeat.pid
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
.envrc
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
|
11
README.txt
11
README.txt
@ -19,15 +19,10 @@ the sample scripts are described in the examples/README
|
||||
a small set of samples are provided. all of them make use of the module
|
||||
pywmgeneral.
|
||||
|
||||
[REQUIREMENTS DEBIAN/UBUNTU]
|
||||
apt-get install mplayer python3-setuptools libx11-dev libxpm-dev libxext-dev
|
||||
|
||||
[INSTALLATION]
|
||||
sudo python ./setup install
|
||||
python ./setup install
|
||||
|
||||
[CONTACT]
|
||||
This project was originally started as as a Python 2 application. By Mario
|
||||
Fransca <mfrasca@interia.pl>. I thank him for all the hard work.
|
||||
Anything related to this piece of software can be e-mailed to me, Mario
|
||||
Frasca <mfrasca@interia.pl>.
|
||||
|
||||
The project has been ported to Python 3 and now maintained by Fredrick
|
||||
Warren <fwarren@fastmail.com>
|
||||
|
@ -28,7 +28,7 @@ First workingish version
|
||||
"""
|
||||
usage = """pywmdatetime.py [options]
|
||||
Available options are:
|
||||
-h, --help asprint this help
|
||||
-h, --help print this help
|
||||
-f, --foreground <color> set the foreground color
|
||||
-b, --background <color> set the background color
|
||||
-F, --font <file> set the font name
|
||||
@ -69,7 +69,7 @@ def addString(s, x, y):
|
||||
try:
|
||||
wmdocklib.addString(s, x, y, xOffset, yOffset,
|
||||
width, height)
|
||||
except ValueError as e:
|
||||
except ValueError, e:
|
||||
sys.stderr.write('Error when painting string:\n' + str(e) + '\n')
|
||||
sys.stderr.write('test %s' % ((s, x, y, xOffset, yOffset,
|
||||
width, height),))
|
||||
@ -119,7 +119,7 @@ def parseCommandLine(argv):
|
||||
'weekdayformat=', 'weekformat=', 'rgbfile=', 'configfile=', 'font=']
|
||||
try:
|
||||
opts, nonOptArgs = getopt.getopt(argv[1:], shorts, longs)
|
||||
except getopt.GetoptError as e:
|
||||
except getopt.GetoptError, e:
|
||||
sys.stderr.write('Error when parsing commandline: ' + str(e) + '\n')
|
||||
sys.stderr.write(usage)
|
||||
sys.exit(2)
|
||||
@ -247,7 +247,7 @@ def main():
|
||||
# Merge the two configs, let the commandline options overwrite those in the
|
||||
# configuration file.
|
||||
config = fileConfig
|
||||
for i in clConfig.items():
|
||||
for i in clConfig.iteritems():
|
||||
config[i[0]] = i[1]
|
||||
|
||||
timeFmt = config.get('timeformat', timeDefaultFormat)
|
||||
@ -282,7 +282,7 @@ def main():
|
||||
bg=0, fg=2, palette=palette,
|
||||
background=background,
|
||||
debug=debug)
|
||||
maxCharsPerLine = (width-2*xOffset) // char_width
|
||||
maxCharsPerLine = (width-2*xOffset) / char_width
|
||||
antialiased = clConfig.get('antialiased', False)
|
||||
|
||||
wmdocklib.openXwindow(sys.argv, width, height)
|
||||
|
@ -1,4 +1,4 @@
|
||||
#!/usr/bin/env python3
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""pywmgeneric.py
|
||||
|
||||
@ -37,13 +37,11 @@ import sys
|
||||
import os
|
||||
import time
|
||||
import string
|
||||
import configparser
|
||||
import ConfigParser
|
||||
import getopt
|
||||
import subprocess
|
||||
import popen2
|
||||
|
||||
import wmdocklib
|
||||
import wmdocklib.pywmgeneral as pywmgeneral
|
||||
import wmdocklib.pywmhelpers as pywmhelpers
|
||||
|
||||
prevStat = {'user':0,
|
||||
'nice':0,
|
||||
@ -78,14 +76,16 @@ class UserMethods:
|
||||
def result():
|
||||
global prevStat
|
||||
try:
|
||||
with open('/proc/stat', 'r') as f:
|
||||
currStat = dict(
|
||||
[(k, int(v))
|
||||
for (k,v) in cpuinfo.match(f.readline()).groupdict().items()]
|
||||
)
|
||||
f = file('/proc/stat', 'r')
|
||||
except IOError:
|
||||
return 'error'
|
||||
|
||||
currStat = dict(
|
||||
[(k, int(v))
|
||||
for (k,v) in cpuinfo.match(f.readline()).groupdict().items()]
|
||||
)
|
||||
f.close()
|
||||
|
||||
total = 0
|
||||
for k,v in currStat.items():
|
||||
total += v
|
||||
@ -105,10 +105,11 @@ class UserMethods:
|
||||
|
||||
def getSysTemp(self):
|
||||
try:
|
||||
with open('/proc/sys/dev/sensors/w83697hf-isa-0290/temp1', 'r') as f:
|
||||
temp = f.readline().split()[2]
|
||||
f = file('/proc/sys/dev/sensors/w83697hf-isa-0290/temp1', 'r')
|
||||
except IOError:
|
||||
return lambda: 'error'
|
||||
temp = f.readline().split()[2]
|
||||
f.close()
|
||||
return lambda: 'sys: %s' % temp
|
||||
|
||||
def ls(self):
|
||||
@ -152,8 +153,8 @@ def addString(s, x, y):
|
||||
try:
|
||||
wmdocklib.addString(s, x, y, xOffset, yOffset,
|
||||
width, height)
|
||||
except ValueError as e:
|
||||
sys.stderr.write(f'Error when painting string:\n{e}\n')
|
||||
except ValueError, e:
|
||||
sys.stderr.write('Error when painting string:\n' + str(e) + '\n')
|
||||
sys.exit(3)
|
||||
|
||||
def clearLine(y):
|
||||
@ -193,7 +194,7 @@ class Entry:
|
||||
|
||||
self._glue = ' ... '
|
||||
self._scrollPos = 0
|
||||
self._tickCount = 0
|
||||
self._tickCount = 0L
|
||||
|
||||
self._runningProcs = []
|
||||
self._actionProc = None
|
||||
@ -219,7 +220,7 @@ class Entry:
|
||||
"""Exec an external command in the background.
|
||||
|
||||
Return the running process as created by Popen3()."""
|
||||
proc = subprocess.Popen(command)
|
||||
proc = popen2.Popen3(command)
|
||||
self._runningProcs.append(proc)
|
||||
return proc
|
||||
|
||||
@ -479,7 +480,7 @@ class PywmGeneric:
|
||||
timeNum = float(timeStr[:-1].strip())
|
||||
numSecs = timeNum * multiplier
|
||||
return numSecs
|
||||
raise ValueError('Invalid literal')
|
||||
raise ValueError, 'Invalid literal'
|
||||
|
||||
def _checkForEvents(self):
|
||||
event = wmdocklib.getEvent()
|
||||
@ -516,7 +517,7 @@ def parseCommandLine(argv):
|
||||
'font=', 'debug']
|
||||
try:
|
||||
opts, nonOptArgs = getopt.getopt(argv[1:], shorts, longs)
|
||||
except getopt.GetoptError as e:
|
||||
except getopt.GetoptError, e:
|
||||
err('Error when parsing commandline: ' + str(e) + '\n')
|
||||
err(usage)
|
||||
sys.exit(2)
|
||||
@ -550,10 +551,10 @@ def readConfigFile(fileName):
|
||||
err("Can't read the configuration file %s.\n" % fileName)
|
||||
# We can't do much without a configuration file
|
||||
sys.exit(3)
|
||||
cp = configparser.ConfigParser()
|
||||
cp = ConfigParser.ConfigParser()
|
||||
try:
|
||||
cp.read(fileName)
|
||||
except configparser.Error as e:
|
||||
except ConfigParser.Error, e:
|
||||
err("Error when reading configuration file:\n%s\n" % str(e))
|
||||
sys.exit(3)
|
||||
l = [{}, {}, {}, {}, {}]
|
||||
|
@ -89,7 +89,7 @@ class PywmHDMon:
|
||||
self._pathsToMonitor = pathsToMonitor
|
||||
self._actMonEnabled = actMonEnabled
|
||||
self._skipping = skipping
|
||||
self._lineCount = (height - yOffset*2 - 2) // (char_height+1)
|
||||
self._lineCount = (height - yOffset*2 - 2) / (char_height+1)
|
||||
|
||||
self._statFile = procStat
|
||||
self._maxIODiff = 0
|
||||
@ -102,7 +102,7 @@ class PywmHDMon:
|
||||
def addString(self, s, x, y):
|
||||
try:
|
||||
wmdocklib.addString(s, x, y, xOffset, yOffset, width, height)
|
||||
except ValueError as e:
|
||||
except ValueError, e:
|
||||
sys.stderr.write('Error when painting string:\n' + str(e) + '\n')
|
||||
sys.exit(3)
|
||||
|
||||
@ -116,7 +116,7 @@ class PywmHDMon:
|
||||
"""
|
||||
|
||||
# check if is mounted <- st_dev(/mount/point) == st_dev(/mount)
|
||||
if path != '/':
|
||||
if path is not '/':
|
||||
statOwn = os.stat(path)
|
||||
|
||||
# the following is a bit ugly: it removes the trailing
|
||||
@ -151,7 +151,7 @@ class PywmHDMon:
|
||||
|
||||
def getY(self, line):
|
||||
"returns the y coordinate of the top line for the box"
|
||||
interlinea = (height - yOffset*2 - 2 - self._lineCount * char_height) // (self._lineCount-1)
|
||||
interlinea = (height - yOffset*2 - 2 - self._lineCount * char_height) / (self._lineCount-1)
|
||||
interlinea += char_height
|
||||
lastBaseline = yOffset + self._lineCount * interlinea
|
||||
from math import ceil
|
||||
@ -163,7 +163,7 @@ class PywmHDMon:
|
||||
|
||||
def paintHdData(self, line, data, mode):
|
||||
total, free = data
|
||||
xStart = (width*2)//5
|
||||
xStart = (width*2)/5
|
||||
if total==0:
|
||||
self.addString(' ', width-yOffset*2-5*char_width-1, self.getY(line))
|
||||
self.paintGraph(0, xStart, self.getY(line) + 4,
|
||||
@ -244,7 +244,7 @@ class PywmHDMon:
|
||||
sys.exit(0)
|
||||
elif event['type'] == 'buttonrelease':
|
||||
area = wmdocklib.checkMouseRegion(event['x'],event['y'])
|
||||
if area != -1:
|
||||
if area is not -1:
|
||||
self.toggleMount(area-1+self._skipping)
|
||||
event = wmdocklib.getEvent()
|
||||
|
||||
@ -257,7 +257,7 @@ class PywmHDMon:
|
||||
mounted = True
|
||||
except NotMounted:
|
||||
mounted = False
|
||||
except OSError as e:
|
||||
except OSError, e:
|
||||
return
|
||||
if mounted:
|
||||
if action == 'mount':
|
||||
@ -282,7 +282,7 @@ class PywmHDMon:
|
||||
hdData = self.getHdInfo(path)
|
||||
except NotMounted:
|
||||
hdData = (0, 0)
|
||||
except OSError as e:
|
||||
except OSError, e:
|
||||
sys.stderr.write(
|
||||
"Can't get hd data from %s: %s\n" % (path, str(e)))
|
||||
hdData = (0, 0)
|
||||
@ -313,7 +313,7 @@ def parseCommandLine(argv):
|
||||
'skipconf=','font=', 'debug']
|
||||
try:
|
||||
opts, nonOptArgs = getopt.getopt(argv[1:], shorts, longs)
|
||||
except getopt.GetoptError as e:
|
||||
except getopt.GetoptError, e:
|
||||
sys.stderr.write('Error when parsing commandline: ' + str(e) + '\n')
|
||||
sys.stderr.write(usage)
|
||||
sys.exit(2)
|
||||
@ -406,7 +406,7 @@ def main():
|
||||
configFile = os.path.expanduser(configFile)
|
||||
fileConfig = wmdocklib.readConfigFile(configFile, sys.stderr)
|
||||
config = fileConfig
|
||||
for i in clConfig.items():
|
||||
for i in clConfig.iteritems():
|
||||
config[i[0]] = i[1]
|
||||
|
||||
palette = {}
|
||||
|
@ -2,21 +2,16 @@
|
||||
|
||||
"""pywmnop.py
|
||||
|
||||
WindowMaker dockapp internet radio player
|
||||
WindowMaker dockapp doing nothing
|
||||
|
||||
Copyright (C) 2006 Mario Frasca
|
||||
|
||||
Licensed under the GNU General Public License.
|
||||
"""
|
||||
|
||||
from codecs import open
|
||||
from fcntl import fcntl, F_GETFL, F_SETFL
|
||||
from os import environ, sep, O_NONBLOCK
|
||||
from re import compile
|
||||
from select import select
|
||||
from signal import signal, SIGCHLD
|
||||
from subprocess import Popen, DEVNULL, PIPE
|
||||
from wmdocklib import wmoo as wmoo
|
||||
import sys, time
|
||||
from wmdocklib import wmoo
|
||||
devnull = file('/dev/null')
|
||||
|
||||
class Application(wmoo.Application):
|
||||
|
||||
@ -39,12 +34,16 @@ class Application(wmoo.Application):
|
||||
self.reset()
|
||||
|
||||
self._buffered = ''
|
||||
self._feedback = compile(r'.+A:.*?% ([0-9\.]+)%')
|
||||
import re
|
||||
self._feedback = re.compile(r'.+A:.*?% ([0-9\.]+)%')
|
||||
|
||||
configfile = sep.join([environ['HOME'], '.pyradiorc'])
|
||||
import fileinput, os
|
||||
configfile = os.sep.join([os.environ['HOME'], '.pyradiorc'])
|
||||
|
||||
with open(configfile, 'r', 'utf-8') as f:
|
||||
t = f.read()
|
||||
import codecs
|
||||
f = codecs.open(configfile, 'r', 'utf-8')
|
||||
t = f.read()
|
||||
f.close()
|
||||
for i in t.split(u'\n'):
|
||||
radiodef = i.split('\t')
|
||||
radioname = radiodef[0].lower()
|
||||
@ -59,6 +58,7 @@ class Application(wmoo.Application):
|
||||
|
||||
def handler(self, num, frame):
|
||||
if self._expectdying:
|
||||
print self._expectdying
|
||||
self._expectdying -= 1
|
||||
else:
|
||||
self.reset()
|
||||
@ -66,46 +66,42 @@ class Application(wmoo.Application):
|
||||
self._colour = 1
|
||||
|
||||
def startPlayer(self):
|
||||
import os, subprocess, signal
|
||||
commandline = [mplayer,
|
||||
'-cache',
|
||||
str(abs(int(self.radioList[self.currentRadio][2]))),
|
||||
'-cache', self.radioList[self.currentRadio][2],
|
||||
self.radioList[self.currentRadio][1]
|
||||
]
|
||||
# if cache is negative then this is a playlist
|
||||
if int(self.radioList[self.currentRadio][2]) < 0:
|
||||
commandline.insert(2, '-playlist')
|
||||
self.child = Popen(commandline,
|
||||
stdin =PIPE,
|
||||
stdout=PIPE,
|
||||
stderr=DEVNULL)
|
||||
signal(SIGCHLD, self.handler)
|
||||
self.child = subprocess.Popen(commandline,
|
||||
stdin =subprocess.PIPE,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=devnull)
|
||||
signal.signal(signal.SIGCHLD, self.handler)
|
||||
self._flash = 0
|
||||
self._paused = False
|
||||
self._buffered = ''
|
||||
self._buffering = 1
|
||||
self._cacheLevel = 0
|
||||
flags = fcntl(self.child.stdout, F_GETFL)
|
||||
fcntl(self.child.stdout, F_SETFL, flags | O_NONBLOCK)
|
||||
flags = fcntl(self.child.stdin, F_GETFL)
|
||||
fcntl(self.child.stdin, F_SETFL, flags | O_NONBLOCK)
|
||||
import fcntl
|
||||
flags = fcntl.fcntl(self.child.stdout, fcntl.F_GETFL)
|
||||
fcntl.fcntl(self.child.stdout, fcntl.F_SETFL, flags | os.O_NONBLOCK)
|
||||
flags = fcntl.fcntl(self.child.stdin, fcntl.F_GETFL)
|
||||
fcntl.fcntl(self.child.stdin, fcntl.F_SETFL, flags | os.O_NONBLOCK)
|
||||
|
||||
def stopPlayer(self):
|
||||
if self.child:
|
||||
# print(self._expectdying)
|
||||
self.child.stdin.write(b'q')
|
||||
self.child.stdin.flush()
|
||||
print self._expectdying
|
||||
self.child.stdin.write('q')
|
||||
self._expectdying += 1
|
||||
self.child = None
|
||||
|
||||
def muteStream(self, event):
|
||||
if self.child and self._buffering == 0:
|
||||
self.child.stdin.write(b'm')
|
||||
self.child.stdin.flush()
|
||||
self.child.stdin.write('m')
|
||||
self.putPattern(9*self._muting, 0, 9, 11, 30, 29)
|
||||
self._muting = 1 - self._muting
|
||||
|
||||
def printevent(self, event):
|
||||
print(event)
|
||||
print event
|
||||
|
||||
def previousRadio(self, event):
|
||||
if self.currentRadio == 0: self.currentRadio = len(self.radioList)
|
||||
@ -132,8 +128,7 @@ class Application(wmoo.Application):
|
||||
|
||||
def pauseStream(self, event):
|
||||
if self.child and not self._buffering:
|
||||
self.child.stdin.write(b' ')
|
||||
self.child.stdin.flush()
|
||||
self.child.stdin.write(' ')
|
||||
self._paused = not self._paused
|
||||
if self._paused:
|
||||
self._colour = 1
|
||||
@ -169,9 +164,10 @@ class Application(wmoo.Application):
|
||||
return
|
||||
self._count = 0
|
||||
if self.child:
|
||||
[i, o, e] = select([self.child.stdout], [], [], 0)
|
||||
import select
|
||||
[i, o, e] = select.select([self.child.stdout], [], [], 0)
|
||||
if i:
|
||||
line = self.child.stdout.read(102400).decode("utf-8")
|
||||
line = self.child.stdout.read(102400)
|
||||
self._buffered += line
|
||||
npos = self._buffered.rfind('\n')+1
|
||||
rpos = self._buffered.rfind('\r')+1
|
||||
|
@ -85,7 +85,7 @@ class PywmSeti:
|
||||
try:
|
||||
wmdocklib.addString(s, x, y, digits,
|
||||
xOffset, yOffset, width, height)
|
||||
except ValueError as e:
|
||||
except ValueError, e:
|
||||
sys.stderr.write('Error when painting string:\n' + str(e) + '\n')
|
||||
sys.exit(3)
|
||||
|
||||
@ -137,7 +137,7 @@ class PywmSeti:
|
||||
"""
|
||||
try:
|
||||
os.kill(pid, 0)
|
||||
except OSError as e:
|
||||
except OSError, e:
|
||||
if e.errno == 1:
|
||||
return -1
|
||||
return 0
|
||||
@ -146,7 +146,7 @@ class PywmSeti:
|
||||
def openFileRead(self, fileName):
|
||||
try:
|
||||
f = file(fileName, 'r')
|
||||
except IOError as e:
|
||||
except IOError, e:
|
||||
sys.stderr.write('Error when opening %s: %s\n' % (fileName, str(e)))
|
||||
return None
|
||||
return f
|
||||
@ -265,7 +265,7 @@ class PywmSeti:
|
||||
if self._running:
|
||||
try:
|
||||
os.kill(self._pid, 15)
|
||||
except OSError as e:
|
||||
except OSError, e:
|
||||
sys.stderr.write(
|
||||
"Error when ending process: "+str(e)+'\n')
|
||||
else:
|
||||
@ -309,7 +309,7 @@ def parseCommandLine(argv):
|
||||
'indicatorcolor=']
|
||||
try:
|
||||
opts, nonOptArgs = getopt.getopt(argv[1:], shorts, longs)
|
||||
except getopt.GetoptError as e:
|
||||
except getopt.GetoptError, e:
|
||||
sys.stderr.write('Error when parsing commandline: ' + str(e) + '\n')
|
||||
sys.stderr.write(usage)
|
||||
sys.exit(2)
|
||||
@ -459,7 +459,7 @@ def main():
|
||||
# Merge the two configs, let the commandline options overwrite those in the
|
||||
# configuration file.
|
||||
config = fileConfig
|
||||
for i in clConfig.items():
|
||||
for i in clConfig.iteritems():
|
||||
config[i[0]] = i[1]
|
||||
# Get the configurations
|
||||
setiDir = config.get('setidir')
|
||||
@ -472,7 +472,7 @@ def main():
|
||||
setiDir = os.path.expanduser(setiDir)
|
||||
try:
|
||||
os.chdir(setiDir)
|
||||
except OSError as e:
|
||||
except OSError, e:
|
||||
sys.stderr.write('Error when accessing seti directory: %s\n' % str(e))
|
||||
sys.exit(4)
|
||||
statePath = os.path.join(setiDir, stateFileName)
|
||||
|
@ -95,8 +95,8 @@ class PywmSysMon:
|
||||
Return a tuple with (total_mem, used_mem, buffered_mem, cached_mem).
|
||||
"""
|
||||
try:
|
||||
meminfoFile = open(self._procMeminfo, 'r')
|
||||
except IOError as e:
|
||||
meminfoFile = file(self._procMeminfo, 'r')
|
||||
except IOError, e:
|
||||
sys.stderr.write("Can't open meminfo file: %s.\n" % str(e))
|
||||
sys.exit(2)
|
||||
total = used = free = shared = buffers = cached = theLine = None
|
||||
@ -105,17 +105,17 @@ class PywmSysMon:
|
||||
theLine = line
|
||||
break
|
||||
if line.startswith('MemTotal:'):
|
||||
total = int(line.split()[1])
|
||||
total = long(line.split()[1])
|
||||
if line.startswith('MemFree:'):
|
||||
free = int(line.split()[1])
|
||||
free = long(line.split()[1])
|
||||
if line.startswith('Buffers:'):
|
||||
buffers = int(line.split()[1])
|
||||
buffers = long(line.split()[1])
|
||||
if line.startswith('Cached:'):
|
||||
cached = int(line.split()[1])
|
||||
cached = long(line.split()[1])
|
||||
if free and total:
|
||||
used = total - free
|
||||
if theLine is not None:
|
||||
parts = [int(x) for x in theLine.split()[1]]
|
||||
parts = [long(x) for x in theLine.split()[1]]
|
||||
total, used, free, shared, buffers, cached = parts[:6]
|
||||
if None in [total, used, buffers, cached]:
|
||||
sys.stderr.write("Can't find memory information in %s.\n" %
|
||||
@ -138,13 +138,13 @@ class PywmSysMon:
|
||||
file. Return the usage in percent.
|
||||
"""
|
||||
try:
|
||||
statFile = open(self._procStat, 'r')
|
||||
except IOError as e:
|
||||
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 = [int(x) for x in line.split()[1:]][:4]
|
||||
cpu, nice, system, idle = [long(x) for x in line.split()[1:]][:4]
|
||||
used = cpu + system
|
||||
if not self._ignoreNice:
|
||||
used += nice
|
||||
@ -161,7 +161,7 @@ class PywmSysMon:
|
||||
def addString(self, s, x, y):
|
||||
try:
|
||||
wmdocklib.addString(s, x, y, digits, xOffset, yOffset, width, height)
|
||||
except ValueError as e:
|
||||
except ValueError, e:
|
||||
sys.stderr.write('Error when painting string:\n' + str(e) + '\n')
|
||||
sys.exit(3)
|
||||
|
||||
@ -244,7 +244,7 @@ def parseCommandLine(argv):
|
||||
'procmeminfo=', 'ignorenice', 'updatedelay=']
|
||||
try:
|
||||
opts, nonOptArgs = getopt.getopt(argv[1:], shorts, longs)
|
||||
except getopt.GetoptError as e:
|
||||
except getopt.GetoptError, e:
|
||||
sys.stderr.write('Error when parsing commandline: ' + str(e) + '\n')
|
||||
sys.stderr.write(usage)
|
||||
sys.exit(2)
|
||||
|
@ -16,10 +16,3 @@ bbcws rtsp://rmlive.bbc.co.uk/bbc-rbs/rmlive/ev7/live24/worldservice/liveinfent.
|
||||
bbc3 rtsp://rmlive.bbc.co.uk/bbc-rbs/rmlive/ev7/live24/radio3/live/r3_dsat_g2.ra 256
|
||||
bbc4 rtsp://rmlive.bbc.co.uk/bbc-rbs/rmlive/ev7/live24/radio4/live/r4_dsat_g2.ra 256
|
||||
|
||||
# lines starting with # is ignored OR
|
||||
# lines without exactly two tabs \t in it is ignored
|
||||
# lines with \t<variable>\t<value> becomes a global variable
|
||||
# lines with <name>\t<url>\t<bytes-cached> become a station
|
||||
# <bytes-cached> must be 32 or larger
|
||||
# positve <bytes-cached> ( 32) are stream urls
|
||||
# negative <bytes-cached> (-32) are playlist urls
|
||||
|
52
setup.py
52
setup.py
@ -1,27 +1,37 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Set these so they match your system.
|
||||
from __future__ import absolute_import
|
||||
XLibDir = '/usr/lib/x11'
|
||||
XIncludes = '/usr/include/x11'
|
||||
XLibDir = '/usr/X11R6/lib'
|
||||
XIncludes = '/usr/X11R6/include'
|
||||
|
||||
from setuptools import setup, Extension
|
||||
from distutils.core import setup, Extension
|
||||
|
||||
pywmgeneral = Extension('wmdocklib.pywmgeneral',
|
||||
libraries = ['Xpm', 'Xext', 'X11'],
|
||||
library_dirs = [XLibDir],
|
||||
include_dirs = [XIncludes],
|
||||
sources = ['wmdocklib/pywmgeneral.c'])
|
||||
module1 = Extension('wmdocklib.pywmgeneral',
|
||||
libraries = ['Xpm', 'Xext', 'X11'],
|
||||
library_dirs = [XLibDir],
|
||||
include_dirs = [XIncludes],
|
||||
sources = ['wmdocklib/pywmgeneral.c'])
|
||||
|
||||
setup(
|
||||
name="pywmdockapps",
|
||||
version = "$Revision: 1.99 $"[11:-2],
|
||||
description="This helper functions for windowmaker dockapps\nRead the whole story at http://pywmdockapps.sourceforge.net/",
|
||||
author="Kristoffer Erlandsson & al.",
|
||||
author_email="mfrasca@zonnet.nl",
|
||||
url="http://pywmdockapps.sourceforge.net",
|
||||
license="(L)GPL",
|
||||
packages=['wmdocklib'],
|
||||
package_data={'wmdocklib': ['*.xpm']},
|
||||
ext_modules=[pywmgeneral],
|
||||
)
|
||||
setup(name="pywmdockapps",
|
||||
version = "$Revision: 1.21 $"[11:-2],
|
||||
|
||||
description='''
|
||||
read the whole story at http://pywmdockapps.sourceforge.net/''',
|
||||
|
||||
author="Kristoffer Erlandsson & al.",
|
||||
author_email="mfrasca@zonnet.nl",
|
||||
url="http://pywmdockapps.sourceforge.net",
|
||||
license="(L)GPL",
|
||||
packages=['wmdocklib',
|
||||
],
|
||||
scripts=['examples/pywmdatetime.py',
|
||||
'examples/pywmhdmon.py',
|
||||
'examples/pywmseti.py',
|
||||
'examples/pywmsysmon.py',
|
||||
'examples/pywmphoto.py',
|
||||
'examples/pywmwet.py',
|
||||
'examples/pywmradio.py',
|
||||
'examples/pywmgeneric.py'],
|
||||
package_data={'wmdocklib': ['*.xpm']},
|
||||
ext_modules = [module1])
|
||||
|
@ -6,7 +6,7 @@ wmgeneral.c, but some new functions are added too.
|
||||
to get help about a contained package, try:
|
||||
help(wmdocklib.<name>)
|
||||
"""
|
||||
from .pywmgeneral import *
|
||||
from .pywmhelpers import *
|
||||
from pywmgeneral import *
|
||||
from pywmhelpers import *
|
||||
|
||||
__all__ = ['wmoo']
|
||||
|
@ -10,9 +10,6 @@
|
||||
*
|
||||
* History:
|
||||
*
|
||||
* 2024-09-08 Fredrick W. Warren
|
||||
* Ported from python 2 to python 3
|
||||
*
|
||||
* 2003-06-24 Kristoffer Erlandsson
|
||||
* Added some additional event handling.
|
||||
*
|
||||
@ -32,11 +29,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include <Python.h>
|
||||
#include "structmember.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <ctype.h>
|
||||
@ -87,12 +83,11 @@ char **pyListToStrs(PyObject *l) {
|
||||
s = PySequence_GetItem(l, i);
|
||||
if (s == NULL)
|
||||
return NULL; /* Shouldn't happen. */
|
||||
if (!PyUnicode_Check(s)) {
|
||||
if (!PyString_Check(s)) {
|
||||
PyErr_SetString(PyExc_TypeError, "String expected.");
|
||||
return NULL;
|
||||
}
|
||||
// target[i] = strdup(PyUnicode_AsString(s));
|
||||
target[i] = strdup(PyUnicode_AsUTF8(s));
|
||||
target[i] = PyString_AsString(s);
|
||||
}
|
||||
return target;
|
||||
}
|
||||
@ -368,7 +363,8 @@ static PyMethodDef Drawable_methods[] = {
|
||||
};
|
||||
|
||||
static PyTypeObject drawable_DrawableType = {
|
||||
PyVarObject_HEAD_INIT(NULL, 0)
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
0, /*ob_size*/
|
||||
"pyywmgeneral.Drawable", /*tp_name*/
|
||||
sizeof(drawable_DrawableObject), /*tp_basicsize*/
|
||||
0, /*tp_itemsize*/
|
||||
@ -791,29 +787,23 @@ void openXwindow(int argc, char *argv[], char *pixmap_bytes[], char *pixmask_bit
|
||||
}
|
||||
}
|
||||
|
||||
static struct PyModuleDef pywmgeneral_module = {
|
||||
PyModuleDef_HEAD_INIT, /* m_base */
|
||||
"pywmgeneral", /* m_name */
|
||||
NULL, /* m_doc */
|
||||
-1, /* m_size */
|
||||
PyWmgeneralMethods /* m_methods */
|
||||
};
|
||||
#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
|
||||
#define PyMODINIT_FUNC void
|
||||
#endif
|
||||
|
||||
PyMODINIT_FUNC
|
||||
PyInit_pywmgeneral(void)
|
||||
{
|
||||
initpywmgeneral(void) {
|
||||
PyObject* m;
|
||||
|
||||
drawable_DrawableType.tp_new = PyType_GenericNew;
|
||||
if (PyType_Ready(&drawable_DrawableType) < 0)
|
||||
return NULL;
|
||||
return;
|
||||
|
||||
m = PyModule_Create(&pywmgeneral_module);
|
||||
m = Py_InitModule3("pywmgeneral", PyWmgeneralMethods,
|
||||
"base C module for wmdocklib");
|
||||
if (m == NULL)
|
||||
return NULL;
|
||||
return;
|
||||
|
||||
Py_INCREF(&drawable_DrawableType);
|
||||
PyModule_AddObject(m, "Drawable", (PyObject *)&drawable_DrawableType);
|
||||
|
||||
return m;
|
||||
}
|
||||
|
@ -26,14 +26,14 @@ Some changes to handle the additional event handling in pywmgeneral
|
||||
First workingish version
|
||||
"""
|
||||
|
||||
import os, re
|
||||
import configparser
|
||||
import os, re, types
|
||||
import ConfigParser
|
||||
|
||||
charset_start = None
|
||||
charset_width = None
|
||||
pattern_start = None
|
||||
|
||||
import wmdocklib.pywmgeneral as pywmgeneral
|
||||
import pywmgeneral
|
||||
defaultRGBFileList = [
|
||||
'/etc/X11/rgb.txt',
|
||||
'/usr/lib/X11/rgb.txt',
|
||||
@ -55,10 +55,10 @@ def readConfigFile(fileName, errOut):
|
||||
errOut.write(
|
||||
'Configuration file is not readable. Using defaults.\n')
|
||||
return {}
|
||||
cp = configparser.ConfigParser()
|
||||
cp = ConfigParser.ConfigParser()
|
||||
try:
|
||||
cp.read(fileName)
|
||||
except configparser.Error as e:
|
||||
except ConfigParser.Error, e:
|
||||
if errOut:
|
||||
errOut.write('Error in configuration file:\n')
|
||||
errOut.write(str(e) + '\nUsing defaults.')
|
||||
@ -75,7 +75,7 @@ def getCenterStartPos(s, areaWidth, offset):
|
||||
"""Get the x starting position if we want to paint s centred."""
|
||||
w = len(s) * char_width
|
||||
textArea = areaWidth - offset * 2 - 1
|
||||
return (textArea - w) // 2
|
||||
return (textArea - w) / 2
|
||||
|
||||
def addChar(ch, x, y, xOffset, yOffset, width, height, drawable=None):
|
||||
"""Paint the character ch at position x, y in the window.
|
||||
@ -102,13 +102,13 @@ def addChar(ch, x, y, xOffset, yOffset, width, height, drawable=None):
|
||||
pos = (ord(ch)-32) * char_width
|
||||
# translate pos into chX, chY, rolling back and down each linelength
|
||||
# bits. character definition start at row 64, column 0.
|
||||
chY = (pos // linelength) * char_height + charset_start
|
||||
chY = (pos / linelength) * char_height + charset_start
|
||||
chX = pos % linelength
|
||||
targX = x + xOffset
|
||||
targY = y + yOffset
|
||||
chW = char_width
|
||||
if ch in "',.:;":
|
||||
chW =char_twidth
|
||||
chW = char_twidth
|
||||
if drawable is None:
|
||||
pywmgeneral.copyXPMArea(chX, chY, chW, char_height, targX, targY)
|
||||
else:
|
||||
@ -131,7 +131,7 @@ def getVertSpacing(numLines, margin, height, yOffset):
|
||||
|
||||
margin is the space we want between the first line and the top."""
|
||||
h = height - (numLines * char_height + 1) - yOffset * 2 - margin
|
||||
return h // (numLines - 1)
|
||||
return h / (numLines - 1)
|
||||
|
||||
|
||||
def readXPM(fileName):
|
||||
@ -145,8 +145,8 @@ def readXPM(fileName):
|
||||
Raise IOError if we run into trouble when trying to read the file. This
|
||||
function has not been tested extensively. do not try to use more than
|
||||
"""
|
||||
with open(fileName, 'r') as f:
|
||||
lines = [l.rstrip('\n') for l in f.readlines()]
|
||||
f = file(fileName, 'r')
|
||||
lines = [l.rstrip('\n') for l in f.readlines()]
|
||||
s = ''.join(lines)
|
||||
res = []
|
||||
while 1:
|
||||
@ -260,7 +260,7 @@ def initPixmap(background=None,
|
||||
] + [
|
||||
' '*width for item in range(margin)
|
||||
]
|
||||
elif isinstance(background, list) and not isinstance(background[0], str):
|
||||
elif isinstance(background, types.ListType) and not isinstance(background[0], types.StringTypes):
|
||||
nbackground = [[' ']*width for i in range(height)]
|
||||
for ((left, top),(right, bottom)) in background:
|
||||
for x in range(left, right+1):
|
||||
@ -329,7 +329,7 @@ def initPixmap(background=None,
|
||||
origRgb = [int(origColor[i*2:i*2+2],16)/256. for i in range(3)]
|
||||
intensity = sum(origRgb) / 3
|
||||
newRgb = [i * intensity + base for i,base in zip(fg_vec, bg_point)]
|
||||
new_font_palette[k] = '#'+''.join(["%02x"%int(i) for i in newRgb])
|
||||
new_font_palette[k] = '#'+''.join(["%02x"%i for i in newRgb])
|
||||
|
||||
return new_font_palette
|
||||
|
||||
@ -364,10 +364,10 @@ def initPixmap(background=None,
|
||||
for line in fontdef
|
||||
]
|
||||
if debug:
|
||||
print('/* XPM */\nstatic char *_x_[] = {')
|
||||
print '/* XPM */\nstatic char *_x_[] = {'
|
||||
for item in xpm:
|
||||
print('"%s",' % item)
|
||||
print('};')
|
||||
print '"%s",' % item
|
||||
print '};'
|
||||
pywmgeneral.includePixmap(xpm)
|
||||
return char_width, char_height
|
||||
|
||||
@ -436,8 +436,9 @@ def getColorCode(colorName, rgbFileName=None):
|
||||
if rgbFileName is None:
|
||||
raise ValueError('cannot find rgb file')
|
||||
|
||||
with open(rgbFileName, 'r') as f:
|
||||
lines = f.readlines()
|
||||
f = file(rgbFileName, 'r')
|
||||
lines = f.readlines()
|
||||
f.close()
|
||||
for l in lines:
|
||||
if l[0] != '!':
|
||||
words = l.split()
|
||||
|
@ -1,6 +1,5 @@
|
||||
import sys, time
|
||||
import wmdocklib.pywmhelpers as pywmhelpers
|
||||
import wmdocklib.pywmgeneral as pywmgeneral
|
||||
import pywmhelpers
|
||||
|
||||
debug = 0
|
||||
|
||||
@ -45,7 +44,7 @@ class Application:
|
||||
if size is None:
|
||||
size = (self._char_width * len(text), self._char_height)
|
||||
pixmapwidth = self._char_width * len(text)
|
||||
# import pywmgeneral
|
||||
import pywmgeneral
|
||||
labelPixmap = pywmgeneral.Drawable(pixmapwidth, self._char_height)
|
||||
self._elements[labelId] = [orig, size, pixmapwidth, 0, labelPixmap]
|
||||
self.setLabelText(labelId, text)
|
||||
@ -56,6 +55,7 @@ class Application:
|
||||
(orig_x,orig_y), (size_x, size_y), width, offset, pixmap = self._elements[labelId]
|
||||
newwidth = self._char_width * len(text)
|
||||
if newwidth > width:
|
||||
import pywmgeneral
|
||||
pixmap = pywmgeneral.Drawable(newwidth, self._char_height)
|
||||
self._elements[labelId][4] = pixmap
|
||||
self._elements[labelId][2] = newwidth
|
||||
@ -101,7 +101,7 @@ class Application:
|
||||
mouse or keyboard event. all fields may be left to their 'None'
|
||||
default value, in which case the callback is activated on any event.
|
||||
"""
|
||||
if area is not None and len(area) != 4:
|
||||
if area is not None and len(area) is not 4:
|
||||
area = None
|
||||
self._events.append( (type, key, area, callback,) )
|
||||
pass
|
||||
|
Loading…
Reference in New Issue
Block a user