SpinWin: ScreenCaptureKit을 통한 macOS 윈도우 시각적 회전

SpinWin: ScreenCaptureKit을 통한 macOS 윈도우 시각적 회전

SpinWin은 macOS에서 시각적 윈도우 회전을 가능하게 합니다

SpinWin은 사용자가 어떤 애플리케이션 윈도든 90도 단위 증가, 임의 각도, 또는 연속 회전과 같은 어떤 각도로도 시각적으로 회전하거나 스핀할 수 있게 하는 macOS 메뉴 바 유틸리티입니다. macOS는 다른 애플리케이션의 윈도우를 회전시키는 공개 API를 제공하지 않기 때문에, SpinWin은 윈도우의 시각적 버퍼를 캡처하고 변형된 오버레이 윈도우 내에서 렌더링함으로써 이 효과를 달성합니다.

기술적 구현: 캡처와 오버레이를 통한 회전 시뮬레이션

SpinWin은 macOS에서 공개 회전 API가 부족한 것을 세 단계 과정을 구현하여 윈도우 회전을 시뮬레이션함으로써 우회합니다.

  1. 오프스크린 위치 지정: 애플리케이션은 Accessibility API를 사용하여 선택된 대상 윈도우를 화면 밖으로 이동시킵니다. 윈도우는 활성 상태를 유지하고 계속 렌더링하므로, 사용자에게 보이지 않더라도 캡처할 수 있습니다.
  2. 연속 캡처: ScreenCaptureKit (SCStreamdesktopIndependentWindow 필터)를 사용하여 SpinWin은 윈도우의 내용을 지속적으로 캡처합니다. 이 방법은 특정 윈도우의 버퍼만 캡처하도록 보장하여 오버레이가 자신을 반사하는 것을 방지합니다.
  3. 레이어 변환: 캡처된 프레임은 투명하고 테두리가 없는 오버레이 윈도우에 그려집니다. 이 윈도우는 원래 윈도우가 있던 위치에 배치되고 CALayer 변형을 사용하여 회전됩니다. 오버레이는 클리핑을 방지하기 위해 회전된 내용의 경계 상자에 맞게 자동으로 크기가 조정되며, 연속 회전 중에는 대각선 크기의 정사각형이 사용됩니다.

운영 요구 사항 및 권한

SpinWin이 작동하려면 두 가지 특정 macOS 시스템 권한이 필요합니다:

  • 스크린 녹화: ScreenCaptureKit을 통해 윈도우 내용을 캡처하는 데 필요합니다.
  • 접근성: 소스 윈도우를 화면 밖으로 이동시키고 회전이 중지될 때 원래 위치로 복원하는 데 필요합니다.

현재 기술적 제한 사항

SpinWin은 시각적 시뮬레이션이며, macOS API 제약으로 인해 몇 가지 내재된 제한 사항이 있습니다:

  • 비대화형 오버레이: 오버레이는 라이브 시각 피드이며, 상호작용을 지원하지 않습니다. 클릭과 키스트로크는 숨겨진 소스 윈도우로 전달될 수 없습니다.
  • 미션 컨트롤과 익스포제 누출: 숨겨진 윈도우는 화면 밖에 주차된 실제 윈도우이므로, 미션 컨트롤과 익스포제에서 회전되지 않은 상태로 여전히 보입니다. 이 뷰에서 특정 윈도우를 제외시키는 공개 API는 없으며, 이를 최소화하면 캡처 프로세스가 중단됩니다.
  • 렌더링 스로틀링: 일부 애플리케이션은 윈도우가 화면 밖으로 이동될 때 렌더링을 스로틀링할 수 있으며, 이로 인해 캡처된 피드의 프레임 속도가 감소할 수 있습니다.
  • 크기 조정 시 정적 발자국: 소스 윈도우가 회전 중에 자체 크기를 조정하면, 오버레이는 원래 발자국을 유지합니다. 캡처는 회전이 중지되고 다시 시작될 때까지 레터박스 형태가 됩니다.

프로젝트 아키텍처

SpinWin 코드베이스는 여러 전문화된 구성 요소로 구성되어 있습니다:

구성 요소 책임
main.swift 앱 진입점 및 메뉴 바 정책
AppDelegate.swift 메뉴 바 항목 및 상호작용 로직 관리
Permissions.swift 스크린 녹화 및 접근성 요청 처리
WindowPicker.swift 전체 화면 윈도우 선택 및 회전 옵션 제공
RotationManager.swift 윈도우당 활성 회전 세션 추적
RotationSession.swift 숨기기-캡처-오버레이 워크플로 오케스트레이션
CaptureEngine.swift ScreenCaptureKit 스트림 및 IOSurface 프레임 관리
OverlayWindow.swift 투명 회전 오버레이 및 드래그 처리
AccessibilityWindowMover.swift 소스 윈도우를 화면 밖으로 이동시키고 복원 관리

커뮤니티 관점

사용자들은 이 도구가 주로 новизной(신기함)이지만, 캔버스 회전을 일반적으로 허용하는 그리기 앱과 같은 특정 애플리케이션에 유용할 수 있다고 언급했습니다. 한 개발자는 초기 리눅스 데스크톱 환경의 '흔들리는 윈도우'와 유사성을 지적했습니다:

이는 리눅스에서 흔들리는 윈도우가 큰 인기를 끌던 때를 떠올리게 합니다. 그때는 순수한 재미였는데, 이번에는 다시 재미있어 보이는군요.

Sources