--- name: open_onlyoffice_file kind: function lang: bash domain: shell version: "1.0.0" purity: impure signature: "open_onlyoffice_file(file_path: string, instance: string = demo) -> json" description: "Abre un archivo en una INSTANCIA AISLADA de ONLYOFFICE Desktop Editors (Linux/X11) sin perturbar la instancia personal del usuario. Cada 'instance' (slot, default demo) usa su propio HOME=/tmp/oo_, XDG_RUNTIME_DIR y XDG_CONFIG_HOME bajo /tmp, lo que rompe el single-instance lock de ONLYOFFICE y permite una ventana propia en vez de una pestaña en la instancia del usuario. Espera la ventana por evento (xdotool, basename del archivo, timeout ~25s) sin sleep en foreground. Idempotente: si ya hay ventana para ese basename, no relanza y devuelve el wid existente. NO crea archivos: si file_path no existe, falla. Imprime una linea JSON con instance, file (ruta absoluta), wid (hex), pid y status (open|timeout)." tags: [onlyoffice, desktop, x11, shell] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] params: - name: file_path desc: "ruta (relativa o absoluta) al archivo a abrir; DEBE existir, esta funcion no crea archivos. Se normaliza con readlink -f y se busca la ventana por su basename" - name: instance desc: "nombre del slot aislado (default: demo). Determina el env: HOME=/tmp/oo_, XDG_RUNTIME_DIR=/tmp/oo__run, XDG_CONFIG_HOME=/tmp/oo_/.config. Usa el MISMO instance en reload/close para operar la misma instancia" output: "una linea JSON a stdout: {\"instance\":\"\",\"file\":\"\",\"wid\":\"|null\",\"pid\":|null,\"status\":\"open\"|\"timeout\"}. Exit 0 si abrio (status open), exit 1 si la ventana no aparecio en el timeout (status timeout) o falta dependencia/archivo, exit 2 si falta el argumento file_path" tested: false tests: [] test_file_path: "" file_path: "bash/functions/shell/open_onlyoffice_file.sh" --- ## Ejemplo ```bash # Como script directo (slot 'demo' por defecto) bash bash/functions/shell/open_onlyoffice_file.sh /tmp/demo_reload.xlsx # Slot nombrado distinto (ventana propia, no perturba la instancia personal) bash bash/functions/shell/open_onlyoffice_file.sh /tmp/informe.docx reporte # Via fn run ./fn run open_onlyoffice_file_bash_shell /tmp/demo_reload.xlsx demo # Sourceado, capturando el wid del JSON source bash/functions/shell/open_onlyoffice_file.sh out=$(open_onlyoffice_file /tmp/demo_reload.xlsx demo) echo "$out" # {"instance":"demo","file":"/tmp/demo_reload.xlsx","wid":"0x3c00007","pid":12345,"status":"open"} ``` ## Cuando usarla - Cuando necesites **abrir un archivo en ONLYOFFICE Desktop desde terminal en su propia ventana aislada**, sin que se agregue como pestaña a la instancia personal del usuario. - Como primer paso de un flujo automatizado open -> (editas el archivo en disco) -> `reload_onlyoffice_file` -> `close_onlyoffice_instance`. - Cuando quieras un slot reproducible por nombre (`instance`) que reuse la misma instancia aislada entre llamadas (reabrir rapido en vez de arrancar el motor de cero). ## Gotchas - **ONLYOFFICE Desktop es single-instance por usuario**: sin el slot aislado (HOME/XDG_RUNTIME_DIR propios), un segundo lanzamiento se reenvia a la instancia viva y abre el archivo como PESTAÑA, no ventana nueva. El lock NO se rompe con XDG_CONFIG_HOME solo; SI con HOME + XDG_RUNTIME_DIR propios. Esta funcion ya aplica esa convencion. - **NO hay reload nativo de cambios externos** (GitHub Issue #2313 abierto, no implementado). Esta funcion solo abre; para reflejar ediciones hechas en disco hay que cerrar+reabrir con `reload_onlyoffice_file`. - **NO crea archivos**: si `file_path` no existe, falla con exit 1. Crea el archivo por tu cuenta antes de llamar. - **El slot vive en /tmp**: los dirs `/tmp/oo_*` se pierden al reiniciar el PC (tmpfs en muchos sistemas). No guardes nada importante ahi; es estado desechable de la instancia aislada. - **Requiere X11 + wmctrl + xdotool**: no funciona en Wayland puro sin XWayland (xdotool no encontrara la ventana). La funcion comprueba `command -v` de las 3 deps y falla claro si falta alguna. - **El pid reportado es el del launcher** (`onlyoffice-desktopeditors`), que puede reexec/fork al proceso real `DesktopEditors`; sirve como referencia best-effort, no para `kill` fiable (usa `close_onlyoffice_instance`, que localiza el proceso real por su HOME). - **Idempotencia por basename**: si ya existe una ventana cuyo titulo contiene el basename del archivo (lo abrio el usuario en su instancia personal, por ejemplo), la funcion la considera "ya abierta" y devuelve ese wid sin relanzar. Usa un basename unico para el slot de pruebas si quieres evitar colisiones.