From 0347b7feea35cc489883a00a5619cda551a43ca2 Mon Sep 17 00:00:00 2001 From: Storm Dragon <stormdragon2976@gmail.com> Date: Mon, 14 Apr 2025 04:54:48 -0400 Subject: [PATCH] Another attempt at fixing plugin keyboard shortcuts. --- src/cthulhu/cthulhu.py | 57 +++++++++++++++++++++++------------ src/cthulhu/cthulhuVersion.py | 2 +- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/cthulhu/cthulhu.py b/src/cthulhu/cthulhu.py index ed26293..ff3844e 100644 --- a/src/cthulhu/cthulhu.py +++ b/src/cthulhu/cthulhu.py @@ -47,11 +47,9 @@ class APIHelper: self.app = app self._gestureBindings = {} - def registerGestureByString(self, function, name, gestureString, - inputEventType='default', normalizer='cthulhu', - learnModeEnabled=True, contextName=None): + def registerGestureByString(self, function, name, gestureString, inputEventType='default', normalizer='cthulhu', learnModeEnabled=True, contextName=None): """Register a gesture by string. - + Arguments: - function: the function to call when the gesture is performed - name: a human-readable name for this gesture @@ -60,23 +58,23 @@ class APIHelper: - normalizer: the normalizer to use - learnModeEnabled: whether this should be available in learn mode - contextName: the context for this gesture (e.g., plugin name) - + Returns the binding ID or None if registration failed """ if not gestureString.startswith("kb:"): return None - + # Extract the key portion from the gesture string key = gestureString.split(":", 1)[1] - + # Handle Cthulhu modifier specially if "cthulhu+" in key.lower(): from . import keybindings key_parts = key.lower().split("+") - + # Determine appropriate modifier mask modifiers = keybindings.CTHULHU_MODIFIER_MASK - + # Extract the final key (without modifiers) final_key = key_parts[-1] @@ -87,18 +85,23 @@ class APIHelper: modifiers = keybindings.CTHULHU_CTRL_MODIFIER_MASK elif "alt" in key_parts: modifiers = keybindings.CTHULHU_ALT_MODIFIER_MASK - + # Create a keybinding handler class GestureHandler: def __init__(self, function, description): self.function = function self.description = description - + def __call__(self, script, inputEvent): - return self.function(script, inputEvent) - + try: + return function(script, inputEvent) + except Exception as e: + import logging + logging.getLogger(__name__).error(f"Error in keybinding handler: {e}") + return True + handler = GestureHandler(function, name) - + # Register the binding with the active script from . import cthulhu_state if cthulhu_state.activeScript: @@ -108,20 +111,29 @@ class APIHelper: keybindings.defaultModifierMask, modifiers, handler) - bindings.add(binding) + # Add the binding to the active script + bindings.add(binding) + # Store binding for later reference if contextName not in self._gestureBindings: self._gestureBindings[contextName] = [] self._gestureBindings[contextName].append(binding) - + + # Register key grab at the system level + grab_ids = self.app.addKeyGrab(binding) + + # For later removal + if grab_ids: + binding._grab_ids = grab_ids + return binding - + return None def unregisterShortcut(self, binding, contextName=None): """Unregister a previously registered shortcut. - + Arguments: - binding: the binding to unregister - contextName: the context for this gesture @@ -131,11 +143,18 @@ class APIHelper: if cthulhu_state.activeScript: bindings = cthulhu_state.activeScript.getKeyBindings() bindings.remove(binding) + + # Remove key grab at system level + if hasattr(binding, '_grab_ids'): + for grab_id in binding._grab_ids: + self.app.removeKeyGrab(grab_id) - # Remove from our tracking + # Remove from tracking if contextName in self._gestureBindings: if binding in self._gestureBindings[contextName]: self._gestureBindings[contextName].remove(binding) + + import gi import importlib import os diff --git a/src/cthulhu/cthulhuVersion.py b/src/cthulhu/cthulhuVersion.py index 83cd4eb..f0a14c3 100644 --- a/src/cthulhu/cthulhuVersion.py +++ b/src/cthulhu/cthulhuVersion.py @@ -23,5 +23,5 @@ # Fork of Orca Screen Reader (GNOME) # Original source: https://gitlab.gnome.org/GNOME/orca -version = "2025.04.11" +version = "2025.04.14" codeName = "testing"