Source code for odevgui_win.focus

from __future__ import annotations
from pywinauto.application import Application
import pywinauto


from ooodev.utils.data_type.window_title import WindowTitle as WindowTitle
from ooodev.utils.gui import GUI

from .data_type.rectangle import Rectangle


[docs]class Focus:
[docs] @classmethod def focus(cls, *titles: WindowTitle) -> Rectangle | None: """ Set focus on first window that matches. Arguments: *titles: Expandable list of :external+odev:py:class:`ooodev.utils.data_type.window_title.WindowTitle` Returns: Rectangle: Rectangle representing window if found; Otherwise, ``None`` See Also: :py:meth:`~.focus.Focus.focus_current` """ if len(titles) == 0: return False app = None title_arg = None for title in titles: d_args = {"class_name": title.class_name} if title.is_regex: d_args["title_re"] = title.title else: d_args["title"] = title.title try: app = Application().connect(**d_args) title_arg = title if app: break except pywinauto.ElementNotFoundError: app = None if app is None: return None try: if title_arg.is_regex: win = app.window(title_re=title_arg.title) else: win = app.window(title=title_arg.title) win.set_focus() return cls._win_to_rect(win) except Exception: pass return None
[docs] @classmethod def focus_current(cls) -> Rectangle | None: """ Focuses on the current window detected by :external+odev:py:class:`ooodev.utils.lo.Lo`. Returns: Rectangle: Rectangle representing window if found; Otherwise, ``None`` See Also: :py:meth:`~.focus.Focus.focus` """ win = cls._focus_hwnd() if win: return cls._win_to_rect(win) win = cls._focus_title() if win: return cls._win_to_rect(win) return None
@staticmethod def _focus_hwnd() -> pywinauto.WindowSpecification | None: hwnd = GUI.get_window_handle(None) if hwnd is None: return False if hwnd <= 0: return False try: app = Application().connect(handle=hwnd) win = app.window(handle=hwnd) win.set_focus() return win except Exception: pass return None @staticmethod def _focus_title() -> pywinauto.WindowSpecification | None: try: title = GUI.get_title_bar() if not title: return None wt = WindowTitle(title=title) app = Application().connect(title=wt.title, class_name=wt.class_name) win = app.window(title=wt.title) win.set_focus() return win except Exception: pass return None @staticmethod def _win_to_rect(win) -> Rectangle: rect = win.rectangle() return Rectangle(left=rect.left, right=rect.right, top=rect.top, bottom=rect.bottom)