# v0.1.423 — cursor 외부 마우스 차단 + ESC cascade 1개씩 (Win32 표준 보강)

- 버전: v0.1.423
- 날짜: 2026-05-26
- 다운로드: [factory00-windows-x64-v0.1.423.zip](../../downloads/factory00-windows-x64-v0.1.423.zip) (169 MB)
- 캡처: [qa-screenshots/v0.1.423/](../../qa-screenshots/v0.1.423/)

---

## 핵심 변경
### 사용자 명시 (2026-05-26)
1. ESC = "한 개씩 닫기" — cascade 1단계씩만 처리
2. "마우스 커서가 우리 프로그램 외부에 있을 경우 우리 프로그램 활성화 여부와 관계없이 마우스 입력도 막혀야한다"
3. "윈도우 프로그래밍 관련 서적이나 지식 검색하여 관련 내용 보강"
### fix
- `CameraViewController.UpdateOrbit/UpdateFirstPerson/UpdateOrtho` — `cursorInside` 가드 추가
  - RMB 회전 / wheel 줌 / MMB pan / FP 마우스 시선 모두 `cursorInside &&` 가드
  - `Input.mousePosition` Screen.width/height 범위 검증
- `Bootstrap.Update` ESC handler cascade `if + handled` → `else if` 정리
  - 한 번 ESC = 한 단계만. 재차 ESC = 다음 단계
- 룰 `focus-key-isolation.md` 보강 — Win32 표준 입력 패턴 표 + Charles Petzold/Raymond Chen 참조
### Win32 표준 vs factory00 정합
| 입력 | Windows 표준 | factory00 적용 |
|---|---|---|
| ESC | cascade 1개씩 닫기 | v0.1.423+ |
| TAB / Enter / Space | UI Toolkit 자동 처리 | 유지 |
| F1~F12 | 전역 단축키 | 유지 |
| Alt+글자 | mnemonic | 유지 |
| Ctrl+조합 | 표준 단축키 | 유지 |
| 단일 글자 | TextField focus 시 차단 | v0.1.420+ |
| 마우스 cursor 외부 | client area 안만 입력 | **v0.1.423+ cursorInside 가드** |
### Win32 vs 사용자 의도 trade-off
| 시나리오 | Win32 SetCapture default | factory00 (사용자 명시) |
|---|---|---|
| drag 시작 후 cursor 외부 | 회전 계속 | **차단** (사용자 명시 우선) |
| drag 시작 시점 cursor 외부 | 시작 불가 | 차단 |
| cursor 외부 wheel | wheel 안 발화 | 차단 안전망 |
## 영향 파일
- Assets/Scripts/Game/CameraViewController.cs L378~ + L516~ + L535~ — cursorInside 3 위치
- Assets/Scripts/Game/Factory00Bootstrap.cs L4243~ — ESC cascade else if
- .claude/rules/focus-key-isolation.md — Windows 표준 입력 패턴 표 + cursorInside 절 + ESC cascade 절 + 참고 자료
## 검증 시나리오 (사용자 PC)
1. 카메라 RMB drag 중 cursor 를 프로그램 외부로 → **회전 중단** PASS 의무
2. cursor 외부에서 wheel 굴림 → **줌 0** PASS 의무
3. TextField focus → ESC → focus 해제 (선택 유지) → ESC 다시 → 선택 해제 PASS 의무
4. ContextMenu 열림 → ESC → 메뉴만 닫힘 (선택/focus 유지) PASS 의무
## 다음 자율 큐
USS focus outline (컴포넌트별 — 모든 element *:focus 회피) + 단일 키 핸들러 (G/U/M/F/H 등) 추가 가드.
