Remove python-atspi dependency

This commit is contained in:
Storm Dragon
2026-08-12 19:17:50 -04:00
parent 191317eb1f
commit ae255f27cb
4 changed files with 192 additions and 36 deletions
@@ -118,6 +118,9 @@ class InputEventManagerKeyWatcherTests(unittest.TestCase):
device = FakeDevice()
fakeAtspi = self._fake_atspi((2, 60, 5), device)
fakeAtspi.EventType = types.SimpleNamespace(KEY_PRESSED_EVENT=0, KEY_RELEASED_EVENT=1)
fakeAtspi.DeviceListener = types.SimpleNamespace(new=mock.Mock(return_value=object()))
fakeAtspi.register_keystroke_listener = mock.Mock(return_value=True)
fakeAtspi.deregister_keystroke_listener = mock.Mock(return_value=True)
fakeKeySet = [types.SimpleNamespace(keycode=38), types.SimpleNamespace(keycode=56)]
with (
@@ -128,8 +131,6 @@ class InputEventManagerKeyWatcherTests(unittest.TestCase):
"_get_x11_consumable_key_set",
return_value=fakeKeySet,
),
mock.patch.object(input_event_manager.pyatspi.Registry, "registerKeystrokeListener") as register,
mock.patch.object(input_event_manager.pyatspi.Registry, "deregisterKeystrokeListener") as deregister,
mock.patch.object(manager, "_initialize_xterm_handoff") as initializeXtermHandoff,
):
manager.start_key_watcher()
@@ -148,19 +149,18 @@ class InputEventManagerKeyWatcherTests(unittest.TestCase):
shiftLockMask | numLockMask,
shiftMask | shiftLockMask | numLockMask,
]
register.assert_called_once_with(
listener = fakeAtspi.DeviceListener.new.return_value
fakeAtspi.DeviceListener.new.assert_called_once_with(
manager._process_selective_legacy_keyboard_event,
key_set=fakeKeySet,
mask=expectedMasks,
kind=(0, 1),
synchronous=True,
preemptive=True,
None,
)
deregister.assert_called_once_with(
manager._process_selective_legacy_keyboard_event,
key_set=fakeKeySet,
mask=expectedMasks,
kind=(0, 1),
self.assertEqual(
fakeAtspi.register_keystroke_listener.call_args_list,
[mock.call(listener, fakeKeySet, mask, 3, 3) for mask in expectedMasks],
)
self.assertEqual(
fakeAtspi.deregister_keystroke_listener.call_args_list,
[mock.call(listener, fakeKeySet, mask, 3) for mask in expectedMasks],
)
initializeXtermHandoff.assert_called_once_with()
self.assertEqual(
@@ -171,6 +171,83 @@ class InputEventManagerKeyWatcherTests(unittest.TestCase):
],
)
def test_x11_consumable_listener_rolls_back_partial_registration(self) -> None:
manager = input_event_manager.InputEventManager()
device = FakeDevice()
fakeAtspi = self._fake_atspi((2, 60, 5), device)
fakeAtspi.EventType = types.SimpleNamespace(KEY_PRESSED_EVENT=0, KEY_RELEASED_EVENT=1)
fakeAtspi.DeviceListener = types.SimpleNamespace(new=mock.Mock(return_value=object()))
fakeAtspi.register_keystroke_listener = mock.Mock(
side_effect=[True, True, False],
)
fakeAtspi.deregister_keystroke_listener = mock.Mock(return_value=True)
fakeKeySet = [types.SimpleNamespace(keycode=56)]
with (
mock.patch.object(input_event_manager, "Atspi", fakeAtspi),
mock.patch.dict(input_event_manager.os.environ, {"XDG_SESSION_TYPE": "x11"}),
mock.patch.object(
input_event_manager,
"_get_x11_consumable_key_set",
return_value=fakeKeySet,
),
mock.patch.object(manager, "_initialize_xterm_handoff"),
):
manager.start_key_watcher()
expectedMasks = list(input_event_manager._X11_CONSUMABLE_MODIFIER_MASKS)
listener = fakeAtspi.DeviceListener.new.return_value
self.assertEqual(
fakeAtspi.register_keystroke_listener.call_args_list,
[
mock.call(listener, fakeKeySet, expectedMasks[0], 3, 3),
mock.call(listener, fakeKeySet, expectedMasks[1], 3, 3),
mock.call(listener, fakeKeySet, expectedMasks[2], 3, 3),
],
)
self.assertEqual(
fakeAtspi.deregister_keystroke_listener.call_args_list,
[
mock.call(listener, fakeKeySet, expectedMasks[0], 3),
mock.call(listener, fakeKeySet, expectedMasks[1], 3),
],
)
self.assertFalse(manager._selective_legacy_listener_active)
self.assertEqual(manager._selective_legacy_key_set, [])
self.assertEqual(manager._selective_legacy_keycodes, set())
def test_x11_consumable_listener_preserves_failed_deregistration_for_retry(self) -> None:
manager = input_event_manager.InputEventManager()
listener = object()
keySet = [types.SimpleNamespace(keycode=56)]
manager._selective_legacy_listener_active = True
manager._selective_legacy_listener = listener
manager._selective_legacy_registered_masks = [0]
manager._selective_legacy_key_set = keySet
manager._selective_legacy_keycodes = {56}
with mock.patch.object(
input_event_manager.Atspi,
"deregister_keystroke_listener",
side_effect=[False, True],
) as deregister:
manager._deregister_selective_legacy_key_listener()
self.assertTrue(manager._selective_legacy_listener_active)
self.assertIs(manager._selective_legacy_listener, listener)
self.assertEqual(manager._selective_legacy_registered_masks, [0])
self.assertEqual(manager._selective_legacy_key_set, keySet)
self.assertEqual(manager._selective_legacy_keycodes, {56})
manager._deregister_selective_legacy_key_listener()
self.assertEqual(deregister.call_count, 2)
self.assertFalse(manager._selective_legacy_listener_active)
self.assertIsNone(manager._selective_legacy_listener)
self.assertEqual(manager._selective_legacy_registered_masks, [])
self.assertEqual(manager._selective_legacy_key_set, [])
self.assertEqual(manager._selective_legacy_keycodes, set())
def test_x11_consumable_keycodes_include_structural_navigation_but_not_tab(self) -> None:
keycodes = {
keysym: index + 20