
Γιατί η ηχογράφηση οθόνης καταγράφει τη λάθος οθόνη (και πώς το διορθώσαμε)
Σε ένα setup με δύο οθόνες, το GeekBye ηχογραφούσε και τραβούσε screenshots από την κύρια οθόνη, ανεξάρτητα από το σε ποια δούλευες. Το fix ήταν μία μικρή συνάρτηση — αλλά η πρώτη της εκδοχή ήταν λάθος, και το code review έπιασε το γιατί.
Να ένα bug που υπάρχει μόνο αν έχεις δύο οθόνες — γι'' αυτό και έζησε ήσυχα για ένα διάστημα. Δουλεύεις στην πλαϊνή σου οθόνη, ξεκινάς μια ηχογράφηση στο GeekBye, και εκείνη ηχογραφεί την κύρια σου οθόνη. Αυτή με τη γραμμή μενού. Αυτή που δεν κοιτούσες.
Το ίδιο ελάττωμα, πιο σιωπηλό και χειρότερο, χτυπούσε τα screenshots που το GeekBye στέλνει στο AI για context: πατάς το shortcut του screenshot στη δεύτερη οθόνη σου, και το AI παίρνει μια εικόνα της πρώτης. Δεν υπάρχει κανένα οπτικό σημάδι — ο assistant απλώς απαντά για τη λάθος οθόνη, και εσύ μένεις να αναρωτιέσαι γιατί είναι μπερδεμένος. Το GeekBye v2.0.10 διόρθωσε και τα δύο.
Δύο pipelines, ένα τεμπέλικο default
Η καταγραφή οθόνης στο desktop είναι δύο ξεχωριστά μονοπάτια κώδικα, και τα δύο είχαν ανεξάρτητα διαλέξει την κύρια οθόνη:
- Η ηχογράφηση video απαριθμούσε τα διαθέσιμα screen sources και έπαιρνε το πρώτο —
sources[0]. Στο macOS αυτό είναι ουσιαστικά πάντα η κύρια οθόνη. Χωρίς picker, χωρίς λογική για το πού πραγματικά βρισκόσουν. Το σχόλιο στον ίδιο μας τον κώδικα κυριολεκτικά έλεγε "auto-select first screen source." - Τα screenshots χρησιμοποιούσαν την εντολή macOS
screencaptureμε το flag-m. Αυτό το flag έχει ακριβώς μία σημασία: μόνο κύρια οθόνη. Hardcoded.
Κανένα μονοπάτι δεν έθετε ποτέ την ερώτηση που έχει σημασία: σε ποια οθόνη είναι ο χρήστης;
Ένα πράγμα που ποτέ δεν χάλασε, αξίζει να το ξεκαθαρίσουμε γιατί ο κόσμος υποθέτει ότι χάλασε: η εναλλαγή μεταξύ macOS Spaces στην ίδια οθόνη πάντα δούλευε. Η καταγραφή γίνεται σε επίπεδο οθόνης — αρπάζει όποιο Space είναι ορατό στην επιλεγμένη οθόνη. Το bug ποτέ δεν αφορούσε τα Spaces. Πάντα αφορούσε την επιλογή της λάθος φυσικής οθόνης.
Το fix που φαινόταν προφανές — και ήταν λάθος
Το σωστό σήμα φαίνεται εύκολο: κατέγραψε την οθόνη στην οποία βρίσκεται ο χρήστης. Η πρώτη μας υλοποίηση αγκυρώθηκε στο overlay παράθυρο του GeekBye — κατέγραψε όποια οθόνη φιλοξενεί το overlay.
Το code review το σκότωσε, σωστά. Το overlay του GeekBye δημιουργείται ως full-workarea παράθυρο στην κύρια οθόνη, στη θέση (0,0). Μετακινείται σε άλλη οθόνη μόνο αν σύρεις φυσικά το χάπι του εκεί — και τα shortcuts πληκτρολογίου που το σπρώχνουν γύρω γύρω περιορίζονται στις διαστάσεις της κύριας οθόνης, οπότε δεν μπορούν καθόλου να το μετακινήσουν σε δεύτερη οθόνη. Το να αγκυρώσεις την καταγραφή στο overlay σήμαινε: για κάθε χρήστη που δεν έτυχε να σύρει το overlay στην οθόνη εργασίας του, το «fix» ξαναέλυνε πίσω ακριβώς στην κύρια οθόνη. Δεν θα διόρθωνε σχεδόν κανέναν — ενώ έδειχνε, σε ένα γρήγορο test σε ένα dev μηχάνημα με μία οθόνη, σαν να δούλευε.
Η σωστή άγκυρα είναι ο δρομέας. Όπου κι αν είναι το ποντίκι σου, εκεί είναι η οθόνη στην οποία δουλεύεις — και είναι σωστό για κάθε τρόπο με τον οποίο ξεκινά μια καταγραφή: ένα shortcut πληκτρολογίου πυροδοτείται εκεί που δείχνεις, και το πάτημα του κουμπιού Record βάζει τον δρομέα σου σε εκείνη την οθόνη εξ ορισμού. Το τελικό fix είναι μια συνάρτηση δύο γραμμών: η οθόνη πλησιέστερα στον δρομέα. Το video ταιριάζει το capture source του με το id εκείνης της οθόνης· τα screenshots περνούν τα bounds εκείνης της οθόνης στο screencapture -R (ένα συγκεκριμένο ορθογώνιο) αντί για το flag -m της κύριας οθόνης.
Διαλέξαμε το -R (ένα ρητό ορθογώνιο σε γενικές συντεταγμένες οθόνης) αντί για το -D (ένα index οθόνης) σκόπιμα: το index οθόνης του λειτουργικού δεν έχει εγγυημένη αντιστοιχία με τη σειρά των οθονών του framework, οπότε ένα index θα ήταν ένα δεύτερο παιχνίδι εικασιών. Ένα ορθογώνιο από τα πραγματικά bounds της οθόνης είναι σαφές — και επαληθεύσαμε τη συμπεριφορά του flag, συμπεριλαμβανομένων αρνητικών συντεταγμένων για οθόνες τοποθετημένες αριστερά της κύριας, σε ένα πραγματικό multi-monitor rig πριν την κυκλοφορία.
Γιατί αυτό είναι ένα καλό εκπαιδευτικό bug
- Το «κατέγραψε την οθόνη» κρύβει μια απόφαση. Σε μία οθόνη δεν υπάρχει απόφαση, οπότε η απόφαση ποτέ δεν σχεδιάζεται — μπαίνει ως default. Το multi-monitor είναι εκεί όπου κάθε implicit default αναδύεται.
- Το σιωπηλά-λάθος είναι χειρότερο από το ορατά-λάθος. Το bug του video εκνεύριζε τον κόσμο. Το bug του screenshot παραπλανούσε το AI, αόρατα. Όταν χτίζεις features που τροφοδοτούν context σε ένα μοντέλο, ένα λάθος input παράγει ένα με αυτοπεποίθηση λάθος output χωρίς κανένα error πουθενά. Αυτές είναι οι αστοχίες που αξίζει να κυνηγάς πιο σκληρά.
- Ένα fix που περνά στο μηχάνημά σου μπορεί να αποτύχει σε όλων των άλλων. Η εκδοχή που ήταν αγκυρωμένη στο overlay δούλευε σε ένα test με μία οθόνη. Το όλο νόημα του bug είναι οι πολλαπλές οθόνες — και ο reviewer συλλογίστηκε την πραγματική θέση του παραθύρου αντί να εμπιστευτεί το πράσινο test. Το review δεν είναι μια σφραγίδα έγκρισης σε κώδικα που δουλεύει· είναι ένα δεύτερο μοντέλο του γιατί ο κώδικας δουλεύει.
Το GeekBye v2.0.10 κυκλοφορεί το fix που βασίζεται στον δρομέα τόσο για την ηχογράφηση όσο και για τα screenshots. Αν τρέχεις πολλαπλές οθόνες, η καταγραφή τώρα σε ακολουθεί.
Για τις γειτονικές εκδόσεις αυτής της σειράς, δες γιατί ο AI notetaker σου σταματά την ηχογράφηση στη μέση της σύσκεψης (v2.0.9) και γιατί η μεταγραφή με AI παρακούει τους τεχνικούς όρους (v2.0.11). Για το πώς συμπεριφέρεται το overlay κατά τις κλήσεις, δες πώς να μένεις αόρατος κατά το screen sharing.