From d5d86960bfa9396370d94645937b43304bd245fb Mon Sep 17 00:00:00 2001 From: sezanzeb Date: Mon, 16 Nov 2020 16:18:37 +0100 Subject: [PATCH] supports modifier-key combinations --- bin/key-mapper-gtk | 4 ---- keymapper/X.py | 2 +- keymapper/mapping.py | 7 ++++++- tests/testcases/config.py | 16 +++++++++++----- tests/testcases/mapping.py | 10 +++++++++- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/bin/key-mapper-gtk b/bin/key-mapper-gtk index c2366e26..2857beec 100755 --- a/bin/key-mapper-gtk +++ b/bin/key-mapper-gtk @@ -51,10 +51,6 @@ if __name__ == '__main__': window = Window() if getpass.getuser() != 'root' and 'unittest' not in sys.modules.keys(): - # TODO add a polkit thing like - # https://gitlab.manjaro.org/applications/pamac/-/tree/master/data/polkit - # https://gitlab.manjaro.org/applications/pamac/-/blob/master/src/daemon.vala#L260 - # does this require a dependency? logger.error('Needs to run with sudo') ErrorDialog( 'Error', diff --git a/keymapper/X.py b/keymapper/X.py index ac2a75ce..cfd50f52 100644 --- a/keymapper/X.py +++ b/keymapper/X.py @@ -354,7 +354,7 @@ def create_default_symbols(): defaults = Mapping() for keycode, characters in mappings: # TODO support an array of values in mapping and test it - defaults.change(None, int(keycode), characters.split()[0]) + defaults.change(None, int(keycode), characters.split()) contents = generate_symbols(DEFAULT_SYMBOLS_NAME, None, defaults) diff --git a/keymapper/mapping.py b/keymapper/mapping.py index 4769125f..f5fc26d1 100644 --- a/keymapper/mapping.py +++ b/keymapper/mapping.py @@ -52,7 +52,9 @@ class Mapping: previous_keycode : int or None If None, will not remove any previous mapping. new_keycode : int - character : string + character : string or string[] + If an array of strings, will put something like { [ a, A ] }; + into the symbols file. """ try: new_keycode = int(new_keycode) @@ -67,6 +69,9 @@ class Mapping: logger.error('Cannot use %s as keycode', previous_keycode) return False + if isinstance(character, list): + character = ', '.join([str(c) for c in character]) + if new_keycode and character: self._mapping[new_keycode] = str(character) if new_keycode != previous_keycode: diff --git a/tests/testcases/config.py b/tests/testcases/config.py index 9a5d0f99..6e5e21a8 100644 --- a/tests/testcases/config.py +++ b/tests/testcases/config.py @@ -37,6 +37,7 @@ class TestConfig(unittest.TestCase): custom_mapping.change(None, 10, 'a') custom_mapping.change(None, 11, 'KP_1') custom_mapping.change(None, 12, 3) + custom_mapping.change(None, 13, ['a', 'A', 'NoSymbol', 3]) if os.path.exists(tmp): shutil.rmtree(tmp) @@ -74,11 +75,15 @@ class TestConfig(unittest.TestCase): with open(get_usr_path('default'), 'r') as f: content = f.read() self.assertNotIn('include', content) - # this is pretty much the same on every keyboard - self.assertIn('key <10> { [ 1', content) - self.assertIn('key <11> { [ 2', content) - self.assertIn('key <12> { [ 3', content) - self.assertIn('key <65> { [ space ] };', content) + # this is pretty much the same on every keyboard. + # The default config should also contain the modified keys, but + # since they are different in every country just check for the + # comma. + self.assertIn('key <10> { [ 1, ', content) + self.assertIn('key <11> { [ 2, ', content) + self.assertIn('key <12> { [ 3, ', content) + self.assertIn('key <13> { [ 4, ', content) + self.assertIn('key <65> { [ space, ', content) def test_get_preset_name(self): self.assertEqual(get_preset_name('a', 'b'), 'key-mapper/user/a/b') @@ -99,6 +104,7 @@ class TestConfig(unittest.TestCase): self.assertIn('key <10> { [ a ] };', content) self.assertIn('key <11> { [ KP_1 ] };', content) self.assertIn('key <12> { [ 3 ] };', content) + self.assertIn('key <13> { [ a, A, NoSymbol, 3 ] };', content) def test_identity_mapping(self): create_identity_mapping() diff --git a/tests/testcases/mapping.py b/tests/testcases/mapping.py index 8ec0678f..980693fe 100644 --- a/tests/testcases/mapping.py +++ b/tests/testcases/mapping.py @@ -64,10 +64,18 @@ class TestMapping(unittest.TestCase): self.assertEqual(self.mapping.get(4), 'f') self.assertEqual(len(self.mapping), 2) - # non-ints are ignored + # non-int keycodes are ignored self.mapping.change('a', 'b', 'c') self.assertEqual(len(self.mapping), 2) + def test_change_multiple(self): + self.mapping.change(None, 1, ['a', 'A']) + self.assertEqual(self.mapping.get(1), 'a, A') + + self.mapping.change(1, 2, ['b', 'B']) + self.assertEqual(self.mapping.get(2), 'b, B') + self.assertIsNone(self.mapping.get(1)) + def test_clear(self): # does nothing self.mapping.clear(40)