[hackers] [wmii] Minor changes to pygmi.events API. || Kris Maglione

From: <hg_AT_suckless.org>
Date: Sun, 11 Oct 2009 09:36:09 +0000 (UTC)

changeset: 2524:a1498ca4aa13
user: Kris Maglione <jg_AT_suckless.org>
date: Fri Oct 09 20:34:23 2009 -0400
files: alternative_wmiircs/python/pygmi/__init__.py alternative_wmiircs/python/pygmi/event.py alternative_wmiircs/python/pygmi/events.py alternative_wmiircs/python/wmiirc.py
description:
Minor changes to pygmi.events API.

diff -r 7f5efccf6aee -r a1498ca4aa13 alternative_wmiircs/python/pygmi/__init__.py
--- a/alternative_wmiircs/python/pygmi/__init__.py Fri Oct 09 16:40:33 2009 -0400
+++ b/alternative_wmiircs/python/pygmi/__init__.py Fri Oct 09 20:34:23 2009 -0400
@@ -14,13 +14,13 @@
 sys.path += confpath
 
 from pygmi.util import *
-from pygmi.events import *
+from pygmi.event import *
 from pygmi.fs import *
 from pygmi.menu import *
 from pygmi.monitor import *
-from pygmi import util, events, fs, menu, monitor
+from pygmi import util, event, fs, menu, monitor
 
-__all__ = (fs.__all__ + monitor.__all__ + events.__all__ +
+__all__ = (fs.__all__ + monitor.__all__ + event.__all__ +
            menu.__all__ + util.__all__ +
            ('client', 'confpath', 'shell'))
 
diff -r 7f5efccf6aee -r a1498ca4aa13 alternative_wmiircs/python/pygmi/event.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/alternative_wmiircs/python/pygmi/event.py Fri Oct 09 20:34:23 2009 -0400
@@ -0,0 +1,181 @@
+import os
+import re
+import sys
+import traceback
+
+import pygmi
+from pygmi import monitor, client, curry, call, program_list, _
+
+__all__ = ('keys', 'events', 'Match')
+
+class Match(object):
+ def __init__(self, *args):
+ self.args = args
+ self.matchers = []
+ for a in args:
+ if a is _:
+ a = lambda k: True
+ elif isinstance(a, basestring):
+ a = a.__eq__
+ elif isinstance(a, (list, tuple, set)):
+ a = curry(lambda ary, k: k in ary, a)
+ elif hasattr(a, 'search'):
+ a = a.search
+ else:
+ a = str(a).__eq__
+ self.matchers.append(a)
+
+ def match(self, string):
+ ary = string.split(' ', len(self.matchers))
+ if all(m(a) for m, a in zip(self.matchers, ary)):
+ return ary
+
+def flatten(items):
+ for k, v in items:
+ if not isinstance(k, (list, tuple)):
+ k = k,
+ for key in k:
+ yield key, v
+
+class Events():
+ def __init__(self):
+ self.events = {}
+ self.eventmatchers = {}
+ self.alive = True
+
+ def dispatch(self, event, args=''):
+ try:
+ if event in self.events:
+ self.events[event](args)
+ for matcher, action in self.eventmatchers.iteritems():
+ ary = matcher.match(' '.join((event, args)))
+ if ary is not None:
+ action(*ary)
+ except Exception, e:
+ traceback.print_exc(sys.stderr)
+
+ def loop(self):
+ keys.mode = 'main'
+ for line in client.readlines('/event'):
+ if not self.alive:
+ break
+ self.dispatch(*line.split(' ', 1))
+ self.alive = False
+
+ def bind(self, items={}, **kwargs):
+ kwargs.update(items)
+ for k, v in flatten(kwargs.iteritems()):
+ if hasattr(k, 'match'):
+ self.eventmatchers[k] = v
+ else:
+ self.events[k] = v
+
+ def event(self, fn):
+ self.bind({fn.__name__: fn})
+events = Events()
+
+class Keys(object):
+ def __init__(self):
+ self.modes = {}
+ self.modelist = []
+ self.mode = 'main'
+ self.defs = {}
+ events.bind(Key=self.dispatch)
+
+ def _add_mode(self, mode):
+ if mode not in self.modes:
+ self.modes[mode] = {
+ 'name': mode,
+ 'desc': {},
+ 'groups': [],
+ 'keys': {},
+ 'import': {},
+ }
+ self.modelist.append(mode)
+
+ def _set_mode(self, mode):
+ self._add_mode(mode)
+ self._mode = mode
+ self._keys = dict((k % self.defs, v) for k, v in
+ self.modes[mode]['keys'].items() +
+ self.modes[mode]['import'].items());
+
+ client.write('/keys', '\n'.join(self._keys.keys()) + '\n')
+ mode = property(lambda self: self._mode, _set_mode)
+
+ @property
+ def help(self):
+ return '\n\n'.join(
+ ('Mode %s\n' % mode['name']) +
+ '\n\n'.join((' %s\n' % str(group or '')) +
+ '\n'.join(' %- 20s %s' % (key % self.defs,
+ mode['keys'][key].__doc__)
+ for key in mode['desc'][group])
+ for group in mode['groups'])
+ for mode in (self.modes[name]
+ for name in self.modelist))
+
+ def bind(self, mode='main', keys=(), import_={}):
+ self._add_mode(mode)
+ mode = self.modes[mode]
+ group = None
+ def add_desc(key, desc):
+ if group not in mode['desc']:
+ mode['desc'][group] = []
+ mode['groups'].append(group)
+ if key not in mode['desc'][group]:
+ mode['desc'][group].append(key);
+
+ if isinstance(keys, dict):
+ keys = keys.iteritems()
+ for obj in keys:
+ if isinstance(obj, tuple) and len(obj) in (2, 3):
+ if len(obj) == 2:
+ key, val = obj
+ desc = ''
+ elif len(obj) == 3:
+ key, desc, val = obj
+ mode['keys'][key] = val
+ add_desc(key, desc)
+ val.__doc__ = str(desc)
+ else:
+ group = obj
+
+ def wrap_import(mode, key):
+ return lambda k: self.modes[mode]['keys'][key](k)
+ for k, v in flatten((v, k) for k, v in import_.iteritems()):
+ mode['import'][k % self.defs] = wrap_import(v, k)
+
+ def dispatch(self, key):
+ mode = self.modes[self.mode]
+ if key in self._keys:
+ return self._keys[key](key)
+keys = Keys()
+
+class Actions(object):
+ def __getattr__(self, name):
+ if name.startswith('_') or name.endswith('_'):
+ raise AttributeError()
+ if hasattr(self, name + '_'):
+ return getattr(self, name + '_')
+ def action(args=''):
+ cmd = pygmi.find_script(name)
+ if cmd:
+ call(pygmi.shell, '-c', '$* %s' % args, '--', cmd,
+ background=True)
+ return action
+
+ def _call(self, args):
+ a = args.split(' ', 1)
+ if a:
+ getattr(self, a[0])(*a[1:])
+
+ @property
+ def _choices(self):
+ return sorted(
+ program_list(pygmi.confpath) +
+ [re.sub('_$', '', k) for k in dir(self)
+ if not re.match('^_', k) and callable(getattr(self, k))])
+
+
+# vim:se sts=4 sw=4 et:
diff -r 7f5efccf6aee -r a1498ca4aa13 alternative_wmiircs/python/pygmi/events.py
--- a/alternative_wmiircs/python/pygmi/events.py Fri Oct 09 16:40:33 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,180 +0,0 @@
-import os
-import re
-import sys
-import traceback
-
-import pygmi
-from pygmi import monitor, client, curry, call, program_list, _
-
-__all__ = ('keys', 'bind_events', 'event_loop', 'event', 'Match')
-
-keydefs = {}
-events = {}
-eventmatchers = {}
-
-alive = True
-
-class Match(object):
- def __init__(self, *args):
- self.args = args
- self.matchers = []
- for a in args:
- if a is _:
- a = lambda k: True
- elif isinstance(a, basestring):
- a = a.__eq__
- elif isinstance(a, (list, tuple)):
- a = curry(lambda ary, k: k in ary, a)
- elif hasattr(a, 'search'):
- a = a.search
- else:
- a = str(a).__eq__
- self.matchers.append(a)
-
- def match(self, string):
- ary = string.split(' ', len(self.matchers))
- if all(m(a) for m, a in zip(self.matchers, ary)):
- return ary
-
-def flatten(items):
- for k, v in items:
- if not isinstance(k, (list, tuple)):
- k = k,
- for key in k:
- yield key, v
-
-def bind_events(items={}, **kwargs):
- kwargs.update(items)
- for k, v in flatten(kwargs.iteritems()):
- if isinstance(k, Match):
- eventmatchers[k] = v
- else:
- events[k] = v
-
-def event(fn):
- bind_events({fn.__name__: fn})
-
-class Keys(object):
- def __init__(self):
- self.modes = {}
- self.modelist = []
- self.mode = 'main'
- bind_events(Key=self.dispatch)
-
- def _add_mode(self, mode):
- if mode not in self.modes:
- self.modes[mode] = {
- 'name': mode,
- 'desc': {},
- 'groups': [],
- 'keys': {},
- 'import': {},
- }
- self.modelist.append(mode)
-
- def _set_mode(self, mode):
- self._add_mode(mode)
- self._mode = mode
- self._keys = dict((k % keydefs, v) for k, v in
- self.modes[mode]['keys'].items() +
- self.modes[mode]['import'].items());
-
- client.write('/keys', '\n'.join(self._keys.keys()) + '\n')
- mode = property(lambda self: self._mode, _set_mode)
-
- @property
- def help(self):
- return '\n\n'.join(
- ('Mode %s\n' % mode['name']) +
- '\n\n'.join((' %s\n' % str(group or '')) +
- '\n'.join(' %- 20s %s' % (key % keydefs,
- mode['keys'][key].__doc__)
- for key in mode['desc'][group])
- for group in mode['groups'])
- for mode in (self.modes[name]
- for name in self.modelist))
-
- def bind(self, mode='main', keys=(), import_={}):
- self._add_mode(mode)
- mode = self.modes[mode]
- group = None
- def add_desc(key, desc):
- if group not in mode['desc']:
- mode['desc'][group] = []
- mode['groups'].append(group)
- if key not in mode['desc'][group]:
- mode['desc'][group].append(key);
-
- if isinstance(keys, dict):
- keys = keys.iteritems()
- for obj in keys:
- if isinstance(obj, tuple) and len(obj) in (2, 3):
- if len(obj) == 2:
- key, val = obj
- desc = ''
- elif len(obj) == 3:
- key, desc, val = obj
- mode['keys'][key] = val
- add_desc(key, desc)
- val.__doc__ = str(desc)
- else:
- group = obj
-
- def wrap_import(mode, key):
- return lambda k: self.modes[mode]['keys'][key](k)
- for k, v in flatten((v, k) for k, v in import_.iteritems()):
- mode['import'][k % keydefs] = wrap_import(v, k)
-
- def dispatch(self, key):
- mode = self.modes[self.mode]
- if key in self._keys:
- return self._keys[key](key)
-keys = Keys()
-
-def dispatch(event, args=''):
- try:
- if event in events:
- events[event](args)
- for matcher, action in eventmatchers.iteritems():
- ary = matcher.match(' '.join((event, args)))
- if ary is not None:
- action(*ary)
- except Exception, e:
- traceback.print_exc(sys.stderr)
-
-def event_loop():
- from pygmi import events
- keys.mode = 'main'
- for line in client.readlines('/event'):
- if not events.alive:
- break
- dispatch(*line.split(' ', 1))
- events.alive = False
-
-class Actions(object):
- def __getattr__(self, name):
- if name.startswith('_') or name.endswith('_'):
- raise AttributeError()
- if hasattr(self, name + '_'):
- return getattr(self, name + '_')
- def action(args=''):
- cmd = pygmi.find_script(name)
- if cmd:
- call(pygmi.shell, '-c', '$* %s' % args, '--', cmd,
- background=True)
- return action
-
- def _call(self, args):
- a = args.split(' ', 1)
- if a:
- getattr(self, a[0])(*a[1:])
-
- @property
- def _choices(self):
- return sorted(
- program_list(pygmi.confpath) +
- [re.sub('_$', '', k) for k in dir(self)
- if not re.match('^_', k) and callable(getattr(self, k))])
-
-
-# vim:se sts=4 sw=4 et:
diff -r 7f5efccf6aee -r a1498ca4aa13 alternative_wmiircs/python/wmiirc.py
--- a/alternative_wmiircs/python/wmiirc.py Fri Oct 09 16:40:33 2009 -0400
+++ b/alternative_wmiircs/python/wmiirc.py Fri Oct 09 20:34:23 2009 -0400
@@ -6,7 +6,7 @@
 
 import pygmi
 from pygmi import *
-from pygmi import events
+from pygmi import event
 
 identity = lambda k: k
 
@@ -18,7 +18,7 @@
 # wmiirc or any other modules it needs.
 
 # Keys
-events.keydefs = dict(
+keys.defs = dict(
     mod='Mod4',
     left='h',
     down='j',
@@ -36,7 +36,7 @@
 wmii['font'] = 'drift,-*-fixed-*-*-*-*-9-*-*-*-*-*-*-*'
 wmii['normcolors'] = '#000000', '#c1c48b', '#81654f'
 wmii['focuscolors'] = '#000000', '#81654f', '#000000'
-wmii['grabmod'] = events.keydefs['mod']
+wmii['grabmod'] = keys.defs['mod']
 wmii['border'] = 2
 
 def setbackground(color):
@@ -76,7 +76,7 @@
 client.awrite('/event', 'Start wmiirc')
 
 tags = Tags()
-bind_events({
+events.bind({
     ('Quit', Match('Start', 'wmiirc')): lambda *a: sys.exit(),
     'CreateTag': tags.add,
     'DestroyTag': tags.delete,
@@ -112,7 +112,7 @@
 })
 
 @apply
-class Actions(events.Actions):
+class Actions(event.Actions):
     def rehash(self, args=''):
         program_menu.choices = program_list(os.environ['PATH'].split(':'))
     def showkeys(self, args=''):
@@ -303,6 +303,6 @@
     except Exception, e:
         traceback.print_exc(sys.stdout)
 
-event_loop()
+events.loop()
 
 # vim:se sts=4 sw=4 et:
Received on Sun Oct 11 2009 - 09:36:09 UTC

This archive was generated by hypermail 2.2.0 : Sun Oct 11 2009 - 09:48:16 UTC