← 목록
기타 2026-06-28 5KB 읽기 4분

라이브 인터랙티브 통합 — 키보드 + 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/키입력명령.txtFOCUS|값/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 커밋과 동등 경로). 인터랙티브 마우스/키 경로는 동일 코드.