Remove python-atspi dependency
This commit is contained in:
@@ -46,7 +46,6 @@ import gi
|
||||
gi.require_version("Atspi", "2.0")
|
||||
from gi.repository import Atspi
|
||||
from gi.repository import GLib
|
||||
import pyatspi
|
||||
|
||||
from . import debug
|
||||
from . import focus_manager
|
||||
@@ -75,6 +74,14 @@ _X11_CONSUMABLE_MODIFIER_MASKS = (
|
||||
_X11_SHIFT_LOCK_MASK | _X11_NUM_LOCK_MASK,
|
||||
_X11_SHIFT_MASK | _X11_SHIFT_LOCK_MASK | _X11_NUM_LOCK_MASK,
|
||||
)
|
||||
_X11_CONSUMABLE_EVENT_TYPES = (
|
||||
(1 << int(Atspi.EventType.KEY_PRESSED_EVENT))
|
||||
| (1 << int(Atspi.EventType.KEY_RELEASED_EVENT))
|
||||
)
|
||||
_X11_CONSUMABLE_SYNC_TYPE = (
|
||||
Atspi.KeyListenerSyncType.SYNCHRONOUS
|
||||
| Atspi.KeyListenerSyncType.CANCONSUME
|
||||
)
|
||||
_X11_CONSUMABLE_KEYSYMS = (
|
||||
"a", "b", "c", "d", "e", "f", "g", "h", "i", "k", "l", "m",
|
||||
"o", "p", "q", "r", "s", "t", "u", "v", "x", "y",
|
||||
@@ -110,6 +117,8 @@ class InputEventManager:
|
||||
self._key_pressed_id: int = 0
|
||||
self._key_released_id: int = 0
|
||||
self._selective_legacy_listener_active: bool = False
|
||||
self._selective_legacy_listener: Optional[Atspi.DeviceListener] = None
|
||||
self._selective_legacy_registered_masks: List[int] = []
|
||||
self._selective_legacy_key_set: List[Atspi.KeyDefinition] = []
|
||||
self._selective_legacy_keycodes: set[int] = set()
|
||||
self._pointer_moved_id: int = 0
|
||||
@@ -179,15 +188,7 @@ class InputEventManager:
|
||||
}
|
||||
msg = "INPUT EVENT MANAGER: Adding selective consumable X11 key listener."
|
||||
debug.print_message(debug.LEVEL_INFO, msg, True)
|
||||
pyatspi.Registry.registerKeystrokeListener(
|
||||
self._process_selective_legacy_keyboard_event,
|
||||
key_set=self._selective_legacy_key_set,
|
||||
mask=list(_X11_CONSUMABLE_MODIFIER_MASKS),
|
||||
kind=(Atspi.EventType.KEY_PRESSED_EVENT, Atspi.EventType.KEY_RELEASED_EVENT),
|
||||
synchronous=True,
|
||||
preemptive=True,
|
||||
)
|
||||
self._selective_legacy_listener_active = True
|
||||
self._register_selective_legacy_key_listener()
|
||||
else:
|
||||
msg = "INPUT EVENT MANAGER: Using legacy AT-SPI key watcher."
|
||||
debug.print_message(debug.LEVEL_INFO, msg, True)
|
||||
@@ -201,16 +202,7 @@ class InputEventManager:
|
||||
|
||||
msg = "INPUT EVENT MANAGER: Stopping key watcher."
|
||||
debug.print_message(debug.LEVEL_INFO, msg, True)
|
||||
if self._selective_legacy_listener_active:
|
||||
pyatspi.Registry.deregisterKeystrokeListener(
|
||||
self._process_selective_legacy_keyboard_event,
|
||||
key_set=self._selective_legacy_key_set,
|
||||
mask=list(_X11_CONSUMABLE_MODIFIER_MASKS),
|
||||
kind=(Atspi.EventType.KEY_PRESSED_EVENT, Atspi.EventType.KEY_RELEASED_EVENT),
|
||||
)
|
||||
self._selective_legacy_listener_active = False
|
||||
self._selective_legacy_key_set = []
|
||||
self._selective_legacy_keycodes.clear()
|
||||
self._deregister_selective_legacy_key_listener()
|
||||
if self._device is not None:
|
||||
for handlerId in (self._key_pressed_id, self._key_released_id):
|
||||
if handlerId:
|
||||
@@ -1284,7 +1276,95 @@ class InputEventManager:
|
||||
|
||||
# pylint: disable=too-many-arguments
|
||||
# pylint: disable=too-many-positional-arguments
|
||||
def _process_selective_legacy_keyboard_event(self, event: Atspi.DeviceEvent) -> bool:
|
||||
def _register_selective_legacy_key_listener(self) -> bool:
|
||||
"""Registers the consumable X11 listener directly through libatspi."""
|
||||
|
||||
self._selective_legacy_listener = Atspi.DeviceListener.new(
|
||||
self._process_selective_legacy_keyboard_event,
|
||||
None,
|
||||
)
|
||||
if self._selective_legacy_listener is None:
|
||||
msg = "INPUT EVENT MANAGER: Could not create selective consumable X11 listener."
|
||||
debug.print_message(debug.LEVEL_WARNING, msg, True)
|
||||
self._deregister_selective_legacy_key_listener()
|
||||
return False
|
||||
|
||||
for modifierMask in _X11_CONSUMABLE_MODIFIER_MASKS:
|
||||
try:
|
||||
registered = Atspi.register_keystroke_listener(
|
||||
self._selective_legacy_listener,
|
||||
self._selective_legacy_key_set,
|
||||
modifierMask,
|
||||
_X11_CONSUMABLE_EVENT_TYPES,
|
||||
_X11_CONSUMABLE_SYNC_TYPE,
|
||||
)
|
||||
except GLib.GError as error:
|
||||
msg = (
|
||||
"INPUT EVENT MANAGER: Could not register selective consumable "
|
||||
f"X11 listener for modifier mask {modifierMask}: {error}"
|
||||
)
|
||||
debug.print_message(debug.LEVEL_WARNING, msg, True)
|
||||
registered = False
|
||||
|
||||
if not registered:
|
||||
msg = (
|
||||
"INPUT EVENT MANAGER: Selective consumable X11 listener registration "
|
||||
f"failed for modifier mask {modifierMask}."
|
||||
)
|
||||
debug.print_message(debug.LEVEL_WARNING, msg, True)
|
||||
self._deregister_selective_legacy_key_listener()
|
||||
return False
|
||||
|
||||
self._selective_legacy_registered_masks.append(modifierMask)
|
||||
|
||||
self._selective_legacy_listener_active = True
|
||||
return True
|
||||
|
||||
def _deregister_selective_legacy_key_listener(self) -> None:
|
||||
"""Deregisters all masks associated with the consumable X11 listener."""
|
||||
|
||||
listener = self._selective_legacy_listener
|
||||
failedMasks = []
|
||||
if listener is not None:
|
||||
for modifierMask in self._selective_legacy_registered_masks:
|
||||
try:
|
||||
deregistered = Atspi.deregister_keystroke_listener(
|
||||
listener,
|
||||
self._selective_legacy_key_set,
|
||||
modifierMask,
|
||||
_X11_CONSUMABLE_EVENT_TYPES,
|
||||
)
|
||||
except GLib.GError as error:
|
||||
msg = (
|
||||
"INPUT EVENT MANAGER: Could not deregister selective consumable "
|
||||
f"X11 listener for modifier mask {modifierMask}: {error}"
|
||||
)
|
||||
debug.print_message(debug.LEVEL_WARNING, msg, True)
|
||||
deregistered = False
|
||||
|
||||
if not deregistered:
|
||||
failedMasks.append(modifierMask)
|
||||
|
||||
self._selective_legacy_registered_masks = failedMasks
|
||||
if failedMasks:
|
||||
self._selective_legacy_listener_active = True
|
||||
msg = (
|
||||
"INPUT EVENT MANAGER: Preserving selective consumable X11 listener "
|
||||
f"for {len(failedMasks)} failed deregistration(s)."
|
||||
)
|
||||
debug.print_message(debug.LEVEL_WARNING, msg, True)
|
||||
return
|
||||
|
||||
self._selective_legacy_listener_active = False
|
||||
self._selective_legacy_listener = None
|
||||
self._selective_legacy_key_set = []
|
||||
self._selective_legacy_keycodes.clear()
|
||||
|
||||
def _process_selective_legacy_keyboard_event(
|
||||
self,
|
||||
event: Atspi.DeviceEvent,
|
||||
_userData: object = None,
|
||||
) -> bool:
|
||||
"""Returns an X11 consume decision for unmodified browse-navigation keys."""
|
||||
|
||||
pressed = event.type == Atspi.EventType.KEY_PRESSED_EVENT
|
||||
|
||||
Reference in New Issue
Block a user