diff --git a/keymapper/state.py b/keymapper/state.py index 2d1714d6..f2cf1bd6 100644 --- a/keymapper/state.py +++ b/keymapper/state.py @@ -41,8 +41,13 @@ def populate_system_mapping(): xmodmap = subprocess.check_output(['xmodmap', '-pke']).decode() + '\n' mappings = re.findall(r'(\d+) = (.+)\n', xmodmap) for keycode, names in mappings: - for name in names.split(): - mapping[name] = int(keycode) - XKB_KEYCODE_OFFSET + # there might be multiple, like: + # keycode 64 = Alt_L Meta_L Alt_L Meta_L + # keycode 204 = NoSymbol Alt_L NoSymbol Alt_L + # only the first column is relevant. The others can be achieved + # by using a modifier button and the mapped key + name = names.split()[0] + mapping[name] = int(keycode) - XKB_KEYCODE_OFFSET for name, ecode in evdev.ecodes.ecodes.items(): mapping[name] = ecode diff --git a/tests/testcases/test_mapping.py b/tests/testcases/test_mapping.py index 4245aebd..954db3ad 100644 --- a/tests/testcases/test_mapping.py +++ b/tests/testcases/test_mapping.py @@ -37,7 +37,12 @@ class TestMapping(unittest.TestCase): self.assertGreater(len(mapping), 100) self.assertEqual(mapping['1'], 2) self.assertEqual(mapping['KEY_1'], 2) - self.assertEqual(mapping['KEY_LEFTSHIFT'], mapping['Shift_L']) + + self.assertEqual(mapping['Alt_L'], 56) + self.assertEqual(mapping['KEY_LEFTALT'], 56) + + self.assertEqual(mapping['KEY_LEFTSHIFT'], 42) + self.assertEqual(mapping['Shift_L'], 42) def test_clone(self): mapping1 = Mapping()