wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit 284b970e8f3c58b684c8bced2c465ee0cba447a1
parent ea79a8c1b939a0de7f491d61f31c9e854fc5f340
Author: Kris Maglione <jg@suckless.org>
Date:   Fri,  9 Oct 2009 20:34:23 -0400

Minor changes to pygmi.events API.

Diffstat:
alternative_wmiircs/python/pygmi/__init__.py | 6+++---
alternative_wmiircs/python/pygmi/event.py | 181+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
alternative_wmiircs/python/pygmi/events.py | 180-------------------------------------------------------------------------------
alternative_wmiircs/python/wmiirc.py | 12++++++------
4 files changed, 190 insertions(+), 189 deletions(-)

diff --git a/alternative_wmiircs/python/pygmi/__init__.py b/alternative_wmiircs/python/pygmi/__init__.py @@ -14,13 +14,13 @@ shell = os.environ['SHELL'] 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 --git a/alternative_wmiircs/python/pygmi/event.py b/alternative_wmiircs/python/pygmi/event.py @@ -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 --git a/alternative_wmiircs/python/pygmi/events.py b/alternative_wmiircs/python/pygmi/events.py @@ -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 --git a/alternative_wmiircs/python/wmiirc.py b/alternative_wmiircs/python/wmiirc.py @@ -6,7 +6,7 @@ import traceback import pygmi from pygmi import * -from pygmi import events +from pygmi import event identity = lambda k: k @@ -18,7 +18,7 @@ identity = lambda k: k # wmiirc or any other modules it needs. # Keys -events.keydefs = dict( +keys.defs = dict( mod='Mod4', left='h', down='j', @@ -36,7 +36,7 @@ floatbackground='#222222' 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 @@ def unresponsive_client(client): 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 @@ bind_events({ }) @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 @@ for f in ['wmiirc_local'] + ['plugins.%s' % file[:-3] for file in files]: except Exception, e: traceback.print_exc(sys.stdout) -event_loop() +events.loop() # vim:se sts=4 sw=4 et: