[pypy-svn] r7289 - pypy/trunk/src/pypy/translator/tool/pygame
bob at codespeak.net
bob at codespeak.net
Tue Nov 16 16:01:18 CET 2004
Author: bob
Date: Tue Nov 16 16:01:18 2004
New Revision: 7289
Modified:
pypy/trunk/src/pypy/translator/tool/pygame/graphdisplay.py
Log:
crazy "meta meta meta" key permutations for situations such as
lalt and ralt that should always be considered equivalent.
also for keys like = and + which depend on the keyboard mapping
(english vs. german)
Modified: pypy/trunk/src/pypy/translator/tool/pygame/graphdisplay.py
==============================================================================
--- pypy/trunk/src/pypy/translator/tool/pygame/graphdisplay.py (original)
+++ pypy/trunk/src/pypy/translator/tool/pygame/graphdisplay.py Tue Nov 16 16:01:18 2004
@@ -12,18 +12,37 @@
])
if sys.platform == 'darwin':
- PMETA = 'lmeta'
+ PMETA = 'lmeta', 'rmeta'
else:
- PMETA = 'lalt'
+ PMETA = 'lalt', 'ralt'
-METAKEYS['meta'] = METAKEYS[PMETA]
-METAKEYS['shift'] = METAKEYS['lshift']
+METAKEYS['meta'] = PMETA
+METAKEYS['shift'] = 'lshift', 'rshift'
KEYS = dict([
(ident[len('K_'):].lower(), getattr(pygame.locals, ident))
for ident in dir(pygame.locals) if ident.startswith('K_')
])
+KEYS['plus'] = ('=', '+')
+KEYS['quit'] = ('q', 'f4')
+
+def GET_KEY(key):
+ k = KEYS.get(key)
+ if k is None:
+ assert len(key) == 1
+ return ord(key)
+ return k
+
+def permute_mods(base, args):
+ if not args:
+ yield base
+ return
+ first, rest = args[0], args[1:]
+ for val in first:
+ for rval in permute_mods(base | val, rest):
+ yield rval
+
class Display(object):
def __init__(self, (w,h)=(800,680)):
@@ -46,13 +65,11 @@
KEYS = {
'meta -' : ('zoom', 0.5),
- 'meta =' : ('zoom', 2.0),
- 'meta +' : ('zoom', 2.0),
+ 'meta plus' : ('zoom', 2.0),
'meta 0' : 'zoom_actual_size',
'meta 1' : 'zoom_to_fit',
- 'meta q' : 'quit',
+ 'meta quit' : 'quit',
'escape' : 'quit',
- 'meta f4' : 'quit',
'meta right' : 'layout_forward',
'meta left': 'layout_back',
'p' : 'layout_back',
@@ -84,25 +101,37 @@
pygame.key.set_repeat(*self.KEY_REPEAT)
for strnames, methodname in self.KEYS.iteritems():
names = strnames.split()
- mod = 0
- key = 0
if not isinstance(methodname, basestring):
methodname, args = methodname[0], methodname[1:]
else:
args = ()
- for name in names:
- if name in METAKEYS:
- mod |= METAKEYS[name]
- elif name in KEYS:
- key = KEYS[name]
- else:
- assert len(name) == 1
- key = ord(name)
method = getattr(self, methodname, None)
if method is None:
print 'Can not implement key mapping %r, %s.%s does not exist' % (
strnames, self.__class__.__name__, methodname)
- self.key_cache[(key, mod)] = (method, args)
+ continue
+
+ mods = []
+ basemod = 0
+ keys = []
+ for name in names:
+ if name in METAKEYS:
+ val = METAKEYS[name]
+ if not isinstance(val, int):
+ mods.append(tuple([METAKEYS[k] for k in val]))
+ else:
+ basemod |= val
+ else:
+ val = GET_KEY(name)
+ assert len(keys) == 0
+ if not isinstance(val, int):
+ keys.extend([GET_KEY(k) for k in val])
+ else:
+ keys.append(val)
+ assert keys
+ for key in keys:
+ for mod in permute_mods(basemod, mods):
+ self.key_cache[(key, mod)] = (method, args)
def setlayout(self, layout):
if self.viewer:
More information about the Pypy-commit
mailing list