라이브 인터랙티브 통합 — 키보드 + AA + 네이티브뷰어 (진짜 Mac 창)
개요
한선씨 풀스택 메모앱(WebKit 0)을 실제 Cocoa 창(크라우니앱뷰어)에 띄워, 세 기능을
한 창에서 라이브로 실증했다: ① ADD 클릭→백엔드→재렌더, ② 둥근/그림자/AA 픽셀,
③ 입력칸 클릭→포커스→키 타이핑. 전부 진짜 윈도우서버 스크린샷으로 검증.
무엇을 했는지
1) ADD 라이브 사이클 (상태 A ≠ B)
- 앱 실행 → 메모앱 렌더 → 상태A 스크린샷(MEMO 5, 카드 5장).
- 합성 클릭(670,177, ADD 버튼) → 이벤트루프
이름=메모추가 → 메모추가 백엔드
{"ok":true,"count":6} (5→6) → 재렌더 →
상태B 스크린샷(MEMO 6, 새 6번째 카드).
- 둘 다
screencapture -l <windowid> rc=0 진짜 창 캡처. A≠B 확정.
2) AA / 둥근 / 그림자
- 코랄 ADD 버튼이 둥근 모서리 + 드롭섀도, 카드마다 그림자, 모서리 AA 그라데이션.
- 페이지렌더러 v4.1(fb_rounded_rect)로 픽셀 렌더, 창에 그대로 표시.
3) 키보드 입력 라이브
- 입력칸 클릭(320,177) → 히트맵 액션
포커스:새메모 → 이벤트루프 이름=포커스,인자=새메모.
- 뷰어가 키입력처리 호출 →
/tmp/입력상태.psv에 __포커스__|새메모 기록 → 재렌더.
코랄 포커스 테두리 표시.
- AUTOKEY로
크,라,우,니 차례 주입 → 키입력처리가 값 누적(새메모=크라우니) → 재렌더.
- 상태C2 스크린샷: 입력칸에 코랄 테두리 + "크라우니" 진회색 텍스트.
- 실제 keyDown 경로도 배선(acceptsFirstResponder + injectKey) — 떠도는 실키가
injectKey를 호출함을 로그로 확인(라이브 키 캡처 동작 증명).
핵심 발견 (재사용 함정) — NSTask 환경변수 한글 NFD 분해
- NSTask 환경변수는 NFC 한글을 NFD(자모 분해형)로 바꿔 자식 프로세스에 전달한다.
(검증: NFC
새메모=
ec8388eba994ebaaa8 입력 → 자식은
e18489e185a2... NFD 수신)
- 한선씨 소스 리터럴(
"새메모")은 NFC라, env로 전달된 NFD 값과 문자열 비교 시 불일치
→
_입력상태읽기(이름) 가 빈값 반환 → 입력칸이 힌트만 표시(타이핑 안 보임).
crownyc 자체는 NFC를 보존(env읽기/리터럴/concat/쓰기 전부 NFC 유지) — 범인은 NSTask.
해결: 한글을 env로 넘기지 말고 파일로 전달(파일 바이트는 보존됨).
뷰어 RunKeyCmd(mode,value): NFC 정규화 후 /tmp/키입력명령.txt에 FOCUS|값/KEY|값
기록, ASCII 경로만
KEYCMD_FILE env로 전달.
키입력처리.한선: KEYCMD_FILE 있으면 파일에서 모드·값 파싱(없으면 기존 env 경로 유지).
결과: 입력상태.psv가 NFC로 기록되어 입력칸이 "크라우니" 정상 렌더.부수 수정
- 스테일 캡처 방지: screencapture 직전
[view display] 강제 드로우 + AUTOKEY 렌더 후
윈도우서버 합성 시간 확보(afterClick 6.5s) → 창 스크린샷이 최종 프레임과 일치.
- AUTOSHOT_A: 클릭 전 상태A를 별도 캡처(A≠B 대조용).
관련 파일 (절대경로)
- 뷰어 소스:
/Users/ef/CrownyBrowser/native/크라우니앱뷰어.m
(AUTOSHOT_A, 포커스 클릭 분기, keyDown, AUTOKEY 주입, RunKeyCmd 파일전달, display-flush)
- 키 핸들러:
/Users/ef/CrownyBrowser/src/키입력처리.한선 (KEYCMD_FILE 파일명령 경로 추가)
- 렌더 헬퍼:
/Users/ef/CrownyBrowser/native/뷰어렌더.sh
- 빌드:
cc -O2 -fobjc-arc -framework Cocoa -o 크라우니앱뷰어 크라우니앱뷰어.m
산출물 (스크린샷)
- ADD 라이브:
/tmp/통합_A.png(MEMO 5) / /tmp/통합_B.png(MEMO 6 + 새 카드)
- 키보드 라이브:
/tmp/통합_C1.png(포커스 전 힌트) / /tmp/통합_C2.png(코랄 포커스 + "크라우니")
- 권한무관 증명(뷰 비트맵 덤프):
/tmp/통합_*_view.png
- 로그:
/tmp/통합AB.log, /tmp/통합키.log
셋 통합 작동 여부
- ① ADD 클릭 라이브: 작동 (A≠B, count 5→6, 새 카드)
- ② 둥근/그림자/AA: 작동 (창에 그대로 표시)
- ③ 키보드: 작동 (클릭→포커스 코랄테두리→타이핑 "크라우니" 표시)
- 진짜 Cocoa 창(트래픽라이트+타이틀바 "크라우니 메모 (WebKit 0 네이티브)") — WKWebView 0.
잔여 이슈
- 6번째(새로 추가된) 카드의 글리프가 CIF 캐시 미스로 빈칸(카드/그림자/MEMO 카운트는 정상).
순수 외형 문제. 데모 문자열을 캐시 보유 글자로 한정하면 해소.
- 실제 한글 keyDown은 IME 커밋 필요 — 헤드리스 데모는 AUTOKEY로 음절을 직접 커밋 주입
(IME 커밋과 동등 경로). 인터랙티브 마우스/키 경로는 동일 코드.