|
|
このテクニカルノートでは、QuickTime 6.1 および QuickTime 6.3 のリリースで QuickTime Full Screen API に加えられた変更点について説明します。
[2003 年 6 月 19 日]
|
はじめに
QuickTime Full Screen API は、 BeginFullScreen と EndFullScreen の 2 つの関数呼び出しから構成されています。 QuickTime 6.1 のリリースに伴い、BeginFullScreen のパフォーマンス向上のための改良がなされ(QuickTime のフルスクリーンモードの切り替えが高速になりました)、Mac OS X Aqua ヒューマンインタフェースガイドラインに完全に準拠するようになりました。
このテクニカルノートでは、フルスクリーンモードを開始するときに使用可能な、新しい 3 つのフラグについてと、QuickTime 6.1 と QuickTime 6.3 とで、BeginFullScreen から返されるフルスクリーンのブランクウインドウの CoreGraphics WindowLevel を設定する方法の違いについて説明します。
// 指定されたグラフィックスデバイスのフルスクリーンモードを開始
OSErr BeginFullScreen(Ptr *restoreState,
GDHandle whichGD,
short *desiredWidth,
short *desiredHeight,
WindowRef *newWindow,
RGBColor *eraseColor,
long flags);
|
// グラフィックスデバイスのフルスクリーンモードを終了
OSErr EndFullScreen(Ptr fullState,
long flags);
|
これらの API の使い方についての詳細は、QuickTime Full Screen API Reference を参照してください。
先頭に戻る
新しいフルスクリーンフラグ
BeginFullScreen は、フルスクリーンモードの特定の側面をコントロールするいくつかのフラグを受け付けます。 QuickTime 6.1 がリリースされてから、これらの新しいフラグが使用可能になりました。 これらのオプションによって、アプリケーションのパフォーマンスが向上し、ディスプレイキャプチャも可能になります。
// QuickTime 6.1 の新機能
enum {
fullScreenDontSwitchMonitorResolution = 1L << 4,
fullScreenCaptureDisplay = 1 << 5L, /* mac os x のみ */
fullScreenCaptureAllDisplays = 1 << 6L /* mac os x のみ */
};
|
-
fullScreenDontSwitchMonitorResolution - このフラグを使用すると、モニタの解像度を変更せずにフルスクリーンモードを開始できます。
以前は、 BeginFullScreen を呼び出し、 desiredWidth パラメータと desiredHeight パラメータに 0 を渡すと同じ効果が得られましたが、このフラグを使って、有効な幅と高さを渡せるようになりました。 これを渡すと、 BeginFullScreen は予測されるモニタ解像度を変更せず 、要求された幅と高さに合わせるために切り替えるはずの 幅と高さを( desiredWidth パラメータと desiredHeight パラメータに)返します。 これは、実際にはアプリケーションはモニタ解像度を切り替えていないのに、あたかも切り替えたかのように、ブランクウインドウのコンテンツのサイズを変更したい場合に効果を発揮します。
このフラグを使用すると、デスクトップのアイコンとその他のアプリケーションのウインドウを適切な場所に保ちながら、解像度の切り替えを高速に処理できます。
-
fullScreenCaptureDisplay - このフラグを使用すると、CGDirect Display を使用して、フルスクリーンに使用されているディスプレイを、QuickTime がキャプチャします。 ディスプレイをキャプチャすると、他のアプリケーションやシステムサービスとの、スクリーンの競合を回避できます。 見た目には違いはありませんが、Command + Tab キーがブロックされます。
-
fullScreenCaptureAllDisplays - このフラグは fullScreenCaptureDisplay フラグに似てますが、描画先のディスプレイだけでなく、システムに接続しているすべてのディスプレイをブランクにします。 見た目には、iTunes がフルスクリーンのビジュアライゼーションモードに切り替わる際の表示に似ています。
先頭に戻る
ウインドウレベル
アプリケーションのフルスクリーンモードは、「特殊モード」であると見みなされます。 iTunes のフルスクリーンのエフェクトビジュアライザや iPhoto のフルスクリーンのスライドショーがその例です。 「特殊モード」では、そのアプリケーションがフルスクリーンモードになっている間は、他のアプリケーションのウインドウは前面に表示されなくなります。 フルスクリーンモードに入ると、そのアプリケーションは基本的に「単一ウインドウ」のアプリケーションになります。
Mac OS X では、フルスクリーンアプリケーションの適切なウインドウレベルは、ScreenSaver レベルです。 このウインドウレベルは、関数 CGWindowLevelForKey(kCGScreenSaverWindowLevelKey) を使用してキー値を返す kCGScreenSaverWindowLevel として定義されます。 詳細については、 CGWindowLevel.h を参照してください。
低いレベルのウインドウを、それよりも高いレベルのウインドウの前面に配置することはできませんが、同じレベルのウインドウは、相互に相対的な順序になります。
ウインドウレベルを変更する機能が追加されたことにより、QuickTime はある種の面倒な問題の発生を防止できるようになりました。
1 つの問題は、特定の「フローティングウインドウ」アプリケーションに関連するものです。 このアプリケーションは、常にデフォルトウインドウレベルの上に描画されるため、他のすべてのウインドウよりも前面に浮かせることができます。 Clock.app がこのアプリケーションの例です。 問題は、こうしたアプリケーションはフルスクリーンムービーの上に描画できるということです。 これはユーザーにとっては理想的ではありません。
フルスクリーンのブランクウインドウのウインドウレベルを変更すると、このような問題を防ぐことができます。
先頭に戻る
QuickTime 6.3
QuickTime 6.3 では、デベロッパは、fullScreenCaptureDisplay フラグまたは fullScreenCaptureAllDisplays フラグを使うことによって、上記のウインドウレベルの変更を選択できます。
ウインドウレベルをデフォルトレベルからフルスクリーンモードに適した ScreenSaver レベルに変更するには、この 2 つの QuickTime のフラグのどちらかを設定する必要があります。
フルスクリーンモードで単一ウインドウのアプリケーションにせずに、6.1 以前の動作を維持したい場合は、fullScreenCaptureDisplay フラグと fullScreenCaptureAllDisplays フラグは使用しないでください。
先頭に戻る
QuickTime 6.1
QuickTime 6.1 は、デフォルトでは、フルスクリーンのブランクウインドウのウインドウレベルを、デフォルトレベルから格上げし、フルスクリーンモードに適した ScreenSaver レベルに変更します。
これによって、デフォルトではウインドウレベルを変更しないものと期待しているいくつかのサードパーティ製アプリケーションが影響を受けることがあります。
BeginFullScreen は、描画対象でありムービーなどの表示先である、ブランクウインドウにデベロッパがアクセスできるようにすることを意図していました。
従来の Mac OS には、ウインドウサーバによって維持される明確なウインドウレベルの概念がなかったため、BeginFullScreen を呼び出し、新しい Carbon スタイルのウインドウを作成した後、 ShowWindow を呼び出すことによってブランクウインドウの最前面にこれらのウインドウを表示できることを認識していたデベロッパは、少数でした。
この手法は、技術的には Full Screen API の間違った使用法ではありませんが、この方法でウインドウを表示できるかどうかは、従来の Mac OS の個々の動作に依存します。QuickTime 6.3 はこの動作を維持しているため、デベロッパは新しい機能を選択できますが、QuickTime 6.1 は維持していません。
小さな修正
|
注: この修正は、QuickTime 6.1 がインストールされている Mac OS X システムにのみ影響します。アプリケーションが、QuickTime 6 以上を想定しており、Full Screen API を使用している場合は、この修正を組み入れる必要があります。
|
アプリケーションが QuickTime 6.1 でのデフォルトのウインドウレベルの変更の影響を受けた場合は、リスト 1 に示すように、 BeginFullScreen を呼び出した後で SetWindowGroup の呼び出しを追加することで、以前の動作を取り戻すことができます。
SetWindowGroup を呼び出すと、(ウインドウがグループ内にすでにある場合は)古いグループからウインドウが取り出され、新しいグループに割り当てられます。 リスト 1 のケースでは、 kDocumentWindowClass として定義されているドキュメントクラスのウインドウを含むグループが、新しいグループです。
各ウインドウグループはウインドウレイヤ階層のレイヤに関連付けられているため、この呼び出しによって効果的に、ブランクウインドウのレイヤはドキュメントウインドウレイヤに変更されます。 またこの呼び出しで、新しい Carbon ウインドウを、ブランクウインドウの上に配置することができます。
|
リスト 1. QuickTime 6.1 以前の動作の複製
Ptr
BeginFullScreenWithFix(short *width, short *height,
WindowRef *outBlankingWindow,
long inFlags)
{
OSErr err;
Ptr theRestoreState = NULL;
err = BeginFullScreen(&theRestoreState,
NULL, // メインスクリーン
width, height,
outBlankingWindow,
NULL, // ブラック
inFlags);
if (err) { outBlankingWindow = NULL; goto bail; }
// restore old behavior
SetWindowGroup(outBlankingWindow,
GetWindowGroupOfClass(kDocumentWindowClass));
bail:
return theRestoreState;
}
|
|
先頭に戻る
参考資料
Using Full Screen
Full Screen Flag
CGDirectDisplay API
先頭に戻る
先頭に戻る
|