Audio/AudioControl: Lots of fixes
[audiocontrol.git] / Keyboard.py
1 import Views, Events
2 import sys, curses, curses.ascii
3
4 class Source(Events.EventSource):
5
6     def __init__(self, context, win):
7         Events.EventSource.__init__(self, sys.stdin, context)
8         self._win = win
9
10     def readEvents(self):
11         return [Events.Event(self.context(),  self._win.getch())]
12
13
14 class View(Views.View):
15
16     def __init__(self, context, label, x, y, dx, dy, size=9, ignore_keys = ()):
17         Views.View.__init__(self, context, label, x, y, dx, dy )
18         self._size = size
19         self._ignore_keys = ignore_keys
20
21     def updateView(self, bindings):
22         self.win().clear()
23         self.drawFrame()
24         keys = bindings.keys()
25         keys.sort()
26         column = 2
27         row = 1
28         for key in keys:
29             keyname = curses.keyname(key.code)
30             if keyname.startswith('KEY_'):
31                 keyname = '%s' % keyname[4:10].lower()
32             if keyname[-2:-1] == '^':
33                 keyname = '%sC-%s' % (keyname[:-2],keyname[-1:].lower())
34             if curses.ascii.isupper(ord(keyname[-1:])):
35                 keyname = '%sS-%s' % (keyname[:-1],keyname[-1:].lower())
36             if keyname in self._ignore_keys : continue
37             self.win().addstr(row, column, '%-6s %s'
38                               % (keyname, bindings[key].label[:self._size]))
39             row += 1
40             if row >= self.dy-1:
41                 row = 1
42                 column += self._size+10
43                 if column+self._size+7 >= self.dx : break
44                 self.win().vline(1,column-2,curses.ACS_VLINE,self.dy-2)
45         self.win().nooutrefresh()
46
47 def register( viewmanager,
48               dispatcher,
49               context,
50               label,
51               x,
52               y,
53               dx,
54               dy,
55               size = 9,
56               ignore_keys = ()):
57     viewmanager.registerView( View(context, label, x,y,dx,dy,size,ignore_keys) )
58     dispatcher.registerSource( Source(context, viewmanager.win()) )