Ctrl K
ComunidadGuías…

scripts/rust-dialog-smoke.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import argparse
import time

import pyatspi


def descendants(root):
    pending = [root]
    visited = 0
    while pending and visited < 5000:
        current = pending.pop()
        visited += 1
        yield current
        try:
            pending.extend(current.getChildAtIndex(index) for index in range(current.childCount))
        except (RuntimeError, LookupError):
            continue


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("title")
    parser.add_argument("mode", choices=["cancel", "select"])
    args = parser.parse_args()
    expected = {"cancel"} if args.mode == "cancel" else {"select", "open", "select folder"}
    deadline = time.monotonic() + 20
    observed = set()
    while time.monotonic() < deadline:
        desktop = pyatspi.Registry.getDesktop(0)
        for application in desktop:
            if application is None:
                continue
            for dialog in application:
                if dialog is None or dialog.name != args.title:
                    continue
                matches = []
                for control in descendants(dialog):
                    try:
                        if control.getRole() != pyatspi.ROLE_PUSH_BUTTON:
                            continue
                        name = control.name.replace("_", "").strip().lower()
                        observed.add(name)
                        state = control.getState()
                        if name in expected and state.contains(pyatspi.STATE_ENABLED) and state.contains(pyatspi.STATE_SHOWING):
                            matches.append(control)
                    except (RuntimeError, LookupError):
                        continue
                if len(matches) == 1:
                    action = matches[0].queryAction()
                    if action.nActions < 1 or not action.doAction(0):
                        raise RuntimeError("Native confirmation action failed")
                    print(f"Invoked native {args.mode}; observed buttons: {sorted(observed)}", flush=True)
                    return
        time.sleep(0.1)
    raise RuntimeError(f"No unique enabled {args.mode} control in {args.title}; buttons: {sorted(observed)}")


if __name__ == "__main__":
    main()