diff --git a/tools/portal-probe/portal-probe.c b/tools/portal-probe/portal-probe.c index 3fc08c96..7dbb080f 100644 --- a/tools/portal-probe/portal-probe.c +++ b/tools/portal-probe/portal-probe.c @@ -26,10 +26,19 @@ * el path para recién ahí hacer `AddMatch`, el portal puede haber emitido ya la señal y se pierde * para siempre. Es una carrera real, no teórica. * - * Uso: portal-probe screencast [--multiple] [--window] + * Uso: portal-probe screencast [--multiple] [--window] [--wait N] * portal-probe filechooser [--save] - * portal-probe screenshot + * portal-probe screenshot [--wait N] * portal-probe version (qué interfaces sirve el portal, y en qué versión) + * + * `--wait N` (por defecto 60s) es el plazo de los pasos que ABREN UN SELECTOR y por lo tanto + * esperan a una PERSONA: el `Start` de ScreenCast y el `Screenshot` interactivo. Medido en metal + * el 2026-08-06: con 60s clavados la sonda se rinde antes de que nadie llegue a elegir pantalla, y + * el informe sale «el portal aceptó la llamada y no contestó» — que se lee como un fallo del portal + * cuando en realidad la cadena está esperando un clic. Es el mismo error de método que ya nos costó + * tres diagnósticos falsos: medir contra el reloj en vez de contra el hecho. Aquí el hecho depende + * de un humano, así que el reloj tiene que ser AJUSTABLE — no adivinado. + * Los otros plazos (CreateSession/SelectSources) siguen en 15s a propósito: ésos no piden a nadie. */ #include @@ -232,6 +241,9 @@ static void probe_version(DBusConnection *bus, const char *iface) dbus_message_unref(r); } +/* Plazo de los pasos que esperan a una PERSONA (ver cabecera). Ajustable con --wait N. */ +static int g_wait_s = 60; + /* ── ScreenCast: el handshake de CUATRO pasos ─────────────────────────────────────────────────── */ static int do_screencast(DBusConnection *bus, int multiple, int window) @@ -297,7 +309,7 @@ static int do_screencast(DBusConnection *bus, int multiple, int window) dbus_message_iter_close_container(&it, &arr); if (!call_request(bus, m, "Start")) return 1; } - if (wait_response(bus, path, 60, NULL, 0) != 0) return 1; + if (wait_response(bus, path, g_wait_s, NULL, 0) != 0) return 1; /* 4. OpenPipeWireRemote — devuelve un FD, no un path. Es la prueba final de que hay demonio: * sin pipewire corriendo, el backend no tiene remoto que abrir. */ @@ -387,7 +399,7 @@ static int do_screenshot(DBusConnection *bus) opt_bool(&arr, "interactive", FALSE); dbus_message_iter_close_container(&it, &arr); if (!call_request(bus, m, "Screenshot")) return 1; - return wait_response(bus, path, 60, NULL, 0) == 0 ? 0 : 1; + return wait_response(bus, path, g_wait_s, NULL, 0) == 0 ? 0 : 1; } int main(int argc, char **argv) @@ -398,6 +410,7 @@ int main(int argc, char **argv) if (!strcmp(argv[i], "--multiple")) multiple = 1; else if (!strcmp(argv[i], "--window")) window = 1; else if (!strcmp(argv[i], "--save")) save = 1; + else if (!strcmp(argv[i], "--wait") && i + 1 < argc) g_wait_s = atoi(argv[++i]); } DBusError err; dbus_error_init(&err); @@ -455,7 +468,7 @@ int main(int argc, char **argv) else if (!strcmp(cmd, "filechooser")) rc = do_filechooser(bus, save); else if (!strcmp(cmd, "screenshot")) rc = do_screenshot(bus); else { - fprintf(stderr, "uso: portal-probe {version|screencast|filechooser|screenshot} [--multiple|--window|--save]\n"); + fprintf(stderr, "uso: portal-probe {version|screencast|filechooser|screenshot} [--multiple|--window|--save] [--wait N]\n"); rc = 2; } printf("\n== portal-probe %s: %s ==\n", cmd, rc == 0 ? "OK" : "FALLÓ");