diff --git a/terminatorlib/keybindings.py b/terminatorlib/keybindings.py index e1aa9656..2e7df455 100644 --- a/terminatorlib/keybindings.py +++ b/terminatorlib/keybindings.py @@ -1,9 +1,33 @@ +#!/usr/bin/python +# Terminator - multiple gnome terminals in one window +# Copyright (C) 2006-2008 cmsj@tenshu.net +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 2 only. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -import re, gtk -import terminatorlib.config +"""Terminator by Chris Jones + +Validator and functions for dealing with Terminator's customisable +keyboard shortcuts. + +""" + +import re +import gtk from terminatorlib.config import err class KeymapError(Exception): + """Custom exception for errors in keybinding configurations""" def __init__(self, value): Exception.__init__(self, value) self.value = value @@ -12,8 +36,9 @@ class KeymapError(Exception): def __str__(self): return "Keybinding '%s' invalid: %s" % (self.action, self.value) -Modifier = re.compile('<([^<]+)>') +MODIFIER = re.compile('<([^<]+)>') class TerminatorKeybindings: + """Class to handle loading and lookup of Terminator keybindings""" modifiers = { 'ctrl': gtk.gdk.CONTROL_MASK, @@ -23,16 +48,21 @@ class TerminatorKeybindings: } empty = {} + keys = None + _masks = None + _lookup = None def __init__(self): self.keymap = gtk.gdk.keymap_get_default() self.configure({}) def configure(self, bindings): + """Accept new bindings and reconfigure with them""" self.keys = bindings self.reload() def reload(self): + """Parse bindings and mangle into an appropriate form""" self._lookup = {} self._masks = 0 for action, bindings in self.keys.items(): @@ -47,9 +77,9 @@ class TerminatorKeybindings: keyval, mask = self._parsebinding(binding) # Does much the same, but with poorer error handling. #keyval, mask = gtk.accelerator_parse(binding) - except KeymapError, e: - e.action = action - raise e + except KeymapError, ex: + ex.action = action + raise ex else: if mask & gtk.gdk.SHIFT_MASK: if keyval == gtk.keysyms.Tab: @@ -67,12 +97,13 @@ class TerminatorKeybindings: self._masks |= mask def _parsebinding(self, binding): + """Parse an individual binding using gtk's binding function""" mask = 0 - modifiers = re.findall(Modifier, binding) + modifiers = re.findall(MODIFIER, binding) if modifiers: for modifier in modifiers: mask |= self._lookup_modifier(modifier) - key = re.sub(Modifier, '', binding) + key = re.sub(MODIFIER, '', binding) if key == '': raise KeymapError('No key found') keyval = gtk.gdk.keyval_from_name(key) @@ -81,16 +112,22 @@ class TerminatorKeybindings: return (keyval, mask) def _lookup_modifier(self, modifier): + """Map modifier names to gtk values""" try: return self.modifiers[modifier.lower()] except KeyError: raise KeymapError("Unhandled modifier '<%s>'" % modifier) def lookup(self, event): + """Translate a keyboard event into a mapped key""" try: - keyval, egroup, level, consumed = self.keymap.translate_keyboard_state(event.hardware_keycode, event.state & ~gtk.gdk.LOCK_MASK, event.group) + keyval, egroup, level, consumed = self.keymap.translate_keyboard_state( + event.hardware_keycode, + event.state & ~gtk.gdk.LOCK_MASK, + event.group) except TypeError: - err ("keybindings.lookup failed to translate keyboard event: %s"%dir(event)) + err ("keybindings.lookup failed to translate keyboard event: %s" % + dir(event)) return None mask = (event.state & ~consumed) & self._masks return self._lookup.get(mask, self.empty).get(keyval, None) diff --git a/terminatorlib/prefs_profile.py b/terminatorlib/prefs_profile.py index e58b215c..d519e88f 100644 --- a/terminatorlib/prefs_profile.py +++ b/terminatorlib/prefs_profile.py @@ -1,7 +1,7 @@ #!/usr/bin/python from terminatorlib.config import dbg,err,Defaults,TerminatorConfValuestoreRC -from terminatorlib.keybindings import TerminatorKeybindings,Modifier +from terminatorlib.keybindings import TerminatorKeybindings from terminatorlib.version import APP_NAME, APP_VERSION from terminatorlib import translation