1
0
mirror of https://github.com/gryf/wmdocklib.git synced 2025-12-19 12:28:10 +01:00

1723946: weekday is not updated correctly

I've almost completely rewritten the program, cleaned up most stuff which
has become useless in the object oriented framework.

the strings are not any more centered, this has not yet been programmed in the library.
This commit is contained in:
mfrasca
2007-05-24 12:17:10 +00:00
parent 7bd314e1e0
commit e5a8d777b6
4 changed files with 142 additions and 228 deletions

View File

@@ -21,20 +21,25 @@ wmdocklib/4x6.xpm
wmdocklib/4x7.xpm
wmdocklib/5x7-aa.xpm
wmdocklib/5x7.xpm
wmdocklib/5x8-utf-8.xpm
wmdocklib/5x8.xpm
wmdocklib/5x9.xpm
wmdocklib/6(3)x8-7seg.xpm
wmdocklib/6x11-utf-8.xpm
wmdocklib/6x12.xpm
wmdocklib/6x8-7seg.xpm
wmdocklib/6x8.xpm
wmdocklib/6x8orig.xpm
wmdocklib/6x8slant.xpm
wmdocklib/7x12-41c.xpm
wmdocklib/7x14-utf-8.xpm
wmdocklib/7x8zx.xpm
wmdocklib/8x12-41c.xpm
wmdocklib/8x13-utf-8.xpm
wmdocklib/8x8-cholo.xpm
wmdocklib/8x8.xpm
wmdocklib/8x8zx.xpm
wmdocklib/9x18-utf-8.xpm
wmdocklib/README
wmdocklib/__init__.py
wmdocklib/pywmgeneral.c

View File

@@ -26,30 +26,12 @@ Added event handling for graceful shutdown
2003-06-16 Kristoffer Erlandsson
First workingish version
"""
usage = """pywmdatetime.py [options]
Available options are:
-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
-t, --timeformat <format> set the time format
-d, --dateformat <format> set the date format
-y, --weekdayformat <format> set the weekday format
-e, --weekformat <format> set the week format
-r, --rgbfile <file> set the rgb file to get color codes from
-c, --configfile <file> set the config file to use
--debug shows the pixmap
The formats are the same as Python's strftime() accept. See the sample
rc-file for more information about this.
"""
import sys
import time
import getopt
import os
import wmdocklib
from wmdocklib import wmoo, readConfigFile
width = 64
height = 64
@@ -57,163 +39,6 @@ height = 64
xOffset = 4
yOffset = 4
timeDefaultFormat = '%H:%M:%S'
dateDefaultFormat = '%d-%m-%y'
dayDefaultFormat = '%A'
weekDefaultFormat = 'wk %q' # %q added by Kristoffer for different week calculation.
defaultConfigFile = '~/.pywmdatetimerc'
maxCharsPerLine = None
def addString(s, x, y):
try:
wmdocklib.addString(s, x, y, xOffset, yOffset,
width, height)
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),))
raise
sys.exit(3)
def addTimeString(s, x, y):
for c in s:
charW = 7
charX = (ord(c) - ord('0')) * 7
charY = 64
if not c.isdigit():
charX = 70
charW = 3
wmdocklib.copyXPMArea(charX, charY, charW, 10, x+xOffset+1, y+yOffset)
x += charW
def clearLine(y):
'''Clear a line of text at position y.'''
wmdocklib.copyXPMArea(73, yOffset, width - 2 * xOffset, char_height,
xOffset, y + yOffset)
def getCenterStartPos(s):
return wmdocklib.getCenterStartPos(s, width, xOffset)
def getVertSpacing(numLines, margin):
return wmdocklib.getVertSpacing(numLines, margin-1, height, yOffset) + 1
def calculateWeek(localTime):
"""Calculate the week number as we do, for example in Sweden.
That is, add one to the %W format if the year didn't start on a monday."""
day = int(time.strftime('%j', localTime))
weekDay = int(time.strftime('%w')) - 1
if weekDay == -1:
weekDay = 6
lastMonday = day - weekDay
if lastMonday % 7 == 0:
return int(time.strftime('%W'))
return int(time.strftime('%W')) + 1
def parseCommandLine(argv):
"""Parse the commandline. Return a dictionary with options and values."""
shorts = 'hf:b:t:d:e:y:r:c:F:a'
longs = ['antialiased', 'help', 'foreground=', 'background=',
'timeformat=', 'dateformat=', 'debug',
'weekdayformat=', 'weekformat=', 'rgbfile=', 'configfile=', 'font=']
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 ('-a', '--antialiased'):
d['antialiased'] = True
if o in ('-f', '--foreground'):
d['foreground'] = a
if o in ('-F', '--font'):
d['font'] = a
if o in ('-b', '--background'):
d['background'] = a
if o in ('-t', '--timeformat'):
d['timeformat'] = a
if o in ('-d', '--dateformat'):
d['dateformat'] = a
if o in ('-y', '--weekdayformat'):
d['weekdayformat'] = a
if o in ('-e', '--weekformat'):
d['weekformat'] = a
if o in ('-r', '--rgbfile'):
d['rgbfile'] = a
if o in ('-c', '--configfile'):
d['configfile'] = a
if o in ('--debug'):
d['debug'] = True
return d
def checkForEvents():
event = wmdocklib.getEvent()
while not event is None:
if event['type'] == 'destroynotify':
sys.exit(0)
event = wmdocklib.getEvent()
def mainLoop(timeFmt, dateFmt, dayFmt, weekFmt):
recalcWeek = weekFmt.find('%q') + 1 # True if we found %q.
newWeekFmt = weekFmt
counter = -1
lastStrs = [''] * 4
while 1:
counter += 1
checkForEvents()
lt = time.localtime()
timeStr = time.strftime(timeFmt, lt)[:maxCharsPerLine]
timeX = 3
if antialiased:
margin = 6
spacing = getVertSpacing(4, margin)
if lastStrs[0] != timeStr:
addTimeString(timeStr, timeX, margin-4)
margin += 3
else:
margin = 4
spacing = getVertSpacing(4, margin)
if lastStrs[0] != timeStr:
addString(timeStr, timeX, margin)
lastStrs[0] = timeStr
if counter % 100 == 0:
# We only perform the date/week checks/updates once every 100th
# iteration. We will maybe lag behind a couple of seconds when
# switching, but switching occurs seldom and it will be alot of
# unnecessary checks :).
dateStr = time.strftime(dateFmt, lt)[:maxCharsPerLine]
if recalcWeek:
week = calculateWeek(lt)
newWeekFmt = weekFmt.replace('%q', str(week))
weekStr = time.strftime(newWeekFmt, lt)[:maxCharsPerLine]
dayStr = time.strftime(dayFmt, lt)[:maxCharsPerLine]
dateX = getCenterStartPos(dateStr)
weekX = getCenterStartPos(weekStr)
dayX = getCenterStartPos(dayStr)
if lastStrs[1] != dateStr:
clearLine(margin + spacing + char_width)
addString(dateStr, dateX, margin + spacing + char_width)
lastStrs[1] = dateStr
if lastStrs[2] != dayStr:
clearLine(margin + 2 * (spacing + char_width))
addString(dayStr, dayX, margin + 2 * (spacing + char_width))
lastStrs[2] = dayStr
if lastStrs[3] != weekStr:
clearLine(margin + 3 * (spacing + char_width))
addString(weekStr, weekX, margin + 3 * (spacing + char_width))
lastStrs[3] = weekStr
if counter == 999999:
counter = -1
wmdocklib.redraw()
time.sleep(0.1)
patterns = [
".+@@+.....#@...#@@#...#@@#....$@%...@@@@+..+=@%..+@@@@@..%@@+...&@@#.....",
"$@==@$...+@@..&@--@&.*@--@&...#@%..*@-%%*.$==-@&.*%%%@=.#@-=@*.*@=-@&....",
@@ -239,55 +64,136 @@ palette = {
"-":"#CFCF04",
}
def main():
clConfig = parseCommandLine(sys.argv)
configFile = clConfig.get('configfile', defaultConfigFile)
configFile = os.path.expanduser(configFile)
fileConfig = wmdocklib.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]
timeDefaultFormat = '%H:%M:%S'
dateDefaultFormat = '%d-%m-%y'
dayDefaultFormat = '%A'
weekDefaultFormat = 'wk %q' # %q added by Kristoffer for different week calculation.
timeFmt = config.get('timeformat', timeDefaultFormat)
dateFmt = config.get('dateformat', dateDefaultFormat)
dayFmt = config.get('weekdayformat', dayDefaultFormat)
weekFmt = config.get('weekformat', weekDefaultFormat)
# openXwindow sets the window title to the program name. If we get the
# program name with a path, split it so we only name the window with the
# filename.
try:
programName = sys.argv[0].split(os.sep)[-1]
except IndexError: # Should only happen when using the interpreter.
programName = ''
sys.argv[0] = programName
defaultConfigFile = '~/.pywmdatetimerc'
palette[0] = clConfig.get('background', 'black')
palette[2] = clConfig.get('foreground', 'cyan3')
class Application(wmoo.Application):
font = clConfig.get('font', '6x8orig')
def __init__(self):
if clConfig.get('antialiased'):
background = [((6,3),(57,19)),
((3,22),(60,60))]
else:
background = [((3,3),(59,60))]
from optparse import OptionParser
debug = clConfig.get('debug')
parser = OptionParser()
parser.add_option('-a', '--antialiased', dest='antialiased',
action="store_true", default=False)
parser.add_option('-f', '--foreground', type='string', default='cyan3')
parser.add_option('-F', '--font', type='string', default='6x8orig')
parser.add_option('-b', '--background', type='string', default='black')
parser.add_option('-t', '--timeformat', type='string', default=timeDefaultFormat)
parser.add_option('-d', '--dateformat', default=dateDefaultFormat)
parser.add_option('-y', '--weekdayformat', default=dayDefaultFormat)
parser.add_option('-e', '--weekformat', default=weekDefaultFormat)
parser.add_option('-r', '--rgbfile')
#parser.add_option('-c', '--configfile', default=defaultConfigFile)
parser.add_option('--debug', action='store_true', default=False)
global char_width, char_height, maxCharsPerLine, antialiased
char_width, char_height = wmdocklib.initPixmap(patterns=patterns,
font_name=font,
bg=0, fg=2, palette=palette,
background=background,
debug=debug)
maxCharsPerLine = (width-2*xOffset) / char_width
antialiased = clConfig.get('antialiased', False)
configFile = os.path.expanduser("~/.pywmdatetimerc")
# Merge the two configs, let the commandline options overwrite those in the
# configuration file.
config = readConfigFile(configFile, sys.stderr)
parser.set_defaults(**config)
wmdocklib.openXwindow(sys.argv, width, height)
mainLoop(timeFmt, dateFmt, dayFmt, weekFmt)
(options, args) = parser.parse_args()
palette[0] = options.background
palette[2] = options.foreground
if options.antialiased:
background = [((6,3),(57,19)),
((3,22),(60,60))]
else:
background = [((3,3),(59,60))]
wmoo.Application.__init__(self,
patterns=patterns,
font_name=options.font,
bg=0, fg=2, palette=palette,
background=background,
debug=options.debug)
if options.antialiased:
self.addLabel('date', orig=(5,24), size=(54,10), align=wmoo.CENTRE)
self.addLabel('day', orig=(5,36), size=(54,10), align=wmoo.CENTRE)
self.addLabel('week', orig=(5,48), size=(54,10), align=wmoo.CENTRE)
else:
self.addLabel('time', orig=(5, 5), size=(54,10), align=wmoo.CENTRE)
self.addLabel('time2', orig=(5,16), size=(54,10), align=wmoo.CENTRE)
self.addLabel('date', orig=(5,27), size=(54,10), align=wmoo.CENTRE)
self.addLabel('day', orig=(5,38), size=(54,10), align=wmoo.CENTRE)
self.addLabel('week', orig=(5,49), size=(54,10), align=wmoo.CENTRE)
self.timeFmt = options.timeformat
self.dateFmt = options.dateformat
self.dayFmt = options.weekdayformat
self.weekFmt = options.weekformat
self.antialiased = options.antialiased
self.debug = options.debug
self.recalcWeek = self.weekFmt.find('%q') + 1 # True if we found %q.
self.counter = -1
self.lastStrs = [''] * 4
pass
def calculateWeek(self, localTime):
"""Calculate the week number as we do, for example in Sweden.
That is, add one to the %W format if the year didn't start on a monday."""
day = int(time.strftime('%j', localTime))
weekDay = int(time.strftime('%w')) - 1
if weekDay == -1:
weekDay = 6
lastMonday = day - weekDay
if lastMonday % 7 == 0:
return int(time.strftime('%W'))
return int(time.strftime('%W')) + 1
def updateTimeString(self, s):
if self.antialiased:
x, y = 8, 6
for c in s:
charW = 7
charX = (ord(c) - ord('0')) * 7
if not c.isdigit():
charX = 70
charW = 3
self.putPattern(charX, 0, charW, 10, x, y)
x += charW
else:
self.setLabelText('time', s)
def update(self):
self.counter += 1
lt = time.localtime()
timeStr = time.strftime(self.timeFmt, lt)
self.updateTimeString(timeStr)
self.lastStrs[0] = timeStr
if self.counter % 100 == 0:
# We only perform the date/week checks/updates once every 100th
# iteration. We will maybe lag behind a couple of seconds when
# switching, but switching occurs seldom and it will be alot of
# unnecessary checks :).
dateStr = time.strftime(self.dateFmt, lt)
newWeekFmt = self.weekFmt
if self.recalcWeek:
week = calculateWeek(lt)
newWeekFmt = self.weekFmt.replace('%q', str(week))
weekStr = time.strftime(newWeekFmt, lt)
dayStr = time.strftime(self.dayFmt, lt)
if self.lastStrs[1] != dateStr:
self.setLabelText('date', dateStr)
self.lastStrs[1] = dateStr
if self.lastStrs[2] != dayStr:
self.setLabelText('day', dayStr)
self.lastStrs[2] = dayStr
if self.lastStrs[3] != weekStr:
self.setLabelText('week', weekStr)
self.lastStrs[3] = weekStr
if __name__ == '__main__':
main()
app = Application()
app.run()

View File

@@ -164,7 +164,6 @@ class Application(wmoo.Application):
self.putPattern(54, 0, 5, 1, 54, 58-i)
def update(self):
wmoo.Application.update(self)
self._count += 1
if self._count <= 3:
return

View File

@@ -3,6 +3,10 @@ import pywmhelpers
debug = 0
LEFT = 0
CENTRE = 1
RIGHT = 2
class Application:
def __init__(self, *args, **kwargs):
"""initializes the object
@@ -34,17 +38,18 @@ class Application:
pywmhelpers.copyXPMArea(sourceX, sourceY+64, width, height,
targetX, targetY)
def addLabel(self, labelId, orig, size=None, text=None):
def addLabel(self, labelId, orig, size=None, text='', align=LEFT):
"""a label is a tuple with a
text: string; mutable
viewport: (orig: int, int, size: int, int); inmutable
pixmap: drawable; not user mutable, large enough to contain the text
align: one of LEFT, CENTRE, RIGHT
if size is not given, it is inferred from text.
"""
if size is None:
size = (self._char_width * len(text), self._char_height)
pixmapwidth = self._char_width * len(text)
pixmapwidth = max(self._char_width * len(text), size[0])
import pywmgeneral
labelPixmap = pywmgeneral.Drawable(pixmapwidth, self._char_height)
self._elements[labelId] = [orig, size, pixmapwidth, 0, labelPixmap]
@@ -95,6 +100,9 @@ class Application:
pywmhelpers.copyXPMArea(patternOrig[0], patternOrig[1] + 64, w, h, x, y)
def update(self):
pass
def redraw(self):
for labelId in self._elements:
(orig_x,orig_y), (size_x, size_y), width, offset, pixmap = self._elements[labelId]
if size_x < width:
@@ -104,10 +112,6 @@ class Application:
else:
offset += 1
self._elements[labelId][3] = offset
pass
def redraw(self):
self.update()
pywmhelpers.redraw()