Skip to content

feat: cycle same-app windows on repeated app shortcuts #40

Description

@woosublee

User problem

한 앱의 여러 창을 쓰는 사용자는 Zap으로 앱을 연 뒤 별도 shortcut으로 원하는 창을 다시 찾아야 한다. 현재 app launcher는 실행 중인 앱을 activate할 뿐이고 AX service는 frontmost window 하나만 노출하므로, repeated app shortcut을 같은 앱의 일반 창 사이를 순환하는 안전한 동작으로 연결할 기반이 없다.

Product value

브라우저, 터미널, Finder 등 같은 앱의 여러 창을 별도 단축키 없이 순환한다. 다만 첫 버전의 product contract는 R-31의 Finder 예외를 그대로 보존하므로 실제 Cycle Windows 적용 대상은 eligible non-Finder app이며, AX를 신뢰할 수 없는 모든 경우에는 기존 activation/reopen 동작으로 안전하게 돌아간다.

Scope

  • R-31의 When the target app is already frontmost option에 Cycle Windows를 추가한다.
  • eligible non-Finder app의 일반 top-level window만 current Space에서 열거하고 예측 가능한 MRU 순서를 유지해 repeated shortcut마다 다음 window에 focus를 이동한다.
  • R-06의 window-scoped session identity를 사용해 서로 다른 window를 구분하고 닫히거나 재생성된 window를 다른 window로 오인하지 않는다.
  • Accessibility 권한 부재, window enumeration/read/focus 실패, eligible window 부재, 안정적으로 고를 수 없는 상태에서는 cycle 시도를 중단하고 R-31 이전의 기존 app activation 동작으로 fallback한다.
  • Finder는 R-31이 정한 repeated-action exclusion을 상속해 Cycle Windows 선택과 무관하게 기존 reopen behavior를 사용한다.

Acceptance criteria

  • repeated action option에 Cycle Windows를 추가한다.
  • 일반 top-level window만 예측 가능한 MRU 순서로 순환한다.
  • sheet와 system dialog를 제외한다.
  • 첫 버전은 current Space의 window부터 지원한다.
  • Accessibility가 없거나 조회가 실패하면 기존 activate 동작으로 fallback한다.
  • Screen Recording 권한을 요구하지 않는다.
  • 같은 eligible app window가 둘 이상이면 repeated shortcut마다 current MRU position의 다음 window를 focus하고, 마지막 window 다음에는 첫 window로 순환한다.
  • window가 닫히거나 새로 생기면 다음 입력 시 현재 eligible set과 MRU를 다시 평가하며 stale session identity를 다른 window에 적용하지 않는다.
  • Accessibility가 미승인, AX enumeration 실패, AX focus 실패, eligible window 0개, 또는 안전한 next window를 결정할 수 없는 경우 사용자 window/history를 변경하지 않고 기존 app activation을 정확히 한 번 수행한다.
  • Finder shortcut은 Cycle Windows가 선택되어 있어도 AX cycle 경로에 들어가지 않고 R-31의 기존 Finder reopen behavior를 유지한다.
  • Activate onlyHide app 선택의 R-31 behavior는 이 option 추가로 바뀌지 않는다.

Dependencies

External prerequisites

  • Zap에 대한 macOS Accessibility authorization. 미승인 또는 실행 중 revoke는 기능 실패가 아니라 기존 activate 동작으로 fallback하는 조건이다.

Non-goals

  • Finder는 R-31 repeated-action policy에서 제외되므로 첫 버전의 Finder window cycling을 구현하지 않는다.
  • 다른 Space의 window, minimized window 복구 정책, sheet, system dialog, 비표준 window까지 cycle 범위를 확장하지 않는다.
  • Screen Recording permission, window thumbnail, switcher overlay 또는 AltTab 수준의 window switcher UI를 추가하지 않는다.
  • R-06의 transactional per-window undo/redo semantics를 변경하거나 cycle focus 자체를 window-move history에 기록하지 않는다.

Evidence

  • 현재 app launcher는 실행 중인 앱을 찾으면 activate만 수행하고 same-app window를 열거하거나 focus하지 않는다: AppLauncher.swift lines 36–49.
  • 현재 Accessibility contract는 frontmost window의 조회·frame read·frame write만 제공해 same-app window enumeration이 없다: AccessibilityWindowService.swift lines 68–72.
  • AltTab의 공식 product page는 macOS window enumeration/switching의 인접 product evidence이며, 이 Issue는 overlay·thumbnail 없이 repeated shortcut의 bounded current-Space cycle만 다룬다: AltTab.

Milestone exit-gate impact

  • 앱 shortcut 반복으로 현재 앱을 숨기거나 같은 앱의 원하는 창까지 이동할 수 있다. 이 Issue는 R-31이 제공한 opt-in repeated-action setting에 safe same-app window cycling을 완성한다.
  • 기존 사용자 동작은 opt-in 전까지 바뀌지 않는다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:accessibilityAccessibility 권한, AX API, 보조 기술area:app-launchingDock, Finder, Manual 앱 실행과 전환enhancementNew feature or requestpriority:P1핵심 사용자 흐름의 정확성, 복구, 높은 가치 작업roadmap승인된 Zap 제품 roadmap 항목status:blocked명시적 dependency가 완료되지 않은 작업

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions