Skip to content

Commit

Permalink
Add support for a second keybind per action
Browse files Browse the repository at this point in the history
Modifying code:
 - terminatorlib/config.py
 - terminatorlib/keybindings.py
 - terminatorlib/plugin.py
 - terminatorlib/preferences.glade
 - terminatorlib/prefseditor.py
 - terminatorlib/terminal_popup_menu.py

Modifying test:
 - tests/test_prefseditor_keybindings.py

Updating translation files in po/*

Closes gnome-terminator#371
  • Loading branch information
rcalixte committed Jan 12, 2024
1 parent 6d225c7 commit 71dee3a
Show file tree
Hide file tree
Showing 90 changed files with 36,498 additions and 31,202 deletions.
786 changes: 424 additions & 362 deletions po/af.po

Large diffs are not rendered by default.

800 changes: 431 additions & 369 deletions po/ar.po

Large diffs are not rendered by default.

786 changes: 424 additions & 362 deletions po/ast.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/az.po

Large diffs are not rendered by default.

775 changes: 411 additions & 364 deletions po/be.po

Large diffs are not rendered by default.

795 changes: 427 additions & 368 deletions po/bg.po

Large diffs are not rendered by default.

781 changes: 420 additions & 361 deletions po/bn.po

Large diffs are not rendered by default.

828 changes: 454 additions & 374 deletions po/bs.po

Large diffs are not rendered by default.

800 changes: 431 additions & 369 deletions po/ca.po

Large diffs are not rendered by default.

786 changes: 424 additions & 362 deletions po/[email protected]

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/ckb.po

Large diffs are not rendered by default.

824 changes: 452 additions & 372 deletions po/cs.po

Large diffs are not rendered by default.

810 changes: 439 additions & 371 deletions po/da.po

Large diffs are not rendered by default.

832 changes: 459 additions & 373 deletions po/de.po

Large diffs are not rendered by default.

800 changes: 431 additions & 369 deletions po/el.po

Large diffs are not rendered by default.

800 changes: 431 additions & 369 deletions po/en_AU.po

Large diffs are not rendered by default.

786 changes: 424 additions & 362 deletions po/en_CA.po

Large diffs are not rendered by default.

824 changes: 452 additions & 372 deletions po/en_GB.po

Large diffs are not rendered by default.

792 changes: 424 additions & 368 deletions po/eo.po

Large diffs are not rendered by default.

832 changes: 459 additions & 373 deletions po/es.po

Large diffs are not rendered by default.

781 changes: 420 additions & 361 deletions po/et.po

Large diffs are not rendered by default.

800 changes: 431 additions & 369 deletions po/eu.po

Large diffs are not rendered by default.

791 changes: 428 additions & 363 deletions po/fa.po

Large diffs are not rendered by default.

786 changes: 424 additions & 362 deletions po/fi.po

Large diffs are not rendered by default.

772 changes: 411 additions & 361 deletions po/fo.po

Large diffs are not rendered by default.

901 changes: 507 additions & 394 deletions po/fr.po

Large diffs are not rendered by default.

775 changes: 414 additions & 361 deletions po/fy.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/ga.po

Large diffs are not rendered by default.

800 changes: 431 additions & 369 deletions po/gl.po

Large diffs are not rendered by default.

840 changes: 466 additions & 374 deletions po/he.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/hi.po

Large diffs are not rendered by default.

895 changes: 502 additions & 393 deletions po/hr.po

Large diffs are not rendered by default.

795 changes: 427 additions & 368 deletions po/hu.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/hy.po

Large diffs are not rendered by default.

792 changes: 424 additions & 368 deletions po/ia.po

Large diffs are not rendered by default.

821 changes: 449 additions & 372 deletions po/id.po

Large diffs are not rendered by default.

781 changes: 420 additions & 361 deletions po/is.po

Large diffs are not rendered by default.

800 changes: 431 additions & 369 deletions po/it.po

Large diffs are not rendered by default.

809 changes: 440 additions & 369 deletions po/ja.po

Large diffs are not rendered by default.

781 changes: 420 additions & 361 deletions po/jv.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/ka.po

Large diffs are not rendered by default.

783 changes: 421 additions & 362 deletions po/kk.po

Large diffs are not rendered by default.

824 changes: 452 additions & 372 deletions po/ko.po

Large diffs are not rendered by default.

783 changes: 415 additions & 368 deletions po/ku.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/la.po

Large diffs are not rendered by default.

786 changes: 424 additions & 362 deletions po/lt.po

Large diffs are not rendered by default.

786 changes: 424 additions & 362 deletions po/lv.po

Large diffs are not rendered by default.

781 changes: 420 additions & 361 deletions po/mk.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/ml.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/mr.po

Large diffs are not rendered by default.

819 changes: 448 additions & 371 deletions po/ms.po

Large diffs are not rendered by default.

806 changes: 437 additions & 369 deletions po/nb.po

Large diffs are not rendered by default.

819 changes: 448 additions & 371 deletions po/nl.po

Large diffs are not rendered by default.

775 changes: 414 additions & 361 deletions po/nn.po

Large diffs are not rendered by default.

781 changes: 420 additions & 361 deletions po/oc.po

Large diffs are not rendered by default.

843 changes: 466 additions & 377 deletions po/pl.po

Large diffs are not rendered by default.

819 changes: 448 additions & 371 deletions po/pt.po

Large diffs are not rendered by default.

898 changes: 505 additions & 393 deletions po/pt_BR.po

Large diffs are not rendered by default.

786 changes: 424 additions & 362 deletions po/ro.po

Large diffs are not rendered by default.

830 changes: 455 additions & 375 deletions po/ru.po

Large diffs are not rendered by default.

775 changes: 411 additions & 364 deletions po/ru_RU.po

Large diffs are not rendered by default.

781 changes: 420 additions & 361 deletions po/si.po

Large diffs are not rendered by default.

810 changes: 439 additions & 371 deletions po/sk.po

Large diffs are not rendered by default.

785 changes: 422 additions & 363 deletions po/sl.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/sq.po

Large diffs are not rendered by default.

790 changes: 426 additions & 364 deletions po/sr.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/su.po

Large diffs are not rendered by default.

800 changes: 431 additions & 369 deletions po/sv.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/sw.po

Large diffs are not rendered by default.

800 changes: 431 additions & 369 deletions po/ta.po

Large diffs are not rendered by default.

772 changes: 411 additions & 361 deletions po/te.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/terminator.pot

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/th.po

Large diffs are not rendered by default.

800 changes: 431 additions & 369 deletions po/tr.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/tyv.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/ug.po

Large diffs are not rendered by default.

800 changes: 431 additions & 369 deletions po/uk.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/ur.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/vi.po

Large diffs are not rendered by default.

769 changes: 408 additions & 361 deletions po/wa.po

Large diffs are not rendered by default.

896 changes: 502 additions & 394 deletions po/zh_CN.po

Large diffs are not rendered by default.

781 changes: 420 additions & 361 deletions po/zh_HK.po

Large diffs are not rendered by default.

814 changes: 444 additions & 370 deletions po/zh_TW.po

Large diffs are not rendered by default.

676 changes: 337 additions & 339 deletions terminatorlib/config.py

Large diffs are not rendered by default.

38 changes: 20 additions & 18 deletions terminatorlib/keybindings.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,23 @@

"""Terminator by Chris Jones <[email protected]>
Validator and functions for dealing with Terminator's customisable
Validator and functions for dealing with Terminator's customisable
keyboard shortcuts.
"""

import re
from gi.repository import Gtk, Gdk
from gi.repository import Gdk
from .util import err


class KeymapError(Exception):
"""Custom exception for errors in keybinding configurations"""


MODIFIER = re.compile('<([^<]+)>')


class Keybindings:
"""Class to handle loading and lookup of Terminator keybindings"""

Expand All @@ -37,7 +41,7 @@ class Keybindings:
'control': Gdk.ModifierType.CONTROL_MASK,
'primary': Gdk.ModifierType.CONTROL_MASK,
'shift': Gdk.ModifierType.SHIFT_MASK,
'alt': Gdk.ModifierType.MOD1_MASK,
'alt': Gdk.ModifierType.MOD1_MASK, # Gdk.ModifierType.ALT_MASK ?
'super': Gdk.ModifierType.SUPER_MASK,
'hyper': Gdk.ModifierType.HYPER_MASK,
'mod2': Gdk.ModifierType.MOD2_MASK
Expand All @@ -62,19 +66,19 @@ def reload(self):
self._lookup = {}
self._masks = 0
for action, bindings in list(self.keys.items()):
if not isinstance(bindings, tuple):
bindings = (bindings,)
if not isinstance(bindings, list):
bindings = [bindings, '']

for binding in bindings:
if not binding or binding == "None":
continue

try:
keyval, mask = self._parsebinding(binding)
keyval, mask = self.parsebinding(binding)
# Does much the same, but with poorer error handling.
#keyval, mask = Gtk.accelerator_parse(binding)
except KeymapError as e:
err ("keybindings.reload failed to parse binding '%s': %s" % (binding, e))
# keyval, mask = Gtk.accelerator_parse(binding)
except KeymapError as exc:
err(f"keybindings.reload failed to parse binding '{binding}': {exc}")
else:
if mask & Gdk.ModifierType.SHIFT_MASK:
if keyval == Gdk.KEY_Tab:
Expand All @@ -91,7 +95,7 @@ def reload(self):
self._lookup[mask][keyval] = action
self._masks |= mask

def _parsebinding(self, binding):
def parsebinding(self, binding):
"""Parse an individual binding using gtk's binding function"""
mask = 0
modifiers = re.findall(MODIFIER, binding)
Expand All @@ -103,27 +107,25 @@ def _parsebinding(self, binding):
raise KeymapError('No key found')
keyval = Gdk.keyval_from_name(key)
if keyval == 0:
raise KeymapError("Key '%s' is unrecognised" % key)
raise KeymapError(f"Key '{key}' is unrecognised")
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)
except KeyError as exc:
raise KeymapError(f"Unhandled modifier '<{modifier}>'") from exc

def lookup(self, event):
"""Translate a keyboard event into a mapped key"""
try:
_found, keyval, _egp, _lvl, consumed = self.keymap.translate_keyboard_state(
event.hardware_keycode,
_, keyval, _, _, consumed = self.keymap.translate_keyboard_state(
event.hardware_keycode,
Gdk.ModifierType(event.get_state() & ~Gdk.ModifierType.LOCK_MASK),
event.group)
except TypeError:
err ("keybindings.lookup failed to translate keyboard event: %s" %
dir(event))
err(f"keybindings.lookup failed to translate keyboard event: {dir(event)}")
return None
mask = (event.get_state() & ~consumed) & self._masks
return self._lookup.get(mask, self.empty).get(keyval, None)

Loading

0 comments on commit 71dee3a

Please sign in to comment.