aboutsummaryrefslogtreecommitdiffhomepage
path: root/examples
diff options
context:
space:
mode:
authorGravatar Mason Larobina <mason.larobina@gmail.com>2009-12-04 21:36:51 +0800
committerGravatar Mason Larobina <mason.larobina@gmail.com>2009-12-04 21:36:51 +0800
commit0061e5afefebcba68f5922e5d9d97ff6852788f3 (patch)
tree449ab5a9072cdc6195bb17dcb7380b94b18192a7 /examples
parentc0eac2a19e3b0cbcad45566e79795f89996b98aa (diff)
Fixed problem with keys persisting after their release events.
Diffstat (limited to 'examples')
-rw-r--r--examples/data/uzbl/plugins/keycmd.py29
1 files changed, 20 insertions, 9 deletions
diff --git a/examples/data/uzbl/plugins/keycmd.py b/examples/data/uzbl/plugins/keycmd.py
index 0f5bb9b..af6beff 100644
--- a/examples/data/uzbl/plugins/keycmd.py
+++ b/examples/data/uzbl/plugins/keycmd.py
@@ -33,6 +33,7 @@ class Keylet(object):
def __init__(self):
# Modcmd tracking
self.held = set()
+ self.ignored = set()
self.modcmd = ''
self.is_modcmd = False
@@ -82,15 +83,18 @@ class Keylet(object):
results in a modkey addition. Return that addition and remove all
modkeys that created it.'''
- already_added = self.held & set(self.additions.keys())
- for key in already_added:
- if modkey in self.additions[key]:
+ # Intersection of (held list + modkey) and additions.
+ added = (self.held | set([modkey])) & set(self.additions.keys())
+ for key in added:
+ if key == modkey or modkey in self.additions[key]:
+ self.held -= self.additions[key]
return key
- modkeys = set(list(self.held) + [modkey,])
+ # Held list + ignored list + modkey.
+ modkeys = self.held | self.ignored | set([modkey])
for (key, value) in self.additions.items():
if modkeys.issuperset(value):
- self.held = modkeys ^ value
+ self.held -= value
return key
return modkey
@@ -268,6 +272,7 @@ def clear_modcmd(uzbl, clear_held=False):
k.is_modcmd = False
k._repr_cache = False
if clear_held:
+ k.ignored = set()
k.held = set()
uzbl.set('modcmd')
@@ -335,7 +340,7 @@ def inject_str(str, index, inj):
return "%s%s%s" % (str[:index], inj, str[index:])
-def get_keylet_and_key(uzbl, key):
+def get_keylet_and_key(uzbl, key, add=True):
'''Return the keylet and apply any transformations to the key as defined
by the modmapping or modkey addition rules. Return None if the key is
ignored.'''
@@ -346,6 +351,14 @@ def get_keylet_and_key(uzbl, key):
return (keylet, key)
modkey = "<%s>" % key.strip("<>")
+
+ if keylet.key_ignored(modkey):
+ if add:
+ keylet.ignored.add(modkey)
+
+ elif modkey in keylet.ignored:
+ keylet.ignored.remove(modkey)
+
modkey = keylet.find_addition(modkey)
if keylet.key_ignored(modkey):
@@ -403,9 +416,7 @@ def key_release(uzbl, key):
3. Check if any modkey is held, if so set modcmd mode.
4. Update the keycmd uzbl variable if anything changed.'''
- (k, key) = get_keylet_and_key(uzbl, key.strip())
- if not key:
- return
+ (k, key) = get_keylet_and_key(uzbl, key.strip(), add=False)
if key in k.held:
if k.is_modcmd: