SpinWin: ScreenCaptureKitを使用したmacOSウィンドウの視覚的回転

SpinWin: ScreenCaptureKitを使用したmacOSウィンドウの視覚的回転

SpinWinは、ウィンドウの内容をキャプチャし、変換されたオーバーレイにレンダリングすることで、ScreenCaptureKitを使用して任意のアプリケーションウィンドウを視覚的に回転またはスピンさせるmacOSメニューバーユーティリティです。

SpinWinはmacOSでウィンドウの視覚的回転を可能にします

SpinWinは、90度 increments、任意の角度、または連続スピンを含む任意の角度で、どのアプリケーションウィンドウでも視覚的に回転またはスピンさせることができるmacOSメニューバーユーティリティです。macOSは他のアプリケーションのウィンドウを回転させるための公開APIを提供していないため、SpinWinはウィンドウの視覚バッファをキャプチャし、変換されたオーバーレイウィンドウ内にレンダリングすることでこの効果を達成します。

技術的実装: キャプチャとオーバーレイによる回転の偽装

SpinWinは、macOSにおける公開回転APIの欠如を回避し、ウィンドウの回転をシミュレートする3段階のプロセスを実装することでこれを達成します:

  1. オフスクリーンポジショニング: アプリケーションはAccessibility APIを使用して、選択されたターゲットウィンドウをオフスクリーンに移動します。ウィンドウはアクティブな状態を保ち続けてレンダリングを行い、ユーザーには見えなくてもキャプチャすることができます。
  2. 連続キャプチャ: ScreenCaptureKit (SCStreamdesktopIndependentWindow フィルタ) を使用して、SpinWinはウィンドウの内容を連続してキャプチャします。この方法により、特定のウィンドウのバッファのみがキャプチャされ、オーバーレイが自身をミラーすることを防ぎます。
  3. レイヤー変換: キャプチャされたフレームは、透明で枠線のないオーバーレイウィンドウに描画されます。このウィンドウは元のウィンドウがあった位置に配置され、CALayer トランスフォームを使用して回転されます。オーバーレイはクリッピングを防ぐために回転されたコンテンツの境界ボックスに自動的にサイズ調整され、連続スピン中には対角線サイズの正方形が使用されます。

動作要件と権限

SpinWinが機能するためには、以下の2つの特定のmacOSシステム権限が必要です:

  • スクリーンレコーディング: ScreenCaptureKitを介してウィンドウの内容をキャプチャするために必要です。
  • アクセシビリティ: ソースウィンドウをオフスクリーンに移動し、回転が停止されたときに元の位置に戻すために必要です。

現在の技術的制限事項

SpinWinは視覚的シミュレーションであり、macOS APIの制約によりいくつかの固有の制限があります:

  • 非インタラクティブオーバーレイ: オーバーレイはライブの視覚フィードであり、インタラクティビティをサポートしません。クリックやキーストロークは隠されたソースウィンドウに渡すことができません。
  • Mission ControlとExposéの漏洩: 隠されたウィンドウはオフスクリーンに駐車された実際のウィンドウであるため、Mission ControlとExposé内で未回転の状態で表示され続けます。ウィンドウを最小化せずにこれらのビューから特定のウィンドウを除外する公開APIはなく、最小化するとキャプチャプロセスが停止します。
  • レンダリングのスロットリング: 一部のアプリケーションは、ウィンドウがオフスクリーンに移動されたときにレンダリングをスロットリングする可能性があり、これによりキャプチャフィードのフレームレートが低下する可能性があります。
  • リサイズ時の静的フットプリント: ソースウィンドウが回転中にサイズを変更した場合、オーバーレイは元のフットプリントを維持します。キャプチャはレターボックス形式になり、回転が停止されて再開されるまで続きます。

プロジェクトアーキテクチャ

SpinWinのコードベースは、いくつかの専門的なコンポーネントに編成されています:

Component Responsibility
main.swift アプリのエントリポイントとメニューバーポリシー
AppDelegate.swift メニューバーアイテムとインタラクションロジックを管理
Permissions.swift スクリーンレコーディングとアクセシビリティのリクエストを処理
WindowPicker.swift フルスクリーンウィンドウの選択と回転オプションを提供
RotationManager.swift ウィンドウごとのアクティブな回転セッションを追跡
RotationSession.swift 隠す-キャプチャ-オーバーレイワークフローをオーケストレート
CaptureEngine.swift ScreenCaptureKit ストリームと IOSurface フレームを管理
OverlayWindow.swift 透明な回転オーバーレイとドラッグを処理
AccessibilityWindowMover.swift ソースウィンドウをオフスクリーンに移動し、元に戻す管理

コミュニティの視点

ユーザーは、このツールが主に novelty であることを指摘していますが、キャンバスの回転を通常許可する描画アプリなど、特定のアプリケーションに役立つ可能性があると述べています。ある開発者は、初期のLinuxデスクトップ環境の「wobbly windows」との類似性に言及しました:

これは、Linuxでwobbly windowsが大きな話題だった頃を思い出させます。当時は素朴な楽しさでしたが、これでまた楽しくなりそうです。

Sources