"단어를 손에 쥘 즈음이면 커서가 옮겨갔을 수 있어. 그러니 어디 있었는지 기억해 둬."
멈춤 전에 잡아
삽입이 하는 첫 일은 단어가 한 글자도 전사되기 전에 벌어져. 단축키가 눌리는 순간, 오버레이가 뜨기 전에, Firekeeper 가 타깃을 스냅샷해. 최전면 앱의 번들 id 와 프로세스 id, 포커스된 접근성 요소, 선택된 텍스트와 범위, 그리고 타깃이 뭔지 분류한 값까지. 브라우저인지 에디터인지 터미널인지 채팅인지 이메일인지 비밀번호 필드인지, 아니면 모르겠는지. 오버레이는 일부러 비활성화(non-activating) 로 만들었어. 그래야 오버레이를 띄워도 타이핑하려던 필드에서 포커스를 안 빼앗아.
스냅샷이 중요한 이유
단축키를 누른 시점과 삽입 시점 사이엔 초 단위 시간이 흘러. STT 가 돌고 정리가 도니까. 그 창에서 포커스는 얼마든지 흘러갈 수 있어. 다른 창을 보거나, 앱이 다이얼로그를 띄우거나, 알림이 포커스를 채가거나. 삽입이 '지금 최전면인 아무 데나' 타이핑해 버리면 받아쓴 내용이 완전히 엉뚱한 앱에 떨어질 수 있어. 최악은 올릴 생각도 없던 채팅에 그대로 올라가는 거고. 스냅샷이 그래서 고정된 타깃이야. 포커스가 흘러간 곳이 아니라, 말하기 시작했을 때 있던 그 앱에 넣는 거지.
단축키 누름 -> 스냅샷 { app, pid, element, selection, category }
... STT ... 정리 ... (여기서 포커스 흘러갈 수 있음!)
삽입 -> 최전면 앱이 아직 snapshot.app 인가?
예 -> 잡은 타깃에 삽입
아니오 -> 엉뚱한 앱에 타이핑 말고; 클립보드 + 알림
엉뚱한 앱 가드
가드 자체는 단순한 비교야. 결과가 엄격할 뿐이지. 삽입할 때 최전면 앱이 아직 스냅샷과 맞는지 확인해. 바뀌었으면 Firekeeper 는 붙여넣기를 거부하고, 대신 텍스트를 클립보드에 복사한 다음 알려줘. 규칙은 하나야. 맞는 앱에 넣거나, 아예 안 넣거나. 엉뚱한 앱에 타이핑하는 게 아예 안 하는 것보다 나빠. 손으로 붙여넣는 거야 언제든 되지만 이미 보낸 메시지는 못 무르니까. 이 비교 하나가 받아쓰기 앱이 저지를 수 있는 제일 소름 끼치는 실패를 막아.