C.W.K.
Stream
Lesson 01 of 05 · published

타깃을 먼저 스냅샷해

~11 min · target-capture, accessibility, wrong-app-guard, focus

Level 0불씨 없음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"단어를 가질 즈음이면, 커서가 옮겨갔을 수 있어. 그러니 어디 있었는지 기억해."

멈춤 전에 잡아

삽입의 첫 일은 단어 하나 전사되기 전에 일어나. 단축키가 눌리는 순간 — 오버레이가 뜨기 — Firekeeper 가 타깃을 스냅샷해: 최전면 앱의 번들 id 와 프로세스 id, 포커스된 접근성 요소, 선택된 텍스트와 범위(있으면), 그리고 타깃 분류(브라우저, 에디터, 터미널, 채팅, 이메일, 비밀번호 필드, 미상). 오버레이는 일부러 비활성화(non-activating) 라, 그걸 보여줘도 타이핑하려던 필드에서 포커스를 안 훔쳐.

스냅샷이 중요한 이유

단축키-누름과 삽입 사이엔 초가 지나 — STT 돌고, 정리 돌고. 그 창에서 포커스가 흘러갈 수 있어: 다른 창을 보고, 앱이 다이얼로그를 띄우고, 알림이 포커스를 훔쳐. 삽입이 그냥 '지금 최전면인 뭐든' 에 타이핑하면, 받아쓰기가 완전 엉뚱한 앱에 떨어질 수 있어 — 최악은 올릴 생각 없던 채팅에 게시. 스냅샷이 고정 타깃이야: 포커스가 방황한 곳이 아니라 말하기 시작했을 때 있던 앱에 삽입.

단축키 누름  -> 스냅샷 { app, pid, element, selection, category }
  ... STT ... 정리 ...   (여기서 포커스 흘러갈 수 있음!)
삽입         -> 최전면 앱이 아직 snapshot.app 인가?
                 예   -> 잡은 타깃에 삽입
                 아니오 -> 엉뚱한 앱에 타이핑 말고; 클립보드 + 알림

엉뚱-앱 가드

가드는 엄격한 결과가 있는 단순 비교야. 삽입 시점에, 최전면 앱이 아직 스냅샷과 맞는지 확인해. 바뀌었으면, Firekeeper 가 붙여넣기를 거부해 — 대신 텍스트를 클립보드에 복사하고 알려줘. '맞는 앱에 삽입하거나 삽입 안 함' 이 규칙; 엉뚱한 앱에 타이핑하는 건 아예 안 타이핑하는 것보다 나빠, 항상 수동으로 붙여넣을 수 있지만 게시한 메시지는 못 무르니까. 이 한 비교가 받아쓰기 앱이 가질 수 있는 제일 소름 끼치는 실패를 막아.

액션을 찾은 타깃이 아니라 잡은 타깃에 묶어. 의도와 효과 사이에 지연이 있는 연산은 의도-시점에 타깃을 기억하고 효과-시점에 검증해야 해. 효과-시점 세상의 현재 상태는 네가 실제 의도한 상태의 안전한 대체가 아냐 — 특히 라이브 앱에 텍스트 게시처럼 효과가 되돌릴 수 없을 때.
보안 텍스트 필드를 절대 읽지 마. 스냅샷의 일부는 포커스된 요소가 보안/비밀번호 필드인지 감지하는 거야. 그러면 Firekeeper 가 거기서 맥락을 안 읽고 출입 금지로 다뤄. 비밀번호 필드를 들여다보는 보이스 도구는 재앙일 거야; 캡처 단계가 그 경계를 처음 강제하는 곳이야.

Code

단축키-누름에 잡는 타깃 스냅샷·swift
struct TargetSnapshot {
    let appBundleID: String
    let pid: pid_t
    let focusedElement: AXUIElement?
    let selection: String?
    let category: TargetCategory   // browser / editor / terminal / chat / secure / unknown
    let isSecureField: Bool
}

// 삽입 시점에, 세상이 우리 밑에서 안 바뀌었는지 검증.
func canInsert(into snapshot: TargetSnapshot) -> Bool {
    guard let front = NSWorkspace.shared.frontmostApplication else { return false }
    return front.bundleIdentifier == snapshot.appBundleID   // 엉뚱-앱 가드
}
// 이게 false 면: 클립보드 + 알림, 엉뚱한 앱에 절대 붙여넣기 안 함.

External links

Exercise

시작할 때와 효과가 날 때 사이 간격이 있는 앱의 연산을 묘사해(예약 전송, 지연 붙여넣기, 백그라운드 업로드). 효과-시점에 '시작-시점에 잡은 타깃' 대신 '현재 타깃' 을 쓰면 뭐가 잘못될까? 막을 가드를 스케치해.
Hint
실패는 늘: 간격 동안 세상이 바뀌었고, 효과가 엉뚱한 데 떨어졌어. 가드는: 의도한 타깃을 미리 잡고, 효과-시점에 현재 타깃을 잡은 것과 비교 — 다르면, 엉뚱한 타깃에 작동하는 대신 거부하고 안전한 폴백을 드러내.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.