diff --git a/src/cthulhu/dbus_service.py b/src/cthulhu/dbus_service.py new file mode 100644 index 0000000..dce3666 --- /dev/null +++ b/src/cthulhu/dbus_service.py @@ -0,0 +1,659 @@ +# Cthulhu +# +# Copyright 2025 Stormux +# Copyright 2025 Valve Corporation +# Author: Joanmarie Diggs +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., Franklin Street, Fifth Floor, +# Boston MA 02110-1301 USA. + +"""Provides a D-Bus interface for remotely controlling Cthulhu.""" + +__id__ = "$Id$" +__version__ = "$Revision$" +__date__ = "$Date$" +__copyright__ = "Copyright (c) 2025 Stormux " +__license__ = "LGPL" + +import enum +from typing import Callable + +try: + from dasbus.connection import SessionMessageBus + from dasbus.error import DBusError + from dasbus.loop import EventLoop + from dasbus.server.interface import dbus_interface + from dasbus.server.publishable import Publishable + _dasbus_available = True +except ImportError: + _dasbus_available = False + +from gi.repository import GLib + +from . import debug +from . import cthulhu_platform # pylint: disable=no-name-in-module +from . import script_manager +from . import cthulhu_state + +# Lazy import to avoid circular dependency +def _get_input_event(): + from . import input_event + return input_event + +class HandlerType(enum.Enum): + """Enumeration of handler types for D-Bus methods.""" + + COMMAND = enum.auto() + GETTER = enum.auto() + SETTER = enum.auto() + +def command(func): + """Decorator to mark a method as a D-Bus command using its docstring. + + Usage: + @command + def toggle_speech(self, script=None, event=None): + '''Toggles speech on and off.''' + # method implementation + """ + description = func.__doc__ or f"D-Bus command: {func.__name__}" + func.dbus_command_description = description + return func + +def getter(func): + """Decorator to mark a method as a D-Bus getter using its docstring. + + Usage: + @getter + def get_rate(self): + '''Returns the current speech rate.''' + # method implementation + """ + description = func.__doc__ or f"D-Bus getter: {func.__name__}" + func.dbus_getter_description = description + return func + +def setter(func): + """Decorator to mark a method as a D-Bus setter using its docstring. + + Usage: + @setter + def set_rate(self, value): + '''Sets the current speech rate.''' + # method implementation + """ + description = func.__doc__ or f"D-Bus setter: {func.__name__}" + func.dbus_setter_description = description + return func + +class _HandlerInfo: + """Stores processed information about a function exposed via D-Bus.""" + + def __init__( + self, + python_function_name: str, + description: str, + action: Callable[..., bool], + handler_type: 'HandlerType' = HandlerType.COMMAND + ): + self.python_function_name: str = python_function_name + self.description: str = description + self.action: Callable[..., bool] = action + self.handler_type: HandlerType = handler_type + + +if _dasbus_available: + @dbus_interface("org.stormux.Cthulhu.Module") + class CthulhuModuleDBusInterface(Publishable): + """A D-Bus interface representing a specific Cthulhu module (e.g., a manager).""" + + def __init__(self, + module_name: str, + handlers_info: list[_HandlerInfo]): + super().__init__() + self._module_name = module_name + self._commands: dict[str, _HandlerInfo] = {} + self._getters: dict[str, _HandlerInfo] = {} + self._setters: dict[str, _HandlerInfo] = {} + + for info in handlers_info: + handler_type = getattr(info, "handler_type", HandlerType.COMMAND) + normalized_name = self._normalize_handler_name(info.python_function_name) + if handler_type == HandlerType.GETTER: + self._getters[normalized_name] = info + elif handler_type == HandlerType.SETTER: + self._setters[normalized_name] = info + else: + self._commands[normalized_name] = info + + msg = ( + f"DBUS SERVICE: CthulhuModuleDBusInterface for {module_name} initialized " + f"with {len(self._commands)} commands, {len(self._getters)} getters, " + f"{len(self._setters)} setters." + ) + debug.printMessage(debug.LEVEL_INFO, msg, True) + + def ExecuteRuntimeGetter(self, getter_name: str) -> GLib.Variant: # pylint: disable=invalid-name + """Executes the named getter returning the value as a GLib.Variant for D-Bus marshalling.""" + + handler_info = self._getters.get(getter_name) + if not handler_info: + msg = f"DBUS SERVICE: Unknown getter '{getter_name}' for '{self._module_name}'." + debug.printMessage(debug.LEVEL_INFO, msg, True) + return GLib.Variant("v", GLib.Variant("s", "")) + + result = handler_info.action() + msg = f"DBUS SERVICE: Getter '{getter_name}' returned: {result}" + debug.printMessage(debug.LEVEL_INFO, msg, True) + return self._to_variant(result) + + def ExecuteRuntimeSetter(self, setter_name: str, value: GLib.Variant) -> bool: # pylint: disable=invalid-name + """Executes the named setter, returning True if succeeded.""" + + handler_info = self._setters.get(setter_name) + if handler_info is None: + msg = f"DBUS SERVICE: Unknown setter '{setter_name}' for '{self._module_name}'." + debug.printMessage(debug.LEVEL_INFO, msg, True) + return False + + unpacked = value.unpack() + result = handler_info.action(unpacked) + msg = f"DBUS SERVICE: Setter '{setter_name}' with value '{unpacked}' returned: {result}" + debug.printMessage(debug.LEVEL_INFO, msg, True) + return result + + def ListCommands(self) -> list[tuple[str, str]]: # pylint: disable=invalid-name + """Returns a list of (command_name, description) for this module (commands only).""" + + command_list = [] + for camel_case_name, info in self._commands.items(): + command_list.append((camel_case_name, info.description)) + return command_list + + def ListRuntimeGetters(self) -> list[tuple[str, str]]: # pylint: disable=invalid-name + """Returns a list of (getter_name, description) for this module.""" + + getter_list = [] + for camel_case_name, info in self._getters.items(): + getter_list.append((camel_case_name, info.description)) + return getter_list + + def ListRuntimeSetters(self) -> list[tuple[str, str]]: # pylint: disable=invalid-name + """Returns a list of (setter_name, description) for this module.""" + + setter_list = [] + for camel_case_name, info in self._setters.items(): + setter_list.append((camel_case_name, info.description)) + return setter_list + + def ExecuteCommand(self, command_name: str, notify_user: bool) -> bool: # pylint: disable=invalid-name + """Executes the named command and returns True if the command succeeded.""" + + if command_name not in self._commands: + msg = f"DBUS SERVICE: Unknown command '{command_name}' for '{self._module_name}'." + debug.printMessage(debug.LEVEL_WARNING, msg, True) + return False + + handler_info = self._commands[command_name] + result = handler_info.action(notify_user) + msg = ( + f"DBUS SERVICE: '{command_name}' in '{self._module_name}' executed. " + f"Result: {result}, notify_user: {notify_user}" + ) + debug.printMessage(debug.LEVEL_INFO, msg, True) + return result + + def for_publication(self): + """Returns the D-Bus interface XML for publication.""" + + return self.__dbus_xml__ # pylint: disable=no-member + + + @staticmethod + def _normalize_handler_name(function_name: str) -> str: + """Normalizes a Python function name for D-Bus exposure (getter/setter/command).""" + + if function_name.startswith("get_") or function_name.startswith("set_"): + function_name = function_name[4:] + return "".join(word.capitalize() for word in function_name.split("_")) + + @staticmethod + def _to_variant(result): + """Converts a Python value to a correctly-typed GLib.Variant for D-Bus marshalling.""" + if isinstance(result, bool): + return GLib.Variant("b", result) + elif isinstance(result, int): + return GLib.Variant("i", result) + elif isinstance(result, float): + return GLib.Variant("d", result) + elif isinstance(result, str): + return GLib.Variant("s", result) + elif isinstance(result, dict): + return GLib.Variant( + "a{sv}", {str(k): GLib.Variant("v", v) for k, v in result.items()}) + elif isinstance(result, list) or isinstance(result, tuple): + if all(isinstance(x, str) for x in result): + return GLib.Variant("as", list(result)) + elif all(isinstance(x, int) for x in result): + return GLib.Variant("ax", list(result)) + elif all(isinstance(x, bool) for x in result): + return GLib.Variant("ab", list(result)) + else: + return GLib.Variant("av", [GLib.Variant("v", x) for x in result]) + elif result is None: + return GLib.Variant("v", GLib.Variant("s", "")) + else: + return GLib.Variant("s", str(result)) + + + @dbus_interface("org.stormux.Cthulhu.Service") + class CthulhuDBusServiceInterface(Publishable): + """Internal D-Bus service object that handles D-Bus specifics.""" + + def __init__(self) -> None: + super().__init__() + self._registered_modules: set[str] = set() + msg = "DBUS SERVICE: CthulhuDBusServiceInterface initialized." + debug.printMessage(debug.LEVEL_INFO, msg, True) + + def for_publication(self): + """Returns the D-Bus interface XML for publication.""" + + return self.__dbus_xml__ # pylint: disable=no-member + + def add_module_interface( + self, + module_name: str, + handlers_info: list[_HandlerInfo], + bus: SessionMessageBus, + object_path_base: str + ) -> None: + """Creates and prepares a D-Bus interface for a Cthulhu module.""" + + object_path = f"{object_path_base}/{module_name}" + if module_name in self._registered_modules: + msg = f"DBUS SERVICE: Interface {module_name} already registered. Replacing." + debug.printMessage(debug.LEVEL_INFO, msg, True) + try: + bus.unpublish_object(object_path) + except DBusError as e: + msg = f"DBUS SERVICE: Error unpublishing old interface for {module_name}: {e}" + debug.printMessage(debug.LEVEL_INFO, msg, True) + self._registered_modules.discard(module_name) + try: + module_iface = CthulhuModuleDBusInterface(module_name, handlers_info) + bus.publish_object(object_path, module_iface) + self._registered_modules.add(module_name) + msg = f"DBUS SERVICE: Successfully published {module_name} at {object_path}." + debug.printMessage(debug.LEVEL_INFO, msg, True) + except DBusError as e: + msg = ( + f"DBUS SERVICE: Failed to create or publish D-Bus interface for " + f"module {module_name} at {object_path}: {e}" + ) + debug.printMessage(debug.LEVEL_SEVERE, msg, True) + + def remove_module_interface( + self, + module_name: str, + bus: SessionMessageBus, + object_path_base: str + ) -> bool: + """Removes and unpublishes a D-Bus interface for a Cthulhu module.""" + + if module_name not in self._registered_modules: + msg = f"DBUS SERVICE: Module {module_name} is not registered." + debug.printMessage(debug.LEVEL_WARNING, msg, True) + return False + + object_path = f"{object_path_base}/{module_name}" + try: + bus.unpublish_object(object_path) + self._registered_modules.discard(module_name) + msg = f"DBUS SERVICE: Successfully removed {module_name} from {object_path}." + debug.printMessage(debug.LEVEL_INFO, msg, True) + return True + except DBusError as e: + msg = f"DBUS SERVICE: Error removing interface for {module_name}: {e}" + debug.printMessage(debug.LEVEL_WARNING, msg, True) + return False + + def ListModules(self) -> list[str]: # pylint: disable=invalid-name + """Returns a list of registered module names.""" + + return list(self._registered_modules) + + def ListCommands(self) -> list[tuple[str, str]]: # pylint: disable=invalid-name + """Returns available commands on the main service interface.""" + + commands = [] + for attr_name in dir(self): + if not attr_name.startswith('_') and attr_name[0].isupper(): + attr = getattr(self, attr_name) + if callable(attr) and hasattr(attr, '__doc__'): + description = (attr.__doc__.strip() if attr.__doc__ + else f"Service command: {attr_name}") + commands.append((attr_name, description)) + + return sorted(commands) + + def PresentMessage(self, message: str) -> bool: # pylint: disable=invalid-name + """Presents message to the user.""" + + msg = f"DBUS SERVICE: PresentMessage called with: '{message}'" + debug.printMessage(debug.LEVEL_INFO, msg, True) + + manager = script_manager.getManager() + script = cthulhu_state.activeScript or script_manager.getManager().getDefaultScript() + if script is None: + msg = "DBUS SERVICE: No script available" + debug.printMessage(debug.LEVEL_WARNING, msg, True) + return False + + script.presentMessage(message) + return True + + def GetVersion(self) -> str: # pylint: disable=invalid-name + """Returns Cthulhu's version and revision if available.""" + + result = cthulhu_platform.version + if cthulhu_platform.revision: + result += f" (rev {cthulhu_platform.revision})" + + msg = f"DBUS SERVICE: GetVersion called, returning: {result}" + debug.printMessage(debug.LEVEL_INFO, msg, True) + return result + + def shutdown_service(self, bus: SessionMessageBus, object_path_base: str) -> None: + """Releases D-Bus resources held by this service and its modules.""" + + msg = "DBUS SERVICE: Releasing D-Bus resources for service." + debug.printMessage(debug.LEVEL_INFO, msg, True) + + for module_name in list(self._registered_modules): + module_object_path = f"{object_path_base}/{module_name}" + msg = ( + f"DBUS SERVICE: Shutting down and unpublishing module {module_name} " + f"from main service." + ) + debug.printMessage(debug.LEVEL_INFO, msg, True) + try: + bus.unpublish_object(module_object_path) + except DBusError as e: + msg = f"DBUS SERVICE: Error unpublishing interface for {module_name}: {e}" + debug.printMessage(debug.LEVEL_INFO, msg, True) + self._registered_modules.clear() + +else: + # Fallback classes when dasbus is not available + class CthulhuModuleDBusInterface: + """Fallback class when dasbus is not available.""" + def __init__(self, *args, **kwargs): + pass + + class CthulhuDBusServiceInterface: + """Fallback class when dasbus is not available.""" + def __init__(self, *args, **kwargs): + pass + +class CthulhuRemoteController: + """Manages Cthulhu's D-Bus service for remote control.""" + + SERVICE_NAME = "org.stormux.Cthulhu.Service" + OBJECT_PATH = "/org/stormux/Cthulhu/Service" + + def __init__(self) -> None: + self._dbus_service_interface: CthulhuDBusServiceInterface | None = None + self._is_running: bool = False + self._bus: SessionMessageBus | None = None + self._event_loop: EventLoop | None = None + self._pending_registrations: dict[str, object] = {} + self._dasbus_available = _dasbus_available + + def start(self) -> bool: + """Starts the D-Bus service.""" + + if not self._dasbus_available: + msg = "REMOTE CONTROLLER: dasbus library not available, D-Bus service disabled." + debug.printMessage(debug.LEVEL_WARNING, msg, True) + return False + + if self._is_running: + msg = "REMOTE CONTROLLER: Start called but service is already running." + debug.printMessage(debug.LEVEL_INFO, msg, True) + return True + + msg = "REMOTE CONTROLLER: Attempting to start D-Bus service." + debug.printMessage(debug.LEVEL_INFO, msg, True) + + try: + self._bus = SessionMessageBus() + msg = ( + f"REMOTE CONTROLLER: SessionMessageBus acquired: " + f"{self._bus.connection.get_unique_name()}" + ) + debug.printMessage(debug.LEVEL_INFO, msg, True) + except DBusError as e: + self._bus = None + msg = f"REMOTE CONTROLLER: Failed to acquire D-Bus session bus: {e}" + debug.printMessage(debug.LEVEL_SEVERE, msg, True) + return False + + self._dbus_service_interface = CthulhuDBusServiceInterface() + try: + self._bus.publish_object(self.OBJECT_PATH, self._dbus_service_interface) + self._bus.register_service(self.SERVICE_NAME) + except DBusError as e: + msg = f"REMOTE CONTROLLER: Failed to publish service or request name: {e}" + debug.printMessage(debug.LEVEL_SEVERE, msg, True) + if self._dbus_service_interface and self._bus: + try: + self._bus.unpublish_object(self.OBJECT_PATH) + except DBusError: + pass + self._dbus_service_interface = None + self._bus = None + return False + + self._is_running = True + msg = ( + f"REMOTE CONTROLLER: Service started name={self.SERVICE_NAME} " + f"path={self.OBJECT_PATH}." + ) + debug.printMessage(debug.LEVEL_INFO, msg, True) + self._process_pending_registrations() + return True + + def _process_pending_registrations(self) -> None: + """Processes any module registrations that were queued before the service was ready.""" + + if not self._pending_registrations: + return + + msg = ( + f"REMOTE CONTROLLER: Processing {len(self._pending_registrations)} " + f"pending module registrations." + ) + debug.printMessage(debug.LEVEL_INFO, msg, True) + for module_name, module_instance in self._pending_registrations.items(): + msg = f"REMOTE CONTROLLER: Processing pending registration for {module_name}." + debug.printMessage(debug.LEVEL_INFO, msg, True) + self._register_decorated_commands_internal(module_name, module_instance) + + self._pending_registrations.clear() + + def register_decorated_module(self, module_name: str, module_instance) -> None: + """Registers a module's decorated D-Bus commands.""" + + if not self._dasbus_available: + return + + if not self._is_running or not self._dbus_service_interface or not self._bus: + msg = ( + f"REMOTE CONTROLLER: Service not ready; queuing decorated registration " + f"for {module_name}." + ) + debug.printMessage(debug.LEVEL_INFO, msg, True) + self._pending_registrations[module_name] = module_instance + return + + self._register_decorated_commands_internal(module_name, module_instance) + + def _register_decorated_commands_internal(self, module_name: str, module_instance) -> None: + """Internal method that registers decorated commands from a module instance.""" + + if not self._is_running or not self._dbus_service_interface or not self._bus: + msg = ( + f"REMOTE CONTROLLER: Internal error - _register_decorated_commands_internal " + f"called for {module_name} but service is not ready." + ) + debug.printMessage(debug.LEVEL_SEVERE, msg, True) + return + + handlers_info = [] + for attr_name in dir(module_instance): + attr = getattr(module_instance, attr_name) + # Command + if callable(attr) and hasattr(attr, "dbus_command_description"): + description = attr.dbus_command_description + def _create_wrapper(method=attr): + def _wrapper(notify_user): + event = _get_input_event().RemoteControllerEvent() + script = cthulhu_state.activeScript + return method(script=script, event=event, notify_user=notify_user) + return _wrapper + handler_info = _HandlerInfo( + python_function_name=attr_name, + description=description, + action=_create_wrapper(), + handler_type=HandlerType.COMMAND + ) + handlers_info.append(handler_info) + msg = f"REMOTE CONTROLLER: Found decorated command '{attr_name}': {description}" + debug.printMessage(debug.LEVEL_INFO, msg, True) + # Getter + elif callable(attr) and hasattr(attr, "dbus_getter_description"): + description = attr.dbus_getter_description + def _create_getter_wrapper(method=attr): + def _wrapper(_notify_user=None): + return method() + return _wrapper + handler_info = _HandlerInfo( + python_function_name=attr_name, + description=description, + action=_create_getter_wrapper(), + handler_type=HandlerType.GETTER + ) + handlers_info.append(handler_info) + msg = f"REMOTE CONTROLLER: Found decorated getter '{attr_name}': {description}" + debug.printMessage(debug.LEVEL_INFO, msg, True) + # Setter + elif callable(attr) and hasattr(attr, "dbus_setter_description"): + description = attr.dbus_setter_description + def _create_setter_wrapper(method=attr): + def _wrapper(value): + return method(value) + return _wrapper + handler_info = _HandlerInfo( + python_function_name=attr_name, + description=description, + action=_create_setter_wrapper(), + handler_type=HandlerType.SETTER + ) + handlers_info.append(handler_info) + msg = f"REMOTE CONTROLLER: Found decorated setter '{attr_name}': {description}" + debug.printMessage(debug.LEVEL_INFO, msg, True) + + if not handlers_info: + return + + self._dbus_service_interface.add_module_interface( + module_name, handlers_info, self._bus, self.OBJECT_PATH) + msg = ( + f"REMOTE CONTROLLER: Successfully registered {len(handlers_info)} " + f"decorated commands/getters/setters for module {module_name}." + ) + debug.printMessage(debug.LEVEL_INFO, msg, True) + + def deregister_module_commands(self, module_name: str) -> bool: + """Deregisters D-Bus commands for a Cthulhu module.""" + + if not self._dasbus_available: + return False + + if module_name in self._pending_registrations: + msg = f"REMOTE CONTROLLER: Removing pending registration for {module_name}." + debug.printMessage(debug.LEVEL_INFO, msg, True) + del self._pending_registrations[module_name] + return True + + if not self._is_running or not self._dbus_service_interface or not self._bus: + msg = ( + f"REMOTE CONTROLLER: Cannot deregister commands for {module_name}; " + "service not running or bus not available." + ) + debug.printMessage(debug.LEVEL_WARNING, msg, True) + return False + + return self._dbus_service_interface.remove_module_interface( + module_name, self._bus, self.OBJECT_PATH) + + def shutdown(self) -> None: + """Shuts down the D-Bus service.""" + + if not self._dasbus_available: + return + + if not self._is_running: + msg = "REMOTE CONTROLLER: Shutdown called but service is not running." + debug.printMessage(debug.LEVEL_INFO, msg, True) + return + + msg = "REMOTE CONTROLLER: Attempting to shut down D-Bus service." + debug.printMessage(debug.LEVEL_INFO, msg, True) + if self._dbus_service_interface and self._bus: + self._dbus_service_interface.shutdown_service(self._bus, self.OBJECT_PATH) + try: + self._bus.unpublish_object(self.OBJECT_PATH) + except DBusError as e: + msg = f"REMOTE CONTROLLER: Error unpublishing main service object: {e}" + debug.printMessage(debug.LEVEL_INFO, msg, True) + self._dbus_service_interface = None + + if self._bus: + try: + self._bus.unregister_service(self.SERVICE_NAME) + except DBusError as e: + msg = f"REMOTE CONTROLLER: Error releasing bus name: {e}" + debug.printMessage(debug.LEVEL_INFO, msg, True) + self._bus.disconnect() + self._bus = None + + self._is_running = False + msg = "REMOTE CONTROLLER: D-Bus service shut down." + debug.printMessage(debug.LEVEL_INFO, msg, True) + self._pending_registrations.clear() + + def is_running(self) -> bool: + """Checks if the D-Bus service is currently running.""" + + return self._is_running + +_remote_controller: CthulhuRemoteController = CthulhuRemoteController() + +def get_remote_controller() -> CthulhuRemoteController: + """Returns the CthulhuRemoteController singleton.""" + + return _remote_controller \ No newline at end of file diff --git a/src/cthulhu/debug-2025-06-25-23:07:09.out b/src/cthulhu/debug-2025-06-25-23:07:09.out new file mode 100644 index 0000000..89af5e3 --- /dev/null +++ b/src/cthulhu/debug-2025-06-25-23:07:09.out @@ -0,0 +1,1736 @@ +INFO: Preparing to launch. - 23:07:09.925003 +SCRIPT MANAGER: Initializing - 23:07:09.935501 +SCRIPT MANAGER: Initialized - 23:07:09.935528 +SETTINGS MANAGER: Initializing - 23:07:09.944951 +SETTINGS MANAGER: Initialized - 23:07:09.946518 +BRAILLE: About to import brlapi. - 23:07:09.962514 +BRAILLE: brlapi imported - 23:07:09.965243 +BRAILLE: About to import louis. - 23:07:09.965256 +BRAILLE: liblouis imported - 23:07:09.967086 +BRAILLE: tables location: /usr/share/liblouis/tables - 23:07:09.967108 +BRAILLE: User locale is en_US - 23:07:09.981985 +BRAILLE: 5 candidate tables for locale found: en-us-comp8-ext.utb, en-us-comp6.ctb, en-us-g1.ctb, en-us-comp8.ctb, en-us-g2.ctb - 23:07:09.982267 +BRAILLE: Default contraction table is: /usr/share/liblouis/tables/en-us-g1.ctb - 23:07:09.982284 +EVENT MANAGER: Initializing - 23:07:09.989103 +EVENT MANAGER: Async Mode is True - 23:07:09.989114 +Event manager initialized - 23:07:09.989407 +INFO: About to activate settings manager. - 23:07:10.053130 +SETTINGS MANAGER: Activating - 23:07:10.053151 +SETTINGS MANAGER: Attempt to load cthulhu-customizations from /home/storm/.local/share/cthulhu/cthulhu-customizations.py succeeded. - 23:07:10.061833 +SETTINGS MANAGER: Activated - 23:07:10.062048 +SETTINGS MANAGER: Current profile is None - 23:07:10.062066 +SETTINGS MANAGER: Current profile is now default - 23:07:10.062078 +SETTINGS MANAGER: Setting profile to: default - 23:07:10.062086 +SETTINGS MANAGER: Loading settings for default profile - 23:07:10.062102 +SETTINGS MANAGER: Settings for default profile loaded - 23:07:10.062321 +SETTINGS MANAGER: Merging settings. - 23:07:10.062329 +SETTINGS MANAGER: Settings merged. - 23:07:10.062339 +SETTINGS MANAGER: Setting runtime settings. - 23:07:10.062343 +SETTINGS MANAGER: Runtime settings set. - 23:07:10.062360 +INFO: About to launch Cthulhu. - 23:07:10.081208 +CTHULHU: Launching version Cthulhu screen reader version 2025.06.05-plugins (rev 408fb85) session: tty - 23:07:10.081252 +CTHULHU: Enabling accessibility (if needed). - 23:07:10.081342 +SETTINGS MANAGER: Checking if accessibility is enabled. - 23:07:10.081353 +SETTINGS MANAGER: Accessibility enabled: True - 23:07:10.082305 +CTHULHU: Initializing. - 23:07:10.082317 +CTHULHU: Initializing - 23:07:10.082323 +CTHULHU: Activating settings manager - 23:07:10.082341 +SETTINGS MANAGER: Activating - 23:07:10.082347 +SETTINGS MANAGER: Activated - 23:07:10.082588 +SETTINGS MANAGER: Current profile is default - 23:07:10.082617 +SETTINGS MANAGER: Setting profile to: default - 23:07:10.082630 +SETTINGS MANAGER: Loading settings for default profile - 23:07:10.082655 +SETTINGS MANAGER: Settings for default profile loaded - 23:07:10.082917 +SETTINGS MANAGER: Merging settings. - 23:07:10.082926 +SETTINGS MANAGER: Settings merged. - 23:07:10.082939 +SETTINGS MANAGER: Setting runtime settings. - 23:07:10.082944 +SETTINGS MANAGER: Runtime settings set. - 23:07:10.082966 +CTHULHU: Loading User Settings - 23:07:10.082971 +SPEECH: Shutting down - 23:07:10.083053 +BRAILLE: Attempting braille shutdown. - 23:07:10.083061 +BRAILLE: Braille was not running. - 23:07:10.083065 +SCRIPT MANAGER: Deactivating - 23:07:10.083071 +SCRIPT MANAGER: Deactivated - 23:07:10.083078 +KEYBINDINGS: Could not find 257 handler for keybinding. - 23:07:10.102397 +DEFAULT: Getting braille bindings. - 23:07:10.102979 +DEFAULT: Finished getting braille bindings. - 23:07:10.103003 +SCRIPT: default (module=cthulhu.scripts.default) initialized - 23:07:10.108625 +CTHULHU: About to enable speech - 23:07:10.108641 +SPEECH: Initializing - 23:07:10.108647 +SPEECH: Using speech server factory: cthulhu.speechdispatcherfactory - 23:07:10.733654 +SPEECH: Initialized - 23:07:10.733677 +CTHULHU: Braille is not enabled in settings - 23:07:10.733686 +Created binding: w with modifiers 256 - 23:07:10.740743 +Created binding: y with modifiers 256 - 23:07:10.741053 +Created binding: c with modifiers 257 - 23:07:10.741719 +Created binding: v with modifiers 257 - 23:07:10.742202 +Created binding: c with modifiers 257 - 23:07:10.742337 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.742411 +Created binding: v with modifiers 257 - 23:07:10.742848 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.742920 +Created binding: c with modifiers 257 - 23:07:10.743048 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.743111 +SCRIPT MANAGER: Activating - 23:07:10.743191 +EVENT MANAGER: Registering listeners for: default (module=cthulhu.scripts.default) - 23:07:10.743232 +EVENT MANAGER: registering listener for: focus: - 23:07:10.743239 +EVENT MANAGER: registering listener for: document:reload - 23:07:10.743733 +EVENT MANAGER: registering listener for: document:load-complete - 23:07:10.743908 +EVENT MANAGER: registering listener for: document:load-stopped - 23:07:10.744064 +EVENT MANAGER: registering listener for: mouse:button - 23:07:10.744258 +EVENT MANAGER: registering listener for: object:announcement - 23:07:10.744439 +EVENT MANAGER: registering listener for: object:property-change:accessible-name - 23:07:10.744600 +EVENT MANAGER: registering listener for: object:property-change:accessible-description - 23:07:10.744794 +EVENT MANAGER: registering listener for: object:text-caret-moved - 23:07:10.745071 +EVENT MANAGER: registering listener for: object:text-changed:delete - 23:07:10.745359 +EVENT MANAGER: registering listener for: object:text-changed:insert - 23:07:10.745634 +EVENT MANAGER: registering listener for: object:active-descendant-changed - 23:07:10.745892 +EVENT MANAGER: registering listener for: object:children-changed:add - 23:07:10.746090 +EVENT MANAGER: registering listener for: object:children-changed:remove - 23:07:10.746350 +EVENT MANAGER: registering listener for: object:state-changed:active - 23:07:10.746575 +EVENT MANAGER: registering listener for: object:state-changed:busy - 23:07:10.746787 +EVENT MANAGER: registering listener for: object:state-changed:focused - 23:07:10.746964 +EVENT MANAGER: registering listener for: object:state-changed:showing - 23:07:10.747140 +EVENT MANAGER: registering listener for: object:state-changed:checked - 23:07:10.747329 +EVENT MANAGER: registering listener for: object:state-changed:pressed - 23:07:10.747504 +EVENT MANAGER: registering listener for: object:state-changed:indeterminate - 23:07:10.747683 +EVENT MANAGER: registering listener for: object:state-changed:expanded - 23:07:10.747862 +EVENT MANAGER: registering listener for: object:state-changed:selected - 23:07:10.748040 +EVENT MANAGER: registering listener for: object:state-changed:sensitive - 23:07:10.748225 +EVENT MANAGER: registering listener for: object:text-attributes-changed - 23:07:10.748401 +EVENT MANAGER: registering listener for: object:text-selection-changed - 23:07:10.748548 +EVENT MANAGER: registering listener for: object:selection-changed - 23:07:10.748696 +EVENT MANAGER: registering listener for: object:property-change:accessible-value - 23:07:10.748847 +EVENT MANAGER: registering listener for: object:value-changed - 23:07:10.749028 +EVENT MANAGER: registering listener for: object:column-reordered - 23:07:10.749181 +EVENT MANAGER: registering listener for: object:row-reordered - 23:07:10.749335 +EVENT MANAGER: registering listener for: window:activate - 23:07:10.749483 +EVENT MANAGER: registering listener for: window:deactivate - 23:07:10.749632 +EVENT MANAGER: registering listener for: window:create - 23:07:10.749780 +EVENT MANAGER: registering listener for: window:destroy - 23:07:10.749925 +DEFAULT: Activating script for None - 23:07:10.750445 +BRAILLE: Checking braille setting. - 23:07:10.750460 +BRAILLE: Disabling braille. BrlAPI running: False - 23:07:10.750475 +BRAILLE: Setting up key ranges. - 23:07:10.750481 +BRAILLE: Not setting up key ranges: BrlAPI not running. - 23:07:10.750486 +SPEECH: Checking speech setting. - 23:07:10.750490 +SPEECH: Initializing - 23:07:10.750495 +SPEECH: Already initialized - 23:07:10.750498 +EVENT MANAGER: Registering keystroke listener function: > - 23:07:10.750649 +DEFAULT: Script for None activated - 23:07:10.757055 +SCRIPT MANAGER: Setting active script to default (module=cthulhu.scripts.default) reason: activate - 23:07:10.757129 +SCRIPT MANAGER: Activated - 23:07:10.757140 +EVENT MANAGER: Activating - 23:07:10.757147 +EVENT MANAGER: Activated - 23:07:10.757152 +KEYBINDINGS: Could not find 257 handler for keybinding. - 23:07:10.757285 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.757993 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.758154 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.758352 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.758784 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.758899 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.759017 +KEYBINDINGS: Could not find 257 handler for keybinding. - 23:07:10.759399 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.759935 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.760072 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.760207 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.760511 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.760620 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.760735 +KEYBINDINGS: Could not find 257 handler for keybinding. - 23:07:10.760935 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.761257 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.761333 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.761421 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.761657 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.761753 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.761813 +KEYBINDINGS: Could not find 257 handler for keybinding. - 23:07:10.761942 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.762264 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.762340 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.762428 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.762669 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.762723 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.762781 +KEYBINDINGS: Could not find 257 handler for keybinding. - 23:07:10.762938 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.763363 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.763444 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.763538 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.763793 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.763849 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.763908 +KEYBINDINGS: Could not find 257 handler for keybinding. - 23:07:10.764039 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.764362 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.764499 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.764643 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.764901 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.764959 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.765020 +CTHULHU: User Settings Loaded - 23:07:10.765135 +CTHULHU: Initialized - 23:07:10.765164 +CTHULHU: Initialized. - 23:07:10.765169 +SPEECH: Speak 'Cthulhu welcomes you.' acss: {'established': False} - 23:07:10.765204 +SPEECH OUTPUT: 'Cthulhu welcomes you.' {'established': False, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:10.765236 +SPEECH DISPATCHER: Speaking ' Cthulhu welcomes you. ' as string - 23:07:10.765254 +SPEECH DISPATCHER: Speaking 'Cthulhu welcomes you.' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:10.765714 +SCRIPT UTILITIES: Looking at [frame: 'storm@fenrir:~/git/fenrir/src'] from [application: 'lxterminal'] lxterminal - 23:07:10.774828 +SCRIPT UTILITIES: [frame: 'storm@fenrir:~/git/fenrir/src'] can be active window - 23:07:10.775202 +SCRIPT UTILITIES: Looking at [frame: 'storm@fenrir:~'] from [application: 'lxterminal'] lxterminal - 23:07:10.777840 +SCRIPT UTILITIES: [frame: 'storm@fenrir:~'] lacks state active - 23:07:10.778077 +SCRIPT UTILITIES: [frame: 'storm@fenrir:~'] is not active and showing, or is iconified - 23:07:10.778237 +SCRIPT UTILITIES: Looking at [frame: 'storm@fenrir:~'] from [application: 'lxterminal'] lxterminal - 23:07:10.780570 +SCRIPT UTILITIES: [frame: 'storm@fenrir:~'] lacks state active - 23:07:10.780789 +SCRIPT UTILITIES: [frame: 'storm@fenrir:~'] is not active and showing, or is iconified - 23:07:10.780935 +SCRIPT UTILITIES: Active window is [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:10.781083 +CTHULHU: Request to set active window to [frame: 'storm@fenrir:~/git/fenrir/src'] in [application: 'lxterminal'] - 23:07:10.781695 +CTHULHU: Active script is: default (module=cthulhu.scripts.default) - 23:07:10.781795 +CTHULHU: Changing locusOfFocus from None to [frame: 'storm@fenrir:~/git/fenrir/src']. Notify: True - 23:07:10.782309 +SCRIPT UTILITIES: [frame: 'storm@fenrir:~/git/fenrir/src'] is top-level object for: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:10.782783 +SCRIPT UTILITIES: [frame: 'storm@fenrir:~/git/fenrir/src'] is top-level object: True - 23:07:10.782912 +SCRIPT UTILITIES: [frame: 'storm@fenrir:~/git/fenrir/src'] is top-level object for: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:10.783308 +SCRIPT UTILITIES: [frame: 'storm@fenrir:~/git/fenrir/src'] is top-level object: True - 23:07:10.783437 +SCRIPT UTILITIES: [frame: 'storm@fenrir:~/git/fenrir/src'] is top-level object for: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:10.783927 +BRAILLE: update disabled - 23:07:10.783939 +SPEECH GENERATOR: Starting unfocused generation for [frame: 'storm@fenrir:~/git/fenrir/src'] (using role: frame) - 23:07:10.784191 + GENERATION TIME: 0.0006 ----> oldAncestors=[] + GENERATION TIME: 0.0003 ----> newAncestors=[] +SPEECH GENERATOR: default voice requested with language='None', dialect='' - 23:07:10.785619 + GENERATION TIME: 0.0005 ----> labelOrName=[storm@fenrir:~/git/fenrir/src] +SPEECH GENERATOR: system voice requested with language='None', dialect='' - 23:07:10.788266 + GENERATION TIME: 0.0026 ----> roleName=[frame] +SCRIPT UTILITIES: [frame: 'storm@fenrir:~/git/fenrir/src'] is top-level object for: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:10.789710 + GENERATION TIME: 0.0017 ----> unfocusedDialogCount=[] + GENERATION TIME: 0.0003 ----> availability=[] + GENERATION TIME: 0.0007 ----> newNodeLevel=[] + GENERATION TIME: 0.0003 ----> unselectedCell=[] + GENERATION TIME: 0.0002 ----> clickable=[] + GENERATION TIME: 0.0002 ----> pause=[PAUSE] + GENERATION TIME: 0.0002 ----> hasLongDesc=[] + GENERATION TIME: 0.0002 ----> hasDetails=[] + GENERATION TIME: 0.0002 ----> detailsFor=[] + GENERATION TIME: 0.0003 ----> tutorial=[] + GENERATION TIME: 0.0004 ----> description=[] + GENERATION TIME: 0.0002 ----> hasPopup=[] + COMPLETION TIME: 0.0093 + SPEECH GENERATOR: Results: + 'storm@fenrir:~/git/fenrir/src' + '{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}' + 'frame' + '{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}' + 'PAUSE' + 'PAUSE' +SCRIPT UTILITIES: Not interrupting for locusOfFocus change: event is None - 23:07:10.793329 +SPEECH: Last spoke 0.0281 seconds ago - 23:07:10.793342 +SPEECH: Speak [storm@fenrir:~/git/fenrir/src, {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}, frame, {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}, PAUSE, PAUSE], acss: None - 23:07:10.793378 +SPEECH OUTPUT: 'storm@fenrir:~/git/fenrir/src frame.' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:10.793412 +SPEECH DISPATCHER: Speaking ' storm@fenrir:~/git/fenrir/src frame. ' as string - 23:07:10.793428 +SPEECH DISPATCHER: Speaking 'storm@fenrir:~/git/fenrir/src frame.' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:10.793662 +CTHULHU: Switching active mode from None to focus-tracking - 23:07:10.793871 +CTHULHU: Region of interest: [frame: 'storm@fenrir:~/git/fenrir/src'] ( 0) 0 - 23:07:10.794099 +CTHULHU: Switching object of interest from None to [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:10.794331 +SCRIPT MANAGER: Mapped [application: 'lxterminal'] to lxterminal - 23:07:10.795658 +SCRIPT MANAGER: Found cthulhu.scripts.toolkits.gtk - 23:07:10.796845 +KEYBINDINGS: Could not find 257 handler for keybinding. - 23:07:10.797146 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.797511 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.797602 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.797708 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.797949 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.798007 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.798066 +DEFAULT: Getting braille bindings. - 23:07:10.798188 +DEFAULT: Finished getting braille bindings. - 23:07:10.798211 +SCRIPT: lxterminal (module=cthulhu.scripts.toolkits.gtk.script) initialized - 23:07:10.803811 +SCRIPT MANAGER: Mapped [application: 'lxterminal'] to lxterminal - 23:07:10.804048 +SCRIPT MANAGER: Found cthulhu.scripts.toolkits.gtk - 23:07:10.804504 +KEYBINDINGS: Could not find 257 handler for keybinding. - 23:07:10.804781 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.805267 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.805364 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.805473 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.805765 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.805829 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.805896 +DEFAULT: Getting braille bindings. - 23:07:10.806020 +DEFAULT: Finished getting braille bindings. - 23:07:10.806029 +SCRIPT: lxterminal (module=cthulhu.scripts.toolkits.gtk.script) initialized - 23:07:10.810925 +DEFAULT: removing key grabs - 23:07:10.810957 +DEFAULT: Activating script for [application: 'lxterminal'] - 23:07:10.811055 +SETTINGS MANAGER: Loading settings for None profile - 23:07:10.811253 +SETTINGS MANAGER: Settings for default profile loaded - 23:07:10.811495 +SETTINGS MANAGER: Merging settings. - 23:07:10.811503 +SETTINGS MANAGER: Settings merged. - 23:07:10.811514 +SETTINGS MANAGER: Setting runtime settings. - 23:07:10.811518 +SETTINGS MANAGER: Runtime settings set. - 23:07:10.811544 +KEYBINDINGS: Could not find 257 handler for keybinding. - 23:07:10.811582 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.811875 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.811954 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.812043 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.812319 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.812392 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.812450 +BRAILLE: Checking braille setting. - 23:07:10.812633 +BRAILLE: Disabling braille. BrlAPI running: False - 23:07:10.812648 +BRAILLE: Setting up key ranges. - 23:07:10.812653 +BRAILLE: Not setting up key ranges: BrlAPI not running. - 23:07:10.812657 +SPEECH: Checking speech setting. - 23:07:10.812661 +SPEECH: Initializing - 23:07:10.812665 +SPEECH: Already initialized - 23:07:10.812667 +DEFAULT: Script for [application: 'lxterminal'] activated - 23:07:10.812922 +SCRIPT MANAGER: Setting active script to lxterminal (module=cthulhu.scripts.toolkits.gtk.script) reason: Launching. - 23:07:10.812963 +AXCollection: found [terminal | Terminal] in 0.0002s - 23:07:10.813769 +CTHULHU: Focused object is: [terminal: 'Terminal'] - 23:07:10.813867 +CTHULHU: Active script is: lxterminal (module=cthulhu.scripts.toolkits.gtk.script) - 23:07:10.813962 +CTHULHU: Changing locusOfFocus from [frame: 'storm@fenrir:~/git/fenrir/src'] to [terminal: 'Terminal']. Notify: True - 23:07:10.814230 +SCRIPT UTILITIES: [frame: 'storm@fenrir:~/git/fenrir/src'] is top-level object for: [terminal: 'Terminal'] - 23:07:10.815283 +SCRIPT UTILITIES: [terminal: 'Terminal'] is top-level object: False - 23:07:10.815375 +SCRIPT UTILITIES: [frame: 'storm@fenrir:~/git/fenrir/src'] is top-level object for: [terminal: 'Terminal'] - 23:07:10.816197 +SCRIPT UTILITIES: [terminal: 'Terminal'] is top-level object: False - 23:07:10.816291 +SCRIPT UTILITIES: [frame: 'storm@fenrir:~/git/fenrir/src'] is top-level object for: [terminal: 'Terminal'] - 23:07:10.816869 +BRAILLE: update disabled - 23:07:10.816881 +SPEECH GENERATOR: Starting unfocused generation for [terminal: 'Terminal'] (using role: terminal) - 23:07:10.817059 + GENERATION TIME: 0.0007 ----> oldAncestors=[] +SCRIPT UTILITIES: Looking for common ancestor of [frame: 'storm@fenrir:~/git/fenrir/src'] and [terminal: 'Terminal'] - 23:07:10.818333 +SCRIPT UTILITIES: Common ancestor of [frame: 'storm@fenrir:~/git/fenrir/src'] and [terminal: 'Terminal'] is [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:10.819074 +DEFAULT: Not in SayAll - 23:07:10.819092 +SCRIPT UTILITIES: [filler] is deemed to be layout only - 23:07:10.819488 +SCRIPT UTILITIES: [page tab] is deemed to be layout only - 23:07:10.820064 +SCRIPT UTILITIES: [page tab list] is deemed to be layout only - 23:07:10.820621 +SCRIPT UTILITIES: [filler] is deemed to be layout only - 23:07:10.820948 + GENERATION TIME: 0.0034 ----> newAncestors=[] +SPEECH GENERATOR: default voice requested with language='None', dialect='' - 23:07:10.822888 + GENERATION TIME: 0.0017 ----> textContent=[[storm@fenrir src] $ sudo ./fenrir\n] + GENERATION TIME: 0.0008 ----> newNodeLevel=[] + GENERATION TIME: 0.0002 ----> unselectedCell=[] + GENERATION TIME: 0.0002 ----> clickable=[] + GENERATION TIME: 0.0002 ----> pause=[PAUSE] + GENERATION TIME: 0.0002 ----> hasLongDesc=[] + GENERATION TIME: 0.0002 ----> hasDetails=[] + GENERATION TIME: 0.0002 ----> detailsFor=[] + GENERATION TIME: 0.0002 ----> tutorial=[] +SCRIPT UTILITIES: Similarity between 'Terminal', 'storm@fenrir:~/git/fenrir/src': 0.27 (threshold: 0.5) - 23:07:10.825302 +SPEECH GENERATOR: system voice requested with language='None', dialect='' - 23:07:10.825322 + GENERATION TIME: 0.0005 ----> description=[storm@fenrir:~/git/fenrir/src] + GENERATION TIME: 0.0002 ----> hasPopup=[] + COMPLETION TIME: 0.0086 + SPEECH GENERATOR: Results: + '[storm@fenrir src] $ sudo ./fenrir +' + '{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}' + 'PAUSE' + 'storm@fenrir:~/git/fenrir/src' + '{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}' + 'PAUSE' +SCRIPT UTILITIES: Not interrupting for locusOfFocus change: event is None - 23:07:10.825572 +SPEECH: Last spoke 0.0322 seconds ago - 23:07:10.825584 +SPEECH: Speak [[storm@fenrir src] $ sudo./fenrir + , {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}, PAUSE, storm@fenrir:~/git/fenrir/src, {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}, PAUSE], acss: None - 23:07:10.825621 +SPEECH OUTPUT: '[storm@fenrir src] $ sudo ./fenrir + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:10.825648 +SPEECH DISPATCHER: Speaking ' [storm@fenrir src] $ sudo./fenrir + ' as string - 23:07:10.825683 +SPEECH DISPATCHER: Speaking '[storm@fenrir src] $ sudo ./fenrir + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:10.825937 +SPEECH: New voice {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}} != active voice {'established': False} - 23:07:10.826191 +SPEECH OUTPUT: 'storm@fenrir:~/git/fenrir/src.' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:10.826213 +SPEECH DISPATCHER: Speaking ' storm@fenrir:~/git/fenrir/src. ' as string - 23:07:10.826227 +SPEECH DISPATCHER: Speaking 'storm@fenrir:~/git/fenrir/src.' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:10.826441 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:10.826712 +CTHULHU: Switching object of interest from [frame: 'storm@fenrir:~/git/fenrir/src'] to [terminal: 'Terminal'] - 23:07:10.826878 +SCRIPT UTILITIES: New selection for [terminal: 'Terminal'] is '' (0, 0) - 23:07:10.827334 +SCRIPT MANAGER: Found cthulhu.scripts.terminal - 23:07:10.828736 +KEYBINDINGS: Could not find 257 handler for keybinding. - 23:07:10.828941 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.829257 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.829349 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.829446 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.829689 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.829745 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.829803 +DEFAULT: Getting braille bindings. - 23:07:10.829901 +DEFAULT: Finished getting braille bindings. - 23:07:10.829910 +SCRIPT: lxterminal (module=cthulhu.scripts.terminal.script) initialized - 23:07:10.835082 +DEFAULT: removing key grabs - 23:07:10.835217 +DEFAULT: Activating script for [application: 'lxterminal'] - 23:07:10.835327 +SETTINGS MANAGER: Loading settings for None profile - 23:07:10.835511 +SETTINGS MANAGER: Settings for default profile loaded - 23:07:10.835725 +SETTINGS MANAGER: Merging settings. - 23:07:10.835734 +SETTINGS MANAGER: Settings merged. - 23:07:10.835743 +SETTINGS MANAGER: Setting runtime settings. - 23:07:10.835747 +SETTINGS MANAGER: Runtime settings set. - 23:07:10.835766 +KEYBINDINGS: Could not find 257 handler for keybinding. - 23:07:10.835798 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.836117 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.836209 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.836311 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.836568 +KEYBINDINGS: 'Insert+Shift+c' (clipboard) already in keybindings - 23:07:10.836625 +KEYBINDINGS: 'Insert+Shift+v' (Cthulhu screen reader version 2025.06.05-plugins) already in keybindings - 23:07:10.836682 +BRAILLE: Checking braille setting. - 23:07:10.836877 +BRAILLE: Disabling braille. BrlAPI running: False - 23:07:10.836892 +BRAILLE: Setting up key ranges. - 23:07:10.836896 +BRAILLE: Not setting up key ranges: BrlAPI not running. - 23:07:10.836900 +SPEECH: Checking speech setting. - 23:07:10.836903 +SPEECH: Initializing - 23:07:10.836907 +SPEECH: Already initialized - 23:07:10.836909 +DEFAULT: Script for [application: 'lxterminal'] activated - 23:07:10.837131 +SCRIPT MANAGER: Setting active script to lxterminal (module=cthulhu.scripts.terminal.script) reason: Found focused object. - 23:07:10.837159 +CTHULHU: Starting ATSPI registry. - 23:07:10.837165 +CTHULHU: Starting - 23:07:10.837170 +CTHULHU: Startup complete notification made - 23:07:10.837379 +CTHULHU: Starting Atspi main event loop - 23:07:10.837387 +CTHULHU: Starting D-Bus remote controller - 23:07:10.837546 +CTHULHU: Failed to start D-Bus service: module 'cthulhu.debug' has no attribute 'print_message' - 23:07:10.837566 + +EVENT MANAGER: object:children-changed:add from None - 23:07:10.837717 +EVENT MANAGER: Ignoring because event is not from active app - 23:07:10.837741 +CTHULHU: Keyboard change detected, re-creating the xmodmap - 23:07:14.668020 +CTHULHU: Keyboard change detected, re-creating the xmodmap - 23:07:14.668161 +CTHULHU: Keyboard change detected, re-creating the xmodmap - 23:07:14.668308 +CTHULHU: Keyboard change detected, re-creating the xmodmap - 23:07:14.668649 +CTHULHU: Keyboard change detected, re-creating the xmodmap - 23:07:14.668731 +CTHULHU: Keyboard change detected, re-creating the xmodmap - 23:07:14.668868 +CTHULHU: Keyboard change detected, re-creating the xmodmap - 23:07:14.668934 +CTHULHU: Keyboard change detected, re-creating the xmodmap - 23:07:14.669065 +CTHULHU: Keyboard change detected, re-creating the xmodmap - 23:07:14.669129 +CTHULHU: Keyboard change detected, re-creating the xmodmap - 23:07:14.669277 +CTHULHU: Keyboard change detected, re-creating the xmodmap - 23:07:14.669339 + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65434 + hw_code=81 + modifiers=0 + event_string=(KP_Page_Up) + keyval_name=(KP_Page_Up) + timestamp=203088982 + time=1750907234.948488 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:14.948618 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:14.948709 +LOCATION: [terminal: 'Terminal'] - 23:07:14.948791 +CONSUME: True Script indication - 23:07:14.948808 +DEFAULT: Interrupting presentation - 23:07:14.948816 +TOTAL PROCESSING TIME: 0.0005 - 23:07:14.948979 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) vvvvv +INFO: Handler is Move flat review to the beginning of the next line - 23:07:14.950040 +FLAT REVIEW PRESENTER: Creating new context. Restrict: False - 23:07:14.950051 +CTHULHU: Active mode: focus-tracking Object of interest: [terminal: 'Terminal'] - 23:07:14.950144 +SCRIPT UTILITIES: [frame: 'storm@fenrir:~/git/fenrir/src'] is top-level object for: [terminal: 'Terminal'] - 23:07:14.950654 +SCRIPT UTILITIES: [terminal: 'Terminal'] is in frame [frame: 'storm@fenrir:~/git/fenrir/src'] and dialog None - 23:07:14.951161 +FLAT REVIEW: Frame: [frame: 'storm@fenrir:~/git/fenrir/src'] Dialog: None. Top level: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:14.951306 +SCRIPT UTILITIES: Extents for [frame: 'storm@fenrir:~/git/fenrir/src'] are: [0, 50, 1920, 1030] - 23:07:14.952311 +SCRIPT UTILITIES: Extents for [filler] are: [2, 50, 1916, 1028] - 23:07:14.953031 +SCRIPT UTILITIES: Extents for [menu bar] are: [2, 50, 1916, 27] - 23:07:14.953708 +AXSelection: [menu bar] reports 0 selected children - 23:07:14.954098 +SCRIPT UTILITIES: Selected children not retrieved via selection interface. - 23:07:14.954111 +SCRIPT UTILITIES: Extents for [menu: 'File'] are: [2, 50, 42, 27] - 23:07:14.954611 +AXSelection: [menu bar] reports 0 selected children - 23:07:14.955082 +SCRIPT UTILITIES: Selected children not retrieved via selection interface. - 23:07:14.955095 +SCRIPT UTILITIES: Extents for [menu: 'Edit'] are: [44, 50, 43, 27] - 23:07:14.955454 +AXSelection: [menu bar] reports 0 selected children - 23:07:14.955895 +SCRIPT UTILITIES: Selected children not retrieved via selection interface. - 23:07:14.955908 +SCRIPT UTILITIES: Extents for [menu: 'Tabs'] are: [87, 50, 49, 27] - 23:07:14.956201 +AXSelection: [menu bar] reports 0 selected children - 23:07:14.956651 +SCRIPT UTILITIES: Selected children not retrieved via selection interface. - 23:07:14.956663 +SCRIPT UTILITIES: Extents for [menu: 'Help'] are: [136, 50, 49, 27] - 23:07:14.956905 +AXSelection: [menu bar] reports 0 selected children - 23:07:14.957347 +SCRIPT UTILITIES: Selected children not retrieved via selection interface. - 23:07:14.957359 +SCRIPT UTILITIES: Extents for [page tab list] are: [2, 78, 1916, 1000] - 23:07:14.957647 +SCRIPT UTILITIES: Extents for [page tab] are: [-1, -1, -1, -1] - 23:07:14.958334 +SCRIPT UTILITIES: Extents for [filler] are: [2, 78, 1916, 1000] - 23:07:14.958905 +SCRIPT UTILITIES: Extents for [terminal: 'Terminal'] are: [2, 78, 1902, 1000] - 23:07:14.959382 +SCRIPT UTILITIES: Extents for [scroll bar] are: [1904, 78, 14, 1000] - 23:07:14.960147 +FLAT REVIEW: 6 on-screen objects found for [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:14.960594 +SPEECH GENERATOR: default voice requested with language='None', dialect='' - 23:07:14.960797 +SPEECH GENERATOR: default voice requested with language='None', dialect='' - 23:07:14.961322 +SPEECH GENERATOR: default voice requested with language='None', dialect='' - 23:07:14.961813 +SPEECH GENERATOR: default voice requested with language='None', dialect='' - 23:07:14.962309 +FLAT REVIEW: Getting lines for [terminal | Terminal] offsets 0-3324 - 23:07:14.965142 +FLAT REVIEW: 58 lines found for [terminal: 'Terminal'] - 23:07:14.972553 +FLAT REVIEW: 63 zones found for [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:15.046845 +FLAT REVIEW: Zones clustered into 60 lines - 23:07:15.047697 +FLAT REVIEW: Searching for word at offset 3310 - 23:07:15.047841 +FLAT REVIEW: Checking WORD: '[storm@fenrir ' (3289-3303) [terminal | Terminal] - 23:07:15.049022 +FLAT REVIEW: Checking WORD: 'src] ' (3303-3308) [terminal | Terminal] - 23:07:15.049115 +FLAT REVIEW: Checking WORD: '$ ' (3308-3310) [terminal | Terminal] - 23:07:15.049204 +FLAT REVIEW: Checking WORD: 'sudo ' (3310-3315) [terminal | Terminal] - 23:07:15.049285 +FLAT REVIEW: On line 59, zone 0 word 3, char 0 - 23:07:15.049299 +CTHULHU: Switching active mode from focus-tracking to flat-review - 23:07:15.049357 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:15.049440 +TOTAL PROCESSING TIME: 0.0994 - 23:07:15.049486 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65434 + hw_code=81 + modifiers=0 + event_string=(KP_Page_Up) + keyval_name=(KP_Page_Up) + timestamp=203089191 + time=1750907235.156218 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Page_Up' (81) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:15.156315 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:15.156404 +LOCATION: [terminal: 'Terminal'] - 23:07:15.156484 +CONSUME: True Is release for last non-modifier keyevent - 23:07:15.156506 +TOTAL PROCESSING TIME: 0.0003 - 23:07:15.156528 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Page_Up' (81) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203089356 + time=1750907235.321236 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:15.321345 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:15.321439 +LOCATION: [terminal: 'Terminal'] - 23:07:15.321514 +CONSUME: True Script indication - 23:07:15.321530 +DEFAULT: Interrupting presentation - 23:07:15.321539 +TOTAL PROCESSING TIME: 0.0004 - 23:07:15.321673 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +INFO: Handler is Move flat review to the beginning of the previous line - 23:07:15.322738 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:15.322750 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:15.322841 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:15.322858 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:15.322935 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:15.324742 +SPEECH: Last spoke 4.4993 seconds ago - 23:07:15.324872 +SPEECH: Speak '[storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:15.324884 +SPEECH OUTPUT: '[storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:15.324909 +SPEECH DISPATCHER: Speaking ' [storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' as string - 23:07:15.324926 +SPEECH DISPATCHER: Speaking '[storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:15.325248 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:15.325591 +BRAILLE: update review disabled - 23:07:15.325628 +TOTAL PROCESSING TIME: 0.0029 - 23:07:15.325643 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203089506 + time=1750907235.471477 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:15.471598 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:15.471701 +LOCATION: [terminal: 'Terminal'] - 23:07:15.471787 +CONSUME: True Is release for last non-modifier keyevent - 23:07:15.471809 +TOTAL PROCESSING TIME: 0.0003 - 23:07:15.471831 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203089814 + time=1750907235.779310 + keyType=unknown + clickCount=2 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:15.779416 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:15.779501 +LOCATION: [terminal: 'Terminal'] - 23:07:15.779574 +CONSUME: True Script indication - 23:07:15.779590 +DEFAULT: Interrupting presentation - 23:07:15.779599 +TOTAL PROCESSING TIME: 0.0004 - 23:07:15.779719 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +INFO: Handler is Move flat review to the beginning of the previous line - 23:07:15.780797 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:15.780810 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:15.780916 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:15.780936 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:15.781015 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:15.781355 +SPEECH: Last spoke 0.4565 seconds ago - 23:07:15.781398 +SPEECH: Speak '137 + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:15.781409 +SPEECH OUTPUT: '137 + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:15.781433 +SPEECH DISPATCHER: Speaking ' 137 + ' as string - 23:07:15.781449 +SPEECH DISPATCHER: Speaking '137 + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:15.781650 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:15.781883 +BRAILLE: update review disabled - 23:07:15.781920 +TOTAL PROCESSING TIME: 0.0011 - 23:07:15.781930 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203089956 + time=1750907235.921121 + keyType=unknown + clickCount=2 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:15.921238 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:15.921331 +LOCATION: [terminal: 'Terminal'] - 23:07:15.921414 +CONSUME: True Is release for last non-modifier keyevent - 23:07:15.921434 +TOTAL PROCESSING TIME: 0.0003 - 23:07:15.921453 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65434 + hw_code=81 + modifiers=0 + event_string=(KP_Page_Up) + keyval_name=(KP_Page_Up) + timestamp=203090144 + time=1750907236.109303 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:16.109416 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:16.109511 +LOCATION: [terminal: 'Terminal'] - 23:07:16.109592 +CONSUME: True Script indication - 23:07:16.109611 +DEFAULT: Interrupting presentation - 23:07:16.109620 +TOTAL PROCESSING TIME: 0.0004 - 23:07:16.109728 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) vvvvv +INFO: Handler is Move flat review to the beginning of the next line - 23:07:16.110806 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:16.110820 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:16.110918 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:16.110937 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:16.111015 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:16.112826 +SPEECH: Last spoke 0.3315 seconds ago - 23:07:16.112947 +SPEECH: Speak '[storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:16.112958 +SPEECH OUTPUT: '[storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:16.112980 +SPEECH DISPATCHER: Speaking ' [storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' as string - 23:07:16.112998 +SPEECH DISPATCHER: Speaking '[storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:16.113267 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:16.113586 +BRAILLE: update review disabled - 23:07:16.113620 +TOTAL PROCESSING TIME: 0.0028 - 23:07:16.113630 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65434 + hw_code=81 + modifiers=0 + event_string=(KP_Page_Up) + keyval_name=(KP_Page_Up) + timestamp=203090331 + time=1750907236.296409 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Page_Up' (81) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:16.296527 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:16.296627 +LOCATION: [terminal: 'Terminal'] - 23:07:16.296712 +CONSUME: True Is release for last non-modifier keyevent - 23:07:16.296734 +TOTAL PROCESSING TIME: 0.0003 - 23:07:16.296752 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Page_Up' (81) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65434 + hw_code=81 + modifiers=0 + event_string=(KP_Page_Up) + keyval_name=(KP_Page_Up) + timestamp=203090391 + time=1750907236.356025 + keyType=unknown + clickCount=2 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:16.356124 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:16.356229 +LOCATION: [terminal: 'Terminal'] - 23:07:16.356316 +CONSUME: True Script indication - 23:07:16.356335 +DEFAULT: Interrupting presentation - 23:07:16.356344 +TOTAL PROCESSING TIME: 0.0004 - 23:07:16.356463 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) vvvvv +INFO: Handler is Move flat review to the beginning of the next line - 23:07:16.357525 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:16.357534 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:16.357619 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:16.357634 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:16.357709 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:16.358801 +SPEECH: Last spoke 0.2459 seconds ago - 23:07:16.358877 +SPEECH: Speak '[storm@fenrir src] $ sudo ./fenrir + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:16.358889 +SPEECH OUTPUT: '[storm@fenrir src] $ sudo ./fenrir + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:16.358911 +SPEECH DISPATCHER: Speaking ' [storm@fenrir src] $ sudo./fenrir + ' as string - 23:07:16.358927 +SPEECH DISPATCHER: Speaking '[storm@fenrir src] $ sudo ./fenrir + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:16.359148 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:16.359453 +BRAILLE: update review disabled - 23:07:16.359515 +TOTAL PROCESSING TIME: 0.0020 - 23:07:16.359526 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65434 + hw_code=81 + modifiers=0 + event_string=(KP_Page_Up) + keyval_name=(KP_Page_Up) + timestamp=203090526 + time=1750907236.491058 + keyType=unknown + clickCount=2 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Page_Up' (81) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:16.491167 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:16.491273 +LOCATION: [terminal: 'Terminal'] - 23:07:16.491360 +CONSUME: True Is release for last non-modifier keyevent - 23:07:16.491381 +TOTAL PROCESSING TIME: 0.0003 - 23:07:16.491400 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Page_Up' (81) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65434 + hw_code=81 + modifiers=0 + event_string=(KP_Page_Up) + keyval_name=(KP_Page_Up) + timestamp=203090601 + time=1750907236.566086 + keyType=unknown + clickCount=3 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:16.566210 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:16.566327 +LOCATION: [terminal: 'Terminal'] - 23:07:16.566405 +CONSUME: True Script indication - 23:07:16.566422 +DEFAULT: Interrupting presentation - 23:07:16.566434 +TOTAL PROCESSING TIME: 0.0004 - 23:07:16.566533 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) vvvvv +INFO: Handler is Move flat review to the beginning of the next line - 23:07:16.567598 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:16.567610 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:16.567726 +TOTAL PROCESSING TIME: 0.0001 - 23:07:16.567739 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65434 + hw_code=81 + modifiers=0 + event_string=(KP_Page_Up) + keyval_name=(KP_Page_Up) + timestamp=203090721 + time=1750907236.686099 + keyType=unknown + clickCount=3 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Page_Up' (81) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:16.686199 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:16.686279 +LOCATION: [terminal: 'Terminal'] - 23:07:16.686363 +CONSUME: True Is release for last non-modifier keyevent - 23:07:16.686387 +TOTAL PROCESSING TIME: 0.0003 - 23:07:16.686404 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Page_Up' (81) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65434 + hw_code=81 + modifiers=0 + event_string=(KP_Page_Up) + keyval_name=(KP_Page_Up) + timestamp=203090811 + time=1750907236.776032 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:16.776164 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:16.776308 +LOCATION: [terminal: 'Terminal'] - 23:07:16.776391 +CONSUME: True Script indication - 23:07:16.776407 +DEFAULT: Interrupting presentation - 23:07:16.776421 +TOTAL PROCESSING TIME: 0.0005 - 23:07:16.776507 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) vvvvv +INFO: Handler is Move flat review to the beginning of the next line - 23:07:16.777569 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:16.777578 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:16.777692 +TOTAL PROCESSING TIME: 0.0001 - 23:07:16.777704 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65434 + hw_code=81 + modifiers=0 + event_string=(KP_Page_Up) + keyval_name=(KP_Page_Up) + timestamp=203090939 + time=1750907236.903973 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Page_Up' (81) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:16.904099 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:16.904248 +LOCATION: [terminal: 'Terminal'] - 23:07:16.904332 +CONSUME: True Is release for last non-modifier keyevent - 23:07:16.904349 +TOTAL PROCESSING TIME: 0.0004 - 23:07:16.904363 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Page_Up' (81) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203092026 + time=1750907237.991251 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:17.991356 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:17.991443 +LOCATION: [terminal: 'Terminal'] - 23:07:17.991519 +CONSUME: True Script indication - 23:07:17.991536 +DEFAULT: Interrupting presentation - 23:07:17.991544 +TOTAL PROCESSING TIME: 0.0004 - 23:07:17.991652 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +INFO: Handler is Move flat review to the beginning of the previous line - 23:07:17.992715 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:17.992725 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:17.992855 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:17.992867 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:17.992953 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:17.994744 +SPEECH: Last spoke 1.6360 seconds ago - 23:07:17.994872 +SPEECH: Speak '[storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:17.994884 +SPEECH OUTPUT: '[storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:17.994909 +SPEECH DISPATCHER: Speaking ' [storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' as string - 23:07:17.994928 +SPEECH DISPATCHER: Speaking '[storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:17.995152 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:17.995466 +BRAILLE: update review disabled - 23:07:17.995503 +TOTAL PROCESSING TIME: 0.0028 - 23:07:17.995517 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203092187 + time=1750907238.152456 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:18.152637 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:18.152772 +LOCATION: [terminal: 'Terminal'] - 23:07:18.152893 +CONSUME: True Is release for last non-modifier keyevent - 23:07:18.152914 +TOTAL PROCESSING TIME: 0.0004 - 23:07:18.152940 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203092566 + time=1750907238.531246 + keyType=unknown + clickCount=2 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:18.531371 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:18.531490 +LOCATION: [terminal: 'Terminal'] - 23:07:18.531597 +CONSUME: True Script indication - 23:07:18.531613 +DEFAULT: Interrupting presentation - 23:07:18.531627 +TOTAL PROCESSING TIME: 0.0005 - 23:07:18.531782 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +INFO: Handler is Move flat review to the beginning of the previous line - 23:07:18.532850 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:18.532861 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:18.532971 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:18.532985 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:18.533084 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:18.533439 +SPEECH: Last spoke 0.5386 seconds ago - 23:07:18.533481 +SPEECH: Speak '137 + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:18.533492 +SPEECH OUTPUT: '137 + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:18.533516 +SPEECH DISPATCHER: Speaking ' 137 + ' as string - 23:07:18.533532 +SPEECH DISPATCHER: Speaking '137 + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:18.533747 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:18.533996 +BRAILLE: update review disabled - 23:07:18.534032 +TOTAL PROCESSING TIME: 0.0012 - 23:07:18.534040 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203092686 + time=1750907238.651057 + keyType=unknown + clickCount=2 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:18.651161 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:18.651267 +LOCATION: [terminal: 'Terminal'] - 23:07:18.651360 +CONSUME: True Is release for last non-modifier keyevent - 23:07:18.651379 +TOTAL PROCESSING TIME: 0.0003 - 23:07:18.651394 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203092851 + time=1750907238.816279 + keyType=unknown + clickCount=3 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:18.816402 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:18.816497 +LOCATION: [terminal: 'Terminal'] - 23:07:18.816579 +CONSUME: True Script indication - 23:07:18.816597 +DEFAULT: Interrupting presentation - 23:07:18.816606 +TOTAL PROCESSING TIME: 0.0004 - 23:07:18.816723 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +INFO: Handler is Move flat review to the beginning of the previous line - 23:07:18.817786 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:18.817796 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:18.817883 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:18.817894 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:18.817968 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:18.818313 +SPEECH: Last spoke 0.2849 seconds ago - 23:07:18.818353 +SPEECH: Speak 'Killed + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:18.818364 +SPEECH OUTPUT: 'Killed + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:18.818386 +SPEECH DISPATCHER: Speaking ' Killed + ' as string - 23:07:18.818402 +SPEECH DISPATCHER: Speaking 'Killed + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:18.818603 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:18.818826 +BRAILLE: update review disabled - 23:07:18.818859 +TOTAL PROCESSING TIME: 0.0011 - 23:07:18.818868 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203092994 + time=1750907238.959129 + keyType=unknown + clickCount=3 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:18.959266 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:18.959390 +LOCATION: [terminal: 'Terminal'] - 23:07:18.959505 +CONSUME: True Is release for last non-modifier keyevent - 23:07:18.959523 +TOTAL PROCESSING TIME: 0.0004 - 23:07:18.959546 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203093294 + time=1750907239.259315 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:19.259434 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:19.259532 +LOCATION: [terminal: 'Terminal'] - 23:07:19.259616 +CONSUME: True Script indication - 23:07:19.259635 +DEFAULT: Interrupting presentation - 23:07:19.259645 +TOTAL PROCESSING TIME: 0.0004 - 23:07:19.259762 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +INFO: Handler is Move flat review to the beginning of the previous line - 23:07:19.260822 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:19.260831 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:19.260916 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:19.260928 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:19.261055 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:19.262803 +SPEECH: Last spoke 0.4446 seconds ago - 23:07:19.262917 +SPEECH: Speak 'CTHULHU: Exception starting ATSPI registry. - 14:18:04.616885 + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:19.262929 +SPEECH OUTPUT: 'CTHULHU: Exception starting ATSPI registry. - 14:18:04.616885 + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:19.262953 +SPEECH DISPATCHER: Speaking ' CTHULHU: Exception starting ATSPI registry. - 14:18:04.616885 + ' as string - 23:07:19.262971 +SPEECH DISPATCHER: Speaking 'CTHULHU: Exception starting ATSPI registry. - 14:18:04.616885 + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:19.263212 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:19.263546 +BRAILLE: update review disabled - 23:07:19.263585 +TOTAL PROCESSING TIME: 0.0028 - 23:07:19.263596 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203093436 + time=1750907239.401346 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:19.401476 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:19.401575 +LOCATION: [terminal: 'Terminal'] - 23:07:19.401659 +CONSUME: True Is release for last non-modifier keyevent - 23:07:19.401681 +TOTAL PROCESSING TIME: 0.0003 - 23:07:19.401701 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203094756 + time=1750907240.721348 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:20.721470 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:20.721557 +LOCATION: [terminal: 'Terminal'] - 23:07:20.721628 +CONSUME: True Script indication - 23:07:20.721644 +DEFAULT: Interrupting presentation - 23:07:20.721653 +TOTAL PROCESSING TIME: 0.0004 - 23:07:20.721757 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +INFO: Handler is Move flat review to the beginning of the previous line - 23:07:20.722821 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:20.722831 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:20.722934 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:20.722948 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:20.723038 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:20.724585 +SPEECH: Last spoke 1.4618 seconds ago - 23:07:20.724688 +SPEECH: Speak 'after Emit Signal: setup-inputeventhandlers-completed + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:20.724700 +SPEECH OUTPUT: 'after Emit Signal: setup-inputeventhandlers-completed + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:20.724723 +SPEECH DISPATCHER: Speaking ' after Emit Signal: setup-inputeventhandlers-completed + ' as string - 23:07:20.724740 +SPEECH DISPATCHER: Speaking 'after Emit Signal: setup-inputeventhandlers-completed + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:20.724958 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:20.725231 +BRAILLE: update review disabled - 23:07:20.725266 +TOTAL PROCESSING TIME: 0.0025 - 23:07:20.725274 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203094906 + time=1750907240.871286 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:20.871386 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:20.871472 +LOCATION: [terminal: 'Terminal'] - 23:07:20.871545 +CONSUME: True Is release for last non-modifier keyevent - 23:07:20.871562 +TOTAL PROCESSING TIME: 0.0003 - 23:07:20.871580 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203094981 + time=1750907240.946104 + keyType=unknown + clickCount=2 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:20.946216 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:20.946304 +LOCATION: [terminal: 'Terminal'] - 23:07:20.946383 +CONSUME: True Script indication - 23:07:20.946398 +DEFAULT: Interrupting presentation - 23:07:20.946406 +TOTAL PROCESSING TIME: 0.0004 - 23:07:20.946507 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +INFO: Handler is Move flat review to the beginning of the previous line - 23:07:20.947570 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:20.947578 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:20.947668 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:20.947680 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:20.947760 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:20.949155 +SPEECH: Last spoke 0.2246 seconds ago - 23:07:20.949267 +SPEECH: Speak 'after Emit Signal: setup-inputeventhandlers-completed + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:20.949279 +SPEECH OUTPUT: 'after Emit Signal: setup-inputeventhandlers-completed + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:20.949303 +SPEECH DISPATCHER: Speaking ' after Emit Signal: setup-inputeventhandlers-completed + ' as string - 23:07:20.949320 +SPEECH DISPATCHER: Speaking 'after Emit Signal: setup-inputeventhandlers-completed + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:20.949543 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:20.949863 +BRAILLE: update review disabled - 23:07:20.949897 +TOTAL PROCESSING TIME: 0.0023 - 23:07:20.949906 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203095116 + time=1750907241.081033 + keyType=unknown + clickCount=2 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:21.081137 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:21.081223 +LOCATION: [terminal: 'Terminal'] - 23:07:21.081295 +CONSUME: True Is release for last non-modifier keyevent - 23:07:21.081312 +TOTAL PROCESSING TIME: 0.0003 - 23:07:21.081327 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203095251 + time=1750907241.216080 + keyType=unknown + clickCount=3 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:21.216197 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:21.216296 +LOCATION: [terminal: 'Terminal'] - 23:07:21.216385 +CONSUME: True Script indication - 23:07:21.216405 +DEFAULT: Interrupting presentation - 23:07:21.216415 +TOTAL PROCESSING TIME: 0.0004 - 23:07:21.216515 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +INFO: Handler is Move flat review to the beginning of the previous line - 23:07:21.217575 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:21.217584 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:21.217672 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:21.217684 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:21.217759 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:21.219130 +SPEECH: Last spoke 0.2700 seconds ago - 23:07:21.219237 +SPEECH: Speak 'after Emit Signal: setup-inputeventhandlers-completed + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:21.219249 +SPEECH OUTPUT: 'after Emit Signal: setup-inputeventhandlers-completed + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:21.219271 +SPEECH DISPATCHER: Speaking ' after Emit Signal: setup-inputeventhandlers-completed + ' as string - 23:07:21.219288 +SPEECH DISPATCHER: Speaking 'after Emit Signal: setup-inputeventhandlers-completed + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:21.219518 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:21.219798 +BRAILLE: update review disabled - 23:07:21.219833 +TOTAL PROCESSING TIME: 0.0023 - 23:07:21.219842 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203095431 + time=1750907241.396096 + keyType=unknown + clickCount=3 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:21.396200 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:21.396289 +LOCATION: [terminal: 'Terminal'] - 23:07:21.396367 +CONSUME: True Is release for last non-modifier keyevent - 23:07:21.396384 +TOTAL PROCESSING TIME: 0.0003 - 23:07:21.396398 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203095544 + time=1750907241.509004 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:21.509097 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:21.509196 +LOCATION: [terminal: 'Terminal'] - 23:07:21.509294 +CONSUME: True Script indication - 23:07:21.509312 +DEFAULT: Interrupting presentation - 23:07:21.509320 +TOTAL PROCESSING TIME: 0.0004 - 23:07:21.509416 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +INFO: Handler is Move flat review to the beginning of the previous line - 23:07:21.510479 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:21.510488 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:21.510580 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:21.510591 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:21.510667 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:21.511816 +SPEECH: Last spoke 0.2927 seconds ago - 23:07:21.511910 +SPEECH: Speak 'after Emit Signal: start-application-completed + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:21.511921 +SPEECH OUTPUT: 'after Emit Signal: start-application-completed + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:21.511943 +SPEECH DISPATCHER: Speaking ' after Emit Signal: start-application-completed + ' as string - 23:07:21.511961 +SPEECH DISPATCHER: Speaking 'after Emit Signal: start-application-completed + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:21.512184 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:21.512447 +BRAILLE: update review disabled - 23:07:21.512480 +TOTAL PROCESSING TIME: 0.0020 - 23:07:21.512489 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203095701 + time=1750907241.666088 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:21.666218 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:21.666321 +LOCATION: [terminal: 'Terminal'] - 23:07:21.666399 +CONSUME: True Is release for last non-modifier keyevent - 23:07:21.666416 +TOTAL PROCESSING TIME: 0.0003 - 23:07:21.666431 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203095814 + time=1750907241.778988 + keyType=unknown + clickCount=2 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:21.779109 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:21.779198 +LOCATION: [terminal: 'Terminal'] - 23:07:21.779275 +CONSUME: True Script indication - 23:07:21.779292 +DEFAULT: Interrupting presentation - 23:07:21.779300 +TOTAL PROCESSING TIME: 0.0004 - 23:07:21.779391 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +INFO: Handler is Move flat review to the beginning of the previous line - 23:07:21.780453 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:21.780462 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:21.780547 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:21.780559 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:21.780634 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:21.781896 +SPEECH: Last spoke 0.2701 seconds ago - 23:07:21.781982 +SPEECH: Speak 'after Emit Signal: load-setting-completed + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:21.781994 +SPEECH OUTPUT: 'after Emit Signal: load-setting-completed + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:21.782017 +SPEECH DISPATCHER: Speaking ' after Emit Signal: load-setting-completed + ' as string - 23:07:21.782035 +SPEECH DISPATCHER: Speaking 'after Emit Signal: load-setting-completed + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:21.782250 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:21.782518 +BRAILLE: update review disabled - 23:07:21.782558 +TOTAL PROCESSING TIME: 0.0021 - 23:07:21.782567 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203095964 + time=1750907241.929214 + keyType=unknown + clickCount=2 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:21.929318 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:21.929404 +LOCATION: [terminal: 'Terminal'] - 23:07:21.929477 +CONSUME: True Is release for last non-modifier keyevent - 23:07:21.929495 +TOTAL PROCESSING TIME: 0.0003 - 23:07:21.929513 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65438 + hw_code=90 + modifiers=256 + event_string=(KP_Insert) + keyval_name=(KP_Insert) + timestamp=203096421 + time=1750907242.386252 + keyType=modifier + clickCount=0 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Insert' (90) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:22.386364 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:22.386459 +LOCATION: [terminal: 'Terminal'] - 23:07:22.386541 +CONSUME: True Cthulhu modifier - 23:07:22.386561 +DEFAULT: Interrupting presentation - 23:07:22.386571 +TOTAL PROCESSING TIME: 0.0004 - 23:07:22.386667 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Insert' (90) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65434 + hw_code=81 + modifiers=256 + event_string=(KP_Page_Up) + keyval_name=(KP_Page_Up) + timestamp=203096579 + time=1750907242.544087 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:22.544201 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:22.544294 +LOCATION: [terminal: 'Terminal'] - 23:07:22.544376 +CONSUME: True Script indication - 23:07:22.544394 +DEFAULT: Interrupting presentation - 23:07:22.544402 +TOTAL PROCESSING TIME: 0.0004 - 23:07:22.544483 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) vvvvv +INFO: Handler is Move flat review to the end position - 23:07:22.545546 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:22.545557 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:22.545645 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:22.552719 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:22.552805 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:22.553850 +SPEECH: Last spoke 0.7720 seconds ago - 23:07:22.553963 +SPEECH: Speak '[storm@fenrir src] $ sudo ./fenrir + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:22.553979 +SPEECH OUTPUT: '[storm@fenrir src] $ sudo ./fenrir + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:22.554006 +SPEECH DISPATCHER: Speaking ' [storm@fenrir src] $ sudo./fenrir + ' as string - 23:07:22.554027 +SPEECH DISPATCHER: Speaking '[storm@fenrir src] $ sudo ./fenrir + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:22.554265 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:22.554552 +BRAILLE: update review disabled - 23:07:22.554592 +TOTAL PROCESSING TIME: 0.0091 - 23:07:22.554604 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65438 + hw_code=90 + modifiers=0 + event_string=(KP_Insert) + keyval_name=(KP_Insert) + timestamp=203096721 + time=1750907242.686244 + keyType=modifier + clickCount=0 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Insert' (90) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:22.686360 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:22.686457 +LOCATION: [terminal: 'Terminal'] - 23:07:22.686540 +CONSUME: True Cthulhu modifier - 23:07:22.686560 +TOTAL PROCESSING TIME: 0.0003 - 23:07:22.686579 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Insert' (90) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65434 + hw_code=81 + modifiers=0 + event_string=(KP_Page_Up) + keyval_name=(KP_Page_Up) + timestamp=203096729 + time=1750907242.693783 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Page_Up' (81) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:22.693878 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:22.693962 +LOCATION: [terminal: 'Terminal'] - 23:07:22.694040 +CONSUME: True Script indication - 23:07:22.694059 +TOTAL PROCESSING TIME: 0.0003 - 23:07:22.694074 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Page_Up' (81) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203096931 + time=1750907242.896194 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:22.896294 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:22.896376 +LOCATION: [terminal: 'Terminal'] - 23:07:22.896446 +CONSUME: True Script indication - 23:07:22.896463 +DEFAULT: Interrupting presentation - 23:07:22.896470 +TOTAL PROCESSING TIME: 0.0004 - 23:07:22.896580 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) vvvvv +INFO: Handler is Move flat review to the beginning of the previous line - 23:07:22.897642 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:22.897651 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:22.897737 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:22.897749 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:22.897823 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:22.899665 +SPEECH: Last spoke 0.3458 seconds ago - 23:07:22.899787 +SPEECH: Speak '[storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:22.899799 +SPEECH OUTPUT: '[storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:22.899822 +SPEECH DISPATCHER: Speaking ' [storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' as string - 23:07:22.899840 +SPEECH DISPATCHER: Speaking '[storm@fenrir src] $ sudo rm /tmp/fenrir_860417_2025-06-25_14-47-36.log + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:22.900065 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:22.900367 +BRAILLE: update review disabled - 23:07:22.900400 +TOTAL PROCESSING TIME: 0.0028 - 23:07:22.900409 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Home' (79) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65429 + hw_code=79 + modifiers=0 + event_string=(KP_Home) + keyval_name=(KP_Home) + timestamp=203097066 + time=1750907243.031547 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:23.031668 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:23.031766 +LOCATION: [terminal: 'Terminal'] - 23:07:23.031874 +CONSUME: True Is release for last non-modifier keyevent - 23:07:23.031905 +TOTAL PROCESSING TIME: 0.0004 - 23:07:23.031929 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Home' (79) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65434 + hw_code=81 + modifiers=0 + event_string=(KP_Page_Up) + keyval_name=(KP_Page_Up) + timestamp=203097389 + time=1750907243.354225 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:23.354347 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:23.354447 +LOCATION: [terminal: 'Terminal'] - 23:07:23.354532 +CONSUME: True Script indication - 23:07:23.354553 +DEFAULT: Interrupting presentation - 23:07:23.354563 +TOTAL PROCESSING TIME: 0.0004 - 23:07:23.354683 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) ^^^^^ + +vvvvv CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) vvvvv +INFO: Handler is Move flat review to the beginning of the next line - 23:07:23.355768 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:23.355784 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:23.355903 +FLAT REVIEW PRESENTER: Using existing context. Restrict: False - 23:07:23.355920 +CTHULHU: Active mode: flat-review Object of interest: [terminal: 'Terminal'] - 23:07:23.356020 +SPEECH GENERATOR: None voice requested with language='None', dialect='' - 23:07:23.357185 +SPEECH: Last spoke 0.4575 seconds ago - 23:07:23.357269 +SPEECH: Speak '[storm@fenrir src] $ sudo ./fenrir + ' acss: [{'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'lang': 'en', 'dialect': '', 'variant': 'none'}}] - 23:07:23.357280 +SPEECH OUTPUT: '[storm@fenrir src] $ sudo ./fenrir + ' {'established': True, 'rate': 85.0, 'average-pitch': 4.5, 'gain': 5.0, 'family': {'name': 'Lyubov', 'gender': None, 'lang': 'en', 'dialect': '', 'variant': 'none'}} - 23:07:23.357302 +SPEECH DISPATCHER: Speaking ' [storm@fenrir src] $ sudo./fenrir + ' as string - 23:07:23.357319 +SPEECH DISPATCHER: Speaking '[storm@fenrir src] $ sudo ./fenrir + ' + CTHULHU rate 85.0, pitch 4.5, volume 5.0, language en, punctuation: MOST + SD rate 72, pitch 0, volume 40, language en - 23:07:23.357521 +CTHULHU: Region of interest: [terminal: 'Terminal'] ( 0) 0 - 23:07:23.357782 +BRAILLE: update review disabled - 23:07:23.357816 +TOTAL PROCESSING TIME: 0.0021 - 23:07:23.357826 +^^^^^ CONSUME ATSPI_KEY_PRESSED_EVENT: 'KP_Page_Up' (81) ^^^^^ + +KEYBOARD_EVENT: type=ATSPI_KEY_RELEASED_EVENT + id=65434 + hw_code=81 + modifiers=0 + event_string=(KP_Page_Up) + keyval_name=(KP_Page_Up) + timestamp=203097539 + time=1750907243.504161 + keyType=unknown + clickCount=1 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Page_Up' (81) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:23.504273 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:23.504356 +LOCATION: [terminal: 'Terminal'] - 23:07:23.504429 +CONSUME: True Is release for last non-modifier keyevent - 23:07:23.504446 +TOTAL PROCESSING TIME: 0.0003 - 23:07:23.504463 +^^^^^ PROCESS ATSPI_KEY_RELEASED_EVENT: 'KP_Page_Up' (81) ^^^^^ + + +KEYBOARD_EVENT: type=ATSPI_KEY_PRESSED_EVENT + id=65438 + hw_code=90 + modifiers=256 + event_string=(KP_Insert) + keyval_name=(KP_Insert) + timestamp=203098821 + time=1750907244.786484 + keyType=modifier + clickCount=0 + shouldEcho=False + + +vvvvv PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Insert' (90) vvvvv +HOST_APP: [application: 'lxterminal'] - 23:07:24.786601 +WINDOW: [frame: 'storm@fenrir:~/git/fenrir/src'] - 23:07:24.786698 +LOCATION: [terminal: 'Terminal'] - 23:07:24.786771 +CONSUME: True Cthulhu modifier - 23:07:24.786788 +DEFAULT: Interrupting presentation - 23:07:24.786796 +TOTAL PROCESSING TIME: 0.0004 - 23:07:24.786891 +^^^^^ PROCESS ATSPI_KEY_PRESSED_EVENT: 'KP_Insert' (90) ^^^^^ + +CTHULHU: Shutting down and exiting due to signal=15 (Terminated) - 23:07:24.890901 +CTHULHU: Shutting down - 23:07:24.890939 +CTHULHU: Shutting down D-Bus remote controller - 23:07:24.890946 \ No newline at end of file diff --git a/src/cthulhu/plugins/IndentationAudio/Makefile.am b/src/cthulhu/plugins/IndentationAudio/Makefile.am new file mode 100644 index 0000000..ebd1225 --- /dev/null +++ b/src/cthulhu/plugins/IndentationAudio/Makefile.am @@ -0,0 +1,10 @@ +indentationaudio_PYTHON = \ + __init__.py \ + plugin.py + +indentationaudiodir = $(pkgdatadir)/cthulhu/plugins/IndentationAudio + +indentationaudio_DATA = \ + plugin.info + +EXTRA_DIST = $(indentationaudio_DATA) \ No newline at end of file diff --git a/src/cthulhu/plugins/IndentationAudio/__init__.py b/src/cthulhu/plugins/IndentationAudio/__init__.py new file mode 100644 index 0000000..7e5fc5a --- /dev/null +++ b/src/cthulhu/plugins/IndentationAudio/__init__.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +# +# Copyright (c) 2025 Stormux +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +"""IndentationAudio plugin package.""" + +from .plugin import IndentationAudio + +__all__ = ['IndentationAudio'] \ No newline at end of file diff --git a/src/cthulhu/plugins/IndentationAudio/plugin.info b/src/cthulhu/plugins/IndentationAudio/plugin.info new file mode 100644 index 0000000..5ab2067 --- /dev/null +++ b/src/cthulhu/plugins/IndentationAudio/plugin.info @@ -0,0 +1,9 @@ +[Core] +Name = IndentationAudio +Module = IndentationAudio + +[Documentation] +Description = Provides audio feedback for indentation level changes when navigating code or text +Author = Stormux +Version = 1.0.0 +Website = https://git.stormux.org/storm/cthulhu \ No newline at end of file diff --git a/src/cthulhu/plugins/IndentationAudio/plugin.py b/src/cthulhu/plugins/IndentationAudio/plugin.py new file mode 100644 index 0000000..7b65002 --- /dev/null +++ b/src/cthulhu/plugins/IndentationAudio/plugin.py @@ -0,0 +1,334 @@ +#!/usr/bin/env python3 +# +# Copyright (c) 2025 Stormux +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +"""IndentationAudio plugin for Cthulhu - Provides audio feedback for indentation level changes.""" + +import logging +import re +from gi.repository import GLib + +from cthulhu.plugin import Plugin, cthulhu_hookimpl +from cthulhu import cmdnames +from cthulhu import debug +from cthulhu import input_event +from cthulhu import keybindings +from cthulhu import messages +from cthulhu import script_utilities +from cthulhu import settings_manager +from cthulhu import sound +from cthulhu.sound_generator import Tone + +logger = logging.getLogger(__name__) +_settingsManager = settings_manager.getManager() + + +class IndentationAudio(Plugin): + """Plugin that provides audio cues for indentation level changes.""" + + def __init__(self, *args, **kwargs): + """Initialize the IndentationAudio plugin.""" + super().__init__(*args, **kwargs) + self._enabled = True # Start enabled by default + self._last_indentation_level = {} # Track per-object indentation + self._event_listener_id = None + self._kb_binding = None + self._player = None + + # Audio settings + self._base_frequency = 200 # Base frequency in Hz + self._frequency_step = 80 # Hz per indentation level + self._tone_duration = 0.15 # Seconds + self._max_frequency = 1200 # Cap frequency to avoid harsh sounds + + logger.info("IndentationAudio plugin initialized") + + @cthulhu_hookimpl + def activate(self, plugin=None): + """Activate the IndentationAudio plugin.""" + if plugin is not None and plugin is not self: + return + + try: + logger.info("=== IndentationAudio plugin activation starting ===") + + # Initialize sound player + self._player = sound.getPlayer() + + # Register keybinding for toggle (Cthulhu+I) + self._register_keybinding() + + # Connect to text caret movement events + self._connect_to_events() + + logger.info("IndentationAudio plugin activated successfully") + return True + + except Exception as e: + logger.error(f"Failed to activate IndentationAudio plugin: {e}") + return False + + @cthulhu_hookimpl + def deactivate(self, plugin=None): + """Deactivate the IndentationAudio plugin.""" + if plugin is not None and plugin is not self: + return + + try: + logger.info("=== IndentationAudio plugin deactivation starting ===") + + # Disconnect from events + self._disconnect_from_events() + + # Clear tracking data + self._last_indentation_level.clear() + + logger.info("IndentationAudio plugin deactivated successfully") + return True + + except Exception as e: + logger.error(f"Failed to deactivate IndentationAudio plugin: {e}") + return False + + def _register_keybinding(self): + """Register the Cthulhu+I keybinding for toggling the plugin.""" + try: + if not self.app: + logger.error("IndentationAudio: No app reference available for keybinding") + return + + api_helper = self.app.getAPIHelper() + if not api_helper: + logger.error("IndentationAudio: No API helper available") + return + + # Register Cthulhu+I keybinding + gesture_string = "Cthulhu+i" + description = "Toggle indentation audio feedback" + handler = self._toggle_indentation_audio + + self._kb_binding = api_helper.registerGestureByString( + gesture_string, handler, description + ) + + if self._kb_binding: + logger.info(f"IndentationAudio: Registered keybinding {gesture_string}") + else: + logger.error(f"IndentationAudio: Failed to register keybinding {gesture_string}") + + except Exception as e: + logger.error(f"IndentationAudio: Error registering keybinding: {e}") + + def _connect_to_events(self): + """Connect to text navigation events.""" + try: + # Hook into the dynamic API to make ourselves available to scripts + if self.app: + api_manager = self.app.getDynamicApiManager() + api_manager.registerAPI('IndentationAudioPlugin', self) + logger.info("IndentationAudio: Registered with dynamic API manager") + + # We'll also monkey-patch the default script's sayLine method + self._monkey_patch_script_methods() + + except Exception as e: + logger.error(f"IndentationAudio: Error connecting to events: {e}") + + def _disconnect_from_events(self): + """Disconnect from text navigation events.""" + try: + # Unregister from dynamic API + if self.app: + api_manager = self.app.getDynamicApiManager() + api_manager.unregisterAPI('IndentationAudioPlugin') + + # Restore original script methods + self._restore_script_methods() + + except Exception as e: + logger.error(f"IndentationAudio: Error disconnecting from events: {e}") + + def _monkey_patch_script_methods(self): + """Monkey-patch the default script's line navigation methods.""" + try: + # Get the current active script + if self.app: + state = self.app.getDynamicApiManager().getAPI('CthulhuState') + if state and hasattr(state, 'activeScript') and state.activeScript: + script = state.activeScript + + # Store original method + if hasattr(script, 'sayLine'): + self._original_sayLine = script.sayLine + + # Create wrapped version + def wrapped_sayLine(obj): + # Call original method first + result = self._original_sayLine(obj) + + # Add our indentation audio check + try: + line, caretOffset, startOffset = script.getTextLineAtCaret(obj) + self.check_indentation_change(obj, line) + except Exception as e: + logger.error(f"IndentationAudio: Error in wrapped_sayLine: {e}") + + return result + + # Replace the method + script.sayLine = wrapped_sayLine + logger.info("IndentationAudio: Successfully monkey-patched sayLine method") + + except Exception as e: + logger.error(f"IndentationAudio: Error monkey-patching script methods: {e}") + + def _restore_script_methods(self): + """Restore original script methods.""" + try: + if self.app and hasattr(self, '_original_sayLine'): + state = self.app.getDynamicApiManager().getAPI('CthulhuState') + if state and hasattr(state, 'activeScript') and state.activeScript: + script = state.activeScript + if hasattr(script, 'sayLine'): + script.sayLine = self._original_sayLine + logger.info("IndentationAudio: Restored original sayLine method") + + except Exception as e: + logger.error(f"IndentationAudio: Error restoring script methods: {e}") + + def _toggle_indentation_audio(self, script, inputEvent=None): + """Toggle the indentation audio feedback on/off.""" + try: + self._enabled = not self._enabled + state = "enabled" if self._enabled else "disabled" + + # Announce the state change + message = f"Indentation audio {state}" + if hasattr(script, 'speakMessage'): + script.speakMessage(message) + + logger.info(f"IndentationAudio: Toggled to {state}") + return True + + except Exception as e: + logger.error(f"IndentationAudio: Error toggling state: {e}") + return False + + def _calculate_indentation_level(self, line_text): + """Calculate the indentation level of a line.""" + if not line_text: + return 0 + + # Remove non-breaking spaces and convert to regular spaces + line = line_text.replace("\u00a0", " ") + + # Find the first non-whitespace character + match = re.search(r"[^ \t]", line) + if not match: + return 0 # Empty or whitespace-only line + + indent_text = line[:match.start()] + + # Calculate indentation level (4 spaces = 1 level, 1 tab = 1 level) + level = 0 + for char in indent_text: + if char == '\t': + level += 1 + elif char == ' ': + level += 0.25 # 4 spaces = 1 level + + return int(level) + + def _generate_indentation_tone(self, new_level, old_level): + """Generate an audio tone for indentation level change.""" + if not self._enabled or not self._player: + return + + # Calculate frequency based on new indentation level + frequency = min( + self._base_frequency + (new_level * self._frequency_step), + self._max_frequency + ) + + # Determine stereo panning based on change direction + # Left channel for indent increase, right for decrease + volume_multiplier = 0.7 + + try: + # Create tone + tone = Tone( + duration=self._tone_duration, + frequency=frequency, + volumeMultiplier=volume_multiplier, + wave=Tone.SINE_WAVE + ) + + # Play the tone + self._player.play(tone, interrupt=False) + + debug_msg = f"IndentationAudio: Played tone - Level: {new_level}, Freq: {frequency}Hz" + logger.debug(debug_msg) + + except Exception as e: + logger.error(f"IndentationAudio: Error generating tone: {e}") + + def check_indentation_change(self, obj, line_text): + """Check if indentation has changed and play audio cue if needed. + + This method is intended to be called by scripts during line navigation. + """ + if not self._enabled or not line_text: + return + + try: + # Get object identifier for tracking + obj_id = str(obj) if obj else "unknown" + + # Calculate current indentation level + current_level = self._calculate_indentation_level(line_text) + + # Get previous level for this object + previous_level = self._last_indentation_level.get(obj_id, current_level) + + # Update tracking + self._last_indentation_level[obj_id] = current_level + + # Play audio cue if indentation changed + if current_level != previous_level: + self._generate_indentation_tone(current_level, previous_level) + + debug_msg = f"IndentationAudio: Indentation changed from {previous_level} to {current_level}" + logger.debug(debug_msg) + + except Exception as e: + logger.error(f"IndentationAudio: Error checking indentation change: {e}") + + def is_enabled(self): + """Return whether the plugin is currently enabled.""" + return self._enabled + + def set_enabled(self, enabled): + """Set the enabled state of the plugin.""" + self._enabled = enabled + + def on_script_change(self, new_script): + """Handle when the active script changes.""" + try: + # Restore previous script if it was patched + self._restore_script_methods() + + # Re-apply patches to new script + self._monkey_patch_script_methods() + + # Clear tracking data for new context + self._last_indentation_level.clear() + + logger.info("IndentationAudio: Handled script change") + + except Exception as e: + logger.error(f"IndentationAudio: Error handling script change: {e}") \ No newline at end of file