__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
# Orca # # Copyright 2005-2008 Sun Microsystems Inc. # Copyright 2016-2023 Igalia, S.L. # # Author: Joanmarie Diggs <[email protected]> # # 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. # pylint: disable=broad-exception-caught # pylint: disable=wrong-import-position """Module to manage the focused object, window, etc.""" __id__ = "$Id$" __version__ = "$Revision$" __date__ = "$Date$" __copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc." \ "Copyright (c) 2016-2023 Igalia, S.L." __license__ = "LGPL" from typing import Any, Optional import gi gi.require_version("Atspi", "2.0") from gi.repository import Atspi from . import braille from . import debug from . import script_manager from .ax_object import AXObject from .ax_utilities import AXUtilities CARET_TRACKING = "caret-tracking" FOCUS_TRACKING = "focus-tracking" FLAT_REVIEW = "flat-review" MOUSE_REVIEW = "mouse-review" OBJECT_NAVIGATOR = "object-navigator" SAY_ALL = "say-all" class FocusManager: """Manages the focused object, window, etc.""" def __init__(self) -> None: self._window: Optional[Atspi.Accessible] = None self._focus: Optional[Atspi.Accessible] = None self._object_of_interest: Optional[Atspi.Accessible] = None self._active_mode: Optional[str] = None def clear_state(self, reason: str = "") -> None: """Clears everything we're tracking.""" msg = "FOCUS MANAGER: Clearing all state" if reason: msg += f": {reason}" debug.print_message(debug.LEVEL_INFO, msg, True) self._focus = None self._window = None self._object_of_interest = None self._active_mode = None def find_focused_object(self) -> Optional[Atspi.Accessible]: """Returns the focused object in the active window.""" result = AXUtilities.get_focused_object(self._window) tokens = ["FOCUS MANAGER: Focused object in", self._window, "is", result] debug.print_tokens(debug.LEVEL_INFO, tokens, True) return result def focus_and_window_are_unknown(self) -> bool: """Returns True if we have no knowledge about what is focused.""" result = self._focus is None and self._window is None if result: msg = "FOCUS MANAGER: Focus and window are unknown" debug.print_message(debug.LEVEL_INFO, msg, True) return result def focus_is_dead(self) -> bool: """Returns True if the locus of focus is dead.""" if not AXObject.is_dead(self._focus): return False msg = "FOCUS MANAGER: Focus is dead" debug.print_message(debug.LEVEL_INFO, msg, True) return True def focus_is_active_window(self) -> bool: """Returns True if the locus of focus is the active window.""" if self._focus is None: return False return self._focus == self._window def focus_is_in_active_window(self) -> bool: """Returns True if the locus of focus is inside the current window.""" return self._focus is not None and AXObject.is_ancestor(self._focus, self._window) def emit_region_changed( self, obj: Atspi.Accessible, start_offset: Optional[int] = None, end_offset: Optional[int] = None, mode: Optional[str] = None ) -> None: """Notifies interested clients that the current region of interest has changed.""" if start_offset is None: start_offset = 0 if end_offset is None: end_offset = start_offset if mode is None: mode = FOCUS_TRACKING try: obj.emit("mode-changed::" + mode, 1, "") except Exception as error: msg = f"FOCUS MANAGER: Exception emitting mode-changed notification: {error}" debug.print_message(debug.LEVEL_INFO, msg, True) if mode != self._active_mode: tokens = ["FOCUS MANAGER: Switching mode from", self._active_mode, "to", mode] debug.print_tokens(debug.LEVEL_INFO, tokens, True) self._active_mode = mode if mode == FLAT_REVIEW: braille.setBrlapiPriority(braille.BRLAPI_PRIORITY_HIGH) else: braille.setBrlapiPriority() try: tokens = ["FOCUS MANAGER: Region of interest:", obj, f"({start_offset}, {end_offset})"] debug.print_tokens(debug.LEVEL_INFO, tokens, True) obj.emit("region-changed", start_offset, end_offset) except Exception as error: msg = f"FOCUS MANAGER: Exception emitting region-changed notification: {error}" debug.print_message(debug.LEVEL_INFO, msg, True) if obj != self._object_of_interest: tokens = ["FOCUS MANAGER: Switching object of interest from", self._object_of_interest, "to", obj] debug.print_tokens(debug.LEVEL_INFO, tokens, True) self._object_of_interest = obj def get_active_mode_and_object_of_interest( self ) -> tuple[Optional[str], Optional[Atspi.Accessible]]: """Returns the current mode and associated object of interest""" tokens = ["FOCUS MANAGER: Active mode:", self._active_mode, "Object of interest:", self._object_of_interest] debug.print_tokens(debug.LEVEL_INFO, tokens, True) return self._active_mode, self._object_of_interest def get_locus_of_focus(self) -> Optional[Atspi.Accessible]: """Returns the current locus of focus (i.e. the object with visual focus).""" tokens = ["FOCUS MANAGER: Locus of focus is", self._focus] debug.print_tokens(debug.LEVEL_INFO, tokens, True) return self._focus def set_locus_of_focus( self, event: Optional[Any], obj: Optional[Atspi.Accessible], notify_script: bool = True, force: bool = False ) -> None: """Sets the locus of focus (i.e., the object with visual focus).""" tokens = ["FOCUS MANAGER: Request to set locus of focus to", obj] debug.print_tokens(debug.LEVEL_INFO, tokens, True, True) # We clear the cache on the locus of focus because too many apps and toolkits fail # to emit the correct accessibility events. We do so recursively on table cells # to handle bugs like https://gitlab.gnome.org/GNOME/nautilus/-/issues/3253. recursive = AXUtilities.is_table_cell(obj) AXObject.clear_cache(obj, recursive, "Setting locus of focus.") if not force and obj == self._focus: msg = "FOCUS MANAGER: Setting locus of focus to existing locus of focus" debug.print_message(debug.LEVEL_INFO, msg, True) return # TODO - JD: Consider always updating the active script here. script = script_manager.get_manager().get_active_script() if event and (script and not script.app): app = AXUtilities.get_application(event.source) script = script_manager.get_manager().get_script(app, event.source) script_manager.get_manager().set_active_script(script, "Setting locus of focus") old_focus = self._focus if AXObject.is_dead(old_focus): old_focus = None if obj is None: msg = "FOCUS MANAGER: New locus of focus is null (being cleared)" debug.print_message(debug.LEVEL_INFO, msg, True) self._focus = None return if AXObject.is_dead(obj): tokens = ["FOCUS MANAGER: New locus of focus (", obj, ") is dead. Not updating."] debug.print_tokens(debug.LEVEL_INFO, tokens, True) return if script is not None: if not AXObject.is_valid(obj): tokens = ["FOCUS MANAGER: New locus of focus (", obj, ") is invalid. Not updating."] debug.print_tokens(debug.LEVEL_INFO, tokens, True) return tokens = ["FOCUS MANAGER: Changing locus of focus from", old_focus, "to", obj, ". Notify:", notify_script] debug.print_tokens(debug.LEVEL_INFO, tokens, True) self._focus = obj self.emit_region_changed(obj, mode=FOCUS_TRACKING) if not notify_script: return if script is None: msg = "FOCUS MANAGER: Cannot notify active script because there isn't one" debug.print_message(debug.LEVEL_INFO, msg, True) return script.locus_of_focus_changed(event, old_focus, self._focus) def active_window_is_active(self) -> bool: """Returns True if the window we think is currently active is actually active.""" AXObject.clear_cache(self._window, False, "Ensuring the active window is really active.") is_active = AXUtilities.is_active(self._window) tokens = ["FOCUS MANAGER:", self._window, "is active:", is_active] debug.print_tokens(debug.LEVEL_INFO, tokens, True) return is_active def get_active_window(self) -> Optional[Atspi.Accessible]: """Returns the currently-active window (i.e. without searching or verifying).""" tokens = ["FOCUS MANAGER: Active window is", self._window] debug.print_tokens(debug.LEVEL_INFO, tokens, True, True) return self._window def set_active_window( self, frame: Optional[Atspi.Accessible], app: Optional[Atspi.Accessible] = None, set_window_as_focus: bool = False, notify_script: bool = False ) -> None: """Sets the active window.""" tokens = ["FOCUS MANAGER: Request to set active window to", frame] if app is not None: tokens.extend(["in", app]) debug.print_tokens(debug.LEVEL_INFO, tokens, True) if frame == self._window: msg = "FOCUS MANAGER: Setting active window to existing active window" debug.print_message(debug.LEVEL_INFO, msg, True) elif frame is None: self._window = None else: self._window = frame if set_window_as_focus: self.set_locus_of_focus(None, self._window, notify_script) elif not (self.focus_is_active_window() or self.focus_is_in_active_window()): tokens = ["FOCUS MANAGER: Focus", self._focus, "is not in", self._window] debug.print_tokens(debug.LEVEL_INFO, tokens, True, True) # Don't update the focus to the active window if we can't get to the active window # from the focused object. https://bugreports.qt.io/browse/QTBUG-130116 if not AXObject.has_broken_ancestry(self._focus): self.set_locus_of_focus(None, self._window, notify_script=True) app = AXUtilities.get_application(self._focus) script = script_manager.get_manager().get_script(app, self._focus) script_manager.get_manager().set_active_script(script, "Setting active window") _manager: FocusManager = FocusManager() def get_manager() -> FocusManager: """Returns the focus manager singleton.""" return _manager
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| __pycache__ | Folder | 0755 |
|
|
| backends | Folder | 0755 |
|
|
| scripts | Folder | 0755 |
|
|
| __init__.py | File | 115 B | 0644 |
|
| acss.py | File | 3.85 KB | 0644 |
|
| action_presenter.py | File | 8.65 KB | 0644 |
|
| ax_collection.py | File | 6.16 KB | 0644 |
|
| ax_component.py | File | 14.93 KB | 0644 |
|
| ax_document.py | File | 9.36 KB | 0644 |
|
| ax_event_synthesizer.py | File | 17.39 KB | 0644 |
|
| ax_hypertext.py | File | 8.36 KB | 0644 |
|
| ax_object.py | File | 47.84 KB | 0644 |
|
| ax_selection.py | File | 4.54 KB | 0644 |
|
| ax_table.py | File | 47.98 KB | 0644 |
|
| ax_text.py | File | 45.13 KB | 0644 |
|
| ax_utilities.py | File | 28.24 KB | 0644 |
|
| ax_utilities_application.py | File | 7.17 KB | 0644 |
|
| ax_utilities_collection.py | File | 86.79 KB | 0644 |
|
| ax_utilities_debugging.py | File | 10.12 KB | 0644 |
|
| ax_utilities_event.py | File | 32.78 KB | 0644 |
|
| ax_utilities_relation.py | File | 15.2 KB | 0644 |
|
| ax_utilities_role.py | File | 91.79 KB | 0644 |
|
| ax_utilities_state.py | File | 11.63 KB | 0644 |
|
| ax_value.py | File | 6.83 KB | 0644 |
|
| bookmarks.py | File | 11.95 KB | 0644 |
|
| braille.py | File | 74.03 KB | 0644 |
|
| braille_generator.py | File | 55.79 KB | 0644 |
|
| braille_rolenames.py | File | 10.23 KB | 0644 |
|
| brlmon.py | File | 6.53 KB | 0644 |
|
| brltablenames.py | File | 7.3 KB | 0644 |
|
| bypass_mode_manager.py | File | 4.79 KB | 0644 |
|
| caret_navigation.py | File | 19.51 KB | 0644 |
|
| chat.py | File | 32.03 KB | 0644 |
|
| clipboard.py | File | 20.45 KB | 0644 |
|
| cmdnames.py | File | 61.77 KB | 0644 |
|
| colornames.py | File | 39.22 KB | 0644 |
|
| debug.py | File | 3.95 KB | 0644 |
|
| debugging_tools_manager.py | File | 10.69 KB | 0644 |
|
| event_manager.py | File | 36.07 KB | 0644 |
|
| flat_review.py | File | 48.89 KB | 0644 |
|
| flat_review_finder.py | File | 20.2 KB | 0644 |
|
| flat_review_presenter.py | File | 45.94 KB | 0644 |
|
| focus_manager.py | File | 11.52 KB | 0644 |
|
| generator.py | File | 67.07 KB | 0644 |
|
| guilabels.py | File | 56.38 KB | 0644 |
|
| highlighter.py | File | 6.95 KB | 0644 |
|
| input_event.py | File | 30.05 KB | 0644 |
|
| input_event_manager.py | File | 35.66 KB | 0644 |
|
| keybindings.py | File | 24.87 KB | 0644 |
|
| keynames.py | File | 9.55 KB | 0644 |
|
| label_inference.py | File | 19.77 KB | 0644 |
|
| learn_mode_presenter.py | File | 14.72 KB | 0644 |
|
| liveregions.py | File | 25.77 KB | 0644 |
|
| mathsymbols.py | File | 88.65 KB | 0644 |
|
| messages.py | File | 152.28 KB | 0644 |
|
| mouse_review.py | File | 23.34 KB | 0644 |
|
| notification_presenter.py | File | 14.17 KB | 0644 |
|
| object_navigator.py | File | 13.24 KB | 0644 |
|
| object_properties.py | File | 33.86 KB | 0644 |
|
| orca.py | File | 9.83 KB | 0644 |
|
| orca_gtkbuilder.py | File | 5.42 KB | 0644 |
|
| orca_gui_navlist.py | File | 6.51 KB | 0644 |
|
| orca_gui_prefs.py | File | 141.9 KB | 0644 |
|
| orca_gui_profile.py | File | 3.98 KB | 0644 |
|
| orca_i18n.py | File | 3.13 KB | 0644 |
|
| orca_modifier_manager.py | File | 13.76 KB | 0644 |
|
| orca_platform.py | File | 1.43 KB | 0644 |
|
| phonnames.py | File | 2.76 KB | 0644 |
|
| pronunciation_dict.py | File | 2.55 KB | 0644 |
|
| script.py | File | 11.11 KB | 0644 |
|
| script_manager.py | File | 14.68 KB | 0644 |
|
| script_utilities.py | File | 64.21 KB | 0644 |
|
| settings.py | File | 10.66 KB | 0644 |
|
| settings_manager.py | File | 27.13 KB | 0644 |
|
| sleep_mode_manager.py | File | 5.04 KB | 0644 |
|
| sound.py | File | 5.51 KB | 0644 |
|
| sound_generator.py | File | 48.88 KB | 0644 |
|
| speech.py | File | 8.87 KB | 0644 |
|
| speech_and_verbosity_manager.py | File | 27.71 KB | 0644 |
|
| speech_generator.py | File | 163.53 KB | 0644 |
|
| speechdispatcherfactory.py | File | 24.68 KB | 0644 |
|
| speechserver.py | File | 8 KB | 0644 |
|
| spellcheck.py | File | 18.11 KB | 0644 |
|
| spiel.py | File | 25.59 KB | 0644 |
|
| ssml.py | File | 6.71 KB | 0644 |
|
| structural_navigation.py | File | 77.63 KB | 0644 |
|
| system_information_presenter.py | File | 7.44 KB | 0644 |
|
| table_navigator.py | File | 29.78 KB | 0644 |
|
| text_attribute_names.py | File | 27.31 KB | 0644 |
|
| where_am_i_presenter.py | File | 21.59 KB | 0644 |
|