
Proč záznam obrazovky zachytává špatný monitor (a jak jsme to opravili)
Na sestavě se dvěma monitory GeekBye nahrával a snímal primární displej bez ohledu na to, na které obrazovce jste pracovali. Oprava byla jedna malá funkce — jenže její první verze byla špatná a code review odhalilo proč.
Tady je bug, který existuje jen pokud vlastníte dva monitory — proto chvíli tiše žil. Pracujete na bočním displeji, spustíte nahrávání v GeekBye a ono nahraje váš primární monitor. Ten s lištou nabídek. Ten, na který jste se nedívali.
Stejná vada, tišší a horší, zasáhla snímky, které GeekBye posílá AI jako kontext: stisknete zkratku pro snímek na druhém monitoru a AI dostane obrázek toho prvního. Není tu žádný vizuální náznak — asistent prostě odpovídá o špatné obrazovce a vy zůstanete přemýšlet, proč je zmatený. GeekBye v2.0.10 opravil obojí.
Dva pipeliny, jeden líný default
Zachytávání obrazovky na desktopu jsou dvě samostatné cesty kódu a obě si nezávisle vybraly primární displej:
- Video nahrávání vyjmenovalo dostupné screen sources a vzalo první —
sources[0]. Na macOS je to prakticky vždy hlavní displej. Žádný picker, žádná logika o tom, kde jste vlastně byli. Komentář v našem vlastním kódu doslova říkal „auto-select first screen source." - Snímky používaly macOS příkaz
screencaptures flagem-m. Ten flag má přesně jeden význam: jen hlavní displej. Napevno.
Ani jedna cesta se nikdy nezeptala na otázku, na které záleží: na které obrazovce je uživatel?
Jedna věc, která nikdy rozbitá nebyla, stojí za vyjasnění, protože lidé předpokládají, že byla: přepínání mezi macOS Spaces na stejném monitoru vždy fungovalo. Zachytávání probíhá na úrovni displeje — sebere jakýkoli Space, který je na vybraném displeji vidět. Bug nikdy nebyl o Spaces. Vždy šlo o výběr špatného fyzického displeje.
Oprava, která vypadala samozřejmě — a byla špatně
Správný signál se zdá snadný: zachyť displej, na kterém uživatel je. Naše první implementace se ukotvila na overlay okně GeekBye — zachyť displej, na kterém overlay žije.
Code review to zabilo, a správně. Overlay GeekBye se vytváří jako full-workarea okno na primárním displeji, na pozici (0,0). Na jiný monitor se přesune jen tehdy, když jeho pilulku fyzicky přetáhnete tam — a klávesové zkratky, které s ním posouvají, se omezují na rozměry primárního displeje, takže ho na druhý monitor přesunout nemohou vůbec. Ukotvení zachytávání na overlay znamenalo: pro každého uživatele, který zrovna nepřetáhl overlay na svou pracovní obrazovku, se „oprava" vyřešila přesně zpět na primární displej. Neopravila by skoro nikoho — a přitom v rychlém testu na dev stroji s jedním monitorem vypadala, jako by fungovala.
Správná kotva je kurzor. Kdekoli je vaše myš, tam je displej, na kterém pracujete — a je to správné pro každý způsob, jak zachytávání začíná: klávesová zkratka se spustí tam, kam ukazujete, a kliknutí na tlačítko Record dá váš kurzor na ten displej z definice. Finální oprava je dvouřádková funkce: displej nejblíže kurzoru. Video přiřazuje svůj capture source k id toho displeje; snímky předávají hranice toho displeje do screencapture -R (konkrétní obdélník) namísto flagu -m pro hlavní displej.
Zvolili jsme -R (explicitní obdélník v globálních souřadnicích obrazovky) místo -D (index displeje) záměrně: index displeje z operačního systému nemá zaručenou shodu s pořadím displejů ve frameworku, takže index by byl druhá hra na hádání. Obdélník ze skutečných hranic displeje je jednoznačný — a chování flagu jsme před vydáním ověřili na reálné multi-monitor sestavě, včetně záporných souřadnic pro displeje umístěné vlevo od primárního.
Proč je tohle dobrý učební bug
- „Zachyť obrazovku" skrývá rozhodnutí. Na jednom displeji žádné rozhodnutí není, takže se rozhodnutí nikdy nenavrhne — jen se nastaví na default. Multi-monitor je místo, kde vyplave každý implicitní default.
- Tiše-špatně je horší než viditelně-špatně. Video bug lidi otravoval. Bug se snímkem klamal AI, neviditelně. Když stavíte funkce, které napájejí kontext do modelu, špatný vstup produkuje sebejistě špatný výstup bez chyby kdekoli. To jsou selhání, která stojí za to lovit nejtvrději.
- Oprava, která projde na vašem stroji, může selhat na stroji všech ostatních. Verze ukotvená na overlay fungovala v testu s jedním monitorem. Celá pointa bugu je více monitorů — a recenzent uvažoval o skutečné pozici okna místo toho, aby věřil zelenému testu. Review není razítko schválení na fungujícím kódu; je to druhý model toho, proč kód funguje.
GeekBye v2.0.10 přináší opravu založenou na kurzoru jak pro nahrávání, tak pro snímky. Pokud používáte více displejů, zachytávání vás teď následuje.
Pro sousední vydání z této série viz proč váš AI zapisovatel přestane nahrávat uprostřed meetingu (v2.0.9) a proč AI přepis komolí technické termíny (v2.0.11). K tomu, jak se overlay chová během hovorů, viz jak zůstat neviditelný při sdílení obrazovky.