Skip to content

app_writer

app_writer

Reliable text insertion into a requested desktop application.

Functions:

write_text

write_text(
    text: str, *, app_name: str = "", timeout_s: float = 2.0
) -> WriteResult

Focus app_name when supplied, insert text, and verify focus.

The preferred AX path avoids touching the clipboard. The fallback uses Diapason's clipboard-preserving paste implementation. It never presses Return, clicks Send, or submits a form.

Source code in src/diapason/desktop/app_writer.py
def write_text(text: str, *, app_name: str = "", timeout_s: float = 2.0) -> WriteResult:
    """Focus *app_name* when supplied, insert text, and verify focus.

    The preferred AX path avoids touching the clipboard.  The fallback uses
    Diapason's clipboard-preserving paste implementation.  It never presses
    Return, clicks Send, or submits a form.
    """
    if not text:
        return WriteResult(False, detail="Aucun texte à écrire.")

    resolved = app_name.strip()
    focused = not bool(resolved)
    if resolved:
        from diapason.tools.desktop_tools import open_application

        opened = open_application(resolved)
        if not opened.success:
            return WriteResult(False, app=resolved, detail=opened.content)
        resolved = str(opened.metadata.get("app") or resolved)
        from diapason.desktop.frontmost import wait_until_frontmost

        focused = (
            wait_until_frontmost(resolved, timeout_s=timeout_s)
            if sys.platform == "darwin"
            else True
        )

    # Accessibility insertion is both faster and less invasive than paste.
    try:
        from diapason.desktop.accessibility import insert_text

        if insert_text(text):
            return WriteResult(
                True,
                method="accessibility",
                app=resolved,
                verified=focused,
                detail="Texte écrit par l’API d’accessibilité.",
            )
    except Exception:  # noqa: BLE001 - safe fallback is expected on many hosts
        pass

    from diapason.tools.desktop_tools import PasteToFrontmostTool

    pasted = PasteToFrontmostTool().execute(text=text)
    return WriteResult(
        pasted.success,
        method="clipboard" if pasted.success else "",
        app=resolved,
        verified=bool(pasted.success and focused),
        detail=pasted.content,
    )