Steven
Steven4 min čítania

Prečo nahrávanie obrazovky zachytáva nesprávny monitor (a ako sme to opravili)

Na zostave s dvoma monitormi GeekBye nahrával a snímal obrazovku primárneho displeja bez ohľadu na to, na ktorej obrazovke ste pracovali. Oprava sa zmestila do jednej malej funkcie — no jej prvá verzia bola nesprávna a code review zachytilo prečo.

Nahrávanie obrazovky
Viac displejov
Inžinierstvo
Vydania GeekBye
Prečo nahrávanie obrazovky zachytáva nesprávny monitor (a ako sme to opravili)

Tu je bug, ktorý existuje, iba ak vlastníte dva monitory — preto istý čas žil potichu. Pracujete na bočnom displeji, spustíte nahrávanie GeekBye a ono nahrá váš primárny monitor. Ten s panelom ponuky. Ten, na ktorý ste sa nepozerali.

Ten istý defekt, tichší a horší, zasiahol snímky obrazovky, ktoré GeekBye posiela AI ako kontext: stlačíte skratku snímky na druhom monitore a AI dostane obrázok prvého. Nie je tu žiadne vizuálne znamenie — asistent jednoducho odpovedá o zlej obrazovke a vy sa čudujete, prečo je zmätený. GeekBye v2.0.10 opravil oboje.

Dve cesty, jeden lenivý predvolený výber

Zachytávanie obrazovky na počítači sú dve samostatné cesty kódu a obe si nezávisle vybrali primárny displej:

  • Nahrávanie videa vymenovalo dostupné zdroje obrazovky a vzalo prvý — sources[0]. Na macOS je to prakticky vždy hlavný displej. Žiadny výber, žiadna logika o tom, kde ste v skutočnosti boli. Komentár v našom vlastnom kóde doslova hovoril "auto-select first screen source" (automatický výber prvého zdroja obrazovky).
  • Snímky obrazovky používali macOS príkaz screencapture s flagom -m. Tento flag má presne jeden význam: iba hlavný displej. Napevno zadrôtované.

Ani jedna cesta sa nikdy nespýtala otázku, na ktorej záleží: na ktorej obrazovke je používateľ?

Jedna vec, ktorá nikdy nebola pokazená, a stojí za vyjasnenie, lebo ľudia predpokladajú opak: prepínanie medzi priestormi (Spaces) macOS na tom istom monitore vždy fungovalo. Zachytávanie prebieha na úrovni displeja — chytí ten priestor, ktorý je viditeľný na zvolenom displeji. Bug nebol nikdy o priestoroch. Vždy bol o výbere nesprávneho fyzického displeja.

Oprava, ktorá vyzerala samozrejme — a bola nesprávna

Správny signál sa zdá jednoduchý: zachyť displej, na ktorom je používateľ. Naša prvá implementácia sa ukotvila na okne prekrytia GeekBye — zachyť ten displej, na ktorom prekrytie žije.

Code review ju správne zabilo. Prekrytie GeekBye sa vytvára ako okno na celú pracovnú plochu na primárnom displeji, v pozícii (0,0). Presunie sa na iný monitor len vtedy, ak tam jeho pilulku fyzicky pretiahnete — a klávesové skratky, ktoré ním pohýnajú, sú orezané na rozmery primárneho displeja, takže ho nemôžu presunúť na druhý monitor vôbec. Ukotvenie zachytávania na prekrytí znamenalo: pre každého používateľa, ktorý zhodou okolností neprestiahol prekrytie na svoju pracovnú obrazovku, sa „oprava" vyriešila naspäť na primárny displej. Neopravila by takmer nikoho — a pri rýchlom teste na jednomonitorovom vývojárskom stroji by vyzerala, že funguje.

Správnou kotvou je kurzor. Kdekoľvek je vaša myš, to je displej, na ktorom pracujete — a je to správne pre každý spôsob, akým sa zachytávanie začne: klávesová skratka sa spustí tam, kam ukazujete, a kliknutie na tlačidlo Nahrávať umiestni váš kurzor na ten displej z definície. Finálna oprava je dvojriadková funkcia: displej najbližší kurzoru. Video zosúladí svoj zdroj zachytenia s id toho displeja; snímky odovzdajú hranice toho displeja do screencapture -R (konkrétny obdĺžnik) namiesto flagu -m (iba hlavný displej).

Zámerne sme zvolili -R (explicitný obdĺžnik v globálnych súradniciach obrazovky) pred -D (index displeja): index displeja v OS nemá zaručenú zhodu s poradím displejov vo frameworku, takže index by bol druhá hra na hádanie. Obdĺžnik zo skutočných hraníc displeja je jednoznačný — a správanie flagu sme overili vrátane záporných súradníc pre displeje umiestnené naľavo od primárneho, na skutočnej viacmonitorovej zostave pred vydaním.

Prečo je toto dobrý učebný bug

  1. „Zachyť obrazovku" skrýva rozhodnutie. Na jednom displeji rozhodnutie neexistuje, takže rozhodnutie sa nikdy nenavrhne — nastaví sa predvolene. Viac monitorov je miesto, kde vypláva na povrch každý implicitný predvolený výber.
  2. Ticho-nesprávne je horšie než viditeľne-nesprávne. Bug s videom ľudí otravoval. Bug so snímkou zavádzal AI, neviditeľne. Keď staviate funkcie, ktoré napájajú model kontextom, nesprávny vstup vyprodukuje sebavedomo nesprávny výstup bez akejkoľvek chyby kdekoľvek. Práve tie zlyhania sa oplatí loviť najzarytejšie.
  3. Oprava, ktorá prejde na vašom stroji, môže zlyhať na každom cudzom. Verzia ukotvená na prekrytí fungovala v jednomonitorovom teste. Celý zmysel bugu sú viaceré monitory — a recenzent uvažoval o skutočnej pozícii okna namiesto toho, aby dôveroval zelenému testu. Review nie je pečiatka na fungujúcom kóde; je to druhý model toho, prečo kód funguje.

GeekBye v2.0.10 prináša opravu založenú na kurzore aj pre nahrávanie, aj pre snímky. Ak používate viac displejov, zachytávanie vás teraz nasleduje.

Susedné vydania tejto série nájdete v prečo váš AI zapisovač prestane nahrávať uprostred stretnutia (v2.0.9) a prečo AI transkripcia komolí technické termíny (v2.0.11). O tom, ako sa prekrytie správa počas hovorov, si prečítajte v ako zostať neviditeľný počas zdieľania obrazovky.