"키를 삼키는 이벤트 탭은 이 기계가 만드는 모든 키 입력의 톨게이트야. 그 일을 정말 맡고 싶은지 아주 확실히 해."
요구사항
Firekeeper 의 기본 활성화는 맨 Fn 홀드 야. 조합키 없이, 안 쓰는 키 하나 누르고 말하는 거. 인터랙션은 사랑스러운데 구현은 진짜 어색해. 맨 모디파이어는 평범한 단축키가 아니거든. 평범한 단축키 API 엔 'Fn 눌림' 이벤트라는 게 없어. 모디파이어는 플래그가 바뀌는 걸로 자기를 알리니까, 누르고 있는 상태를 거기서 직접 재구성해야 해.
넘어가기 쉬운 틀린 도구
뻔한 답은 CGEventTap 이야. 시스템 전역 이벤트 스트림 위에 앉아서 모든 키를 보고, 내가 가져가겠다는 건 삼켜. 되긴 돼. 그리고 그 순간 네 앱이 이 기계가 만드는 모든 키 입력의 톨게이트가 돼. 탭이 잘못 굴면 네 앱이 깨지는 게 아니야. 어디서든 타이핑 이 깨져. 가정이 아니고, 경쟁자의 삼키는 탭이 유저들 스페이스바를 먹은 게 정확히 그거였어. 그리고 권한이 경고를 안 해 줘. 키를 삼키는 탭은 삽입 때문에 이미 받아 둔 바로 그 접근성 허가로 승인되거든. 그 허가가 조용히 모든 키 입력의 길목 자리로 바뀌는 거야. (Input Monitoring 이라는 두 번째 프롬프트가 필요한 건 듣기만 하는 키보드 탭이야. 삼키는 탭은 새로 받을 게 없고, 그게 또 다른 위험이고.)
CGEventTap (거부됨): flagsChanged + keyState (선택됨):
모든 키 입력에 앉음 모디파이어 플래그 변화만 관찰
시스템 전역 억제 가능 아무 키도 못 삼킴
같은 권한, 훨씬 큰 힘 이미 가진 접근성 권한만 씀
경쟁자 게 스페이스바 먹음 가로채지 않는 걸 못 먹음
고른 길
Firekeeper 는 대신 NSEvent flagsChanged 모니터를 봐. 그리고 플래그만으로는 못 가리는 경우를 CGEventSource.keyState 로 구분해. 특히 쌍둥이 모디파이어가, 그러니까 반대쪽 Command 키 같은 게 아직 눌려 있을 때 누름과 놓음을 갈라내는 일. 앱이 삽입 때문에 이미 받아 둔 접근성 권한만으로 돌아가고, 새 권한을 하나도 안 더하고, 애초에 스트림을 안 가로채니까 구조적으로 키 입력을 삼킬 수가 없어. 같은 인터랙션인데 폭발 반경은 조각이야.