最後の Application。スクリーンをまたがったキャプチャはOKだが、背景オプション有効時に片方のスクリーンしか背景が出ないという問題があった。
背景はウィンドウの一つとして管理されていて、1スクリーン毎に1ウィンドウが用意されている。実際に WindowListで見てみると、2スクリーンの場合、2つの Desktop/WindowServerが存在する。
SimpleCapではこの1つのDesktop(背景)しか考慮していなかった為にマルチスクリーン利用時に1つのスクリーンでしか背景画像が出てこなかった。これを複数のDesktopに対応できるようにする。
以前使っていたメソッドを切り出し専用のクラスを用意して、ここで背景画像を管理させる。
DesktopWindow.h
@interface DesktopWindow : NSObject {
NSMutableArray* _id_list;
}
+ (DesktopWindow*)sharedDesktopWindow;
- (NSArray*)CGWindowIDlist;
- (void)update;
@end
DesktopWindowクラスはシングルトンパターンで使う。#CGWindowIDlistで背景ウィンドウのCGWindowIDのリストを取得できる。これをキャプチャ対象のウィンドウリストへ加えてやれば良い。CGWindowは unsigned int なので NSNumberへ入れてから NSMutableArrayへ格納する。
DesktopWindow.m
static DesktopWindow* _desktop_window = nil;
+ (DesktopWindow*)sharedDesktopWindow
{
if (!_desktop_window) {
_desktop_window = [[DesktopWindow alloc] init];
[_desktop_window update];
}
return _desktop_window;
}
- (void) dealloc
{
[_id_list release];
[super dealloc];
}
- (void)update
{
CFArrayRef ar = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
CFDictionaryRef window;
CFIndex i;
CGWindowID wid;
[_id_list release];
_id_list = [[NSMutableArray alloc] init];
for (i=0; i < window =" CFArrayGetValueAtIndex(ar," name =" (NSString*)CFDictionaryGetValue(window," owner_name =" (NSString*)CFDictionaryGetValue(window,"
背景ウィンドウのCGWindowIDは変わらないので初期化時に一度だけリストを作成する。ただしスクリーンが増減する場合を想定して以前の対応と同様に通知をハンドリングしておく。
+ (DesktopWindow*)sharedDesktopWindow
{
if (!_desktop_window) {
_desktop_window = [[DesktopWindow alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:_desktop_window
selector:@selector(screenChanged:)
name:NSApplicationDidChangeScreenParametersNotification
object:nil];
[_desktop_window update];
}
return _desktop_window;
}
- (void)screenChanged:(NSNotification *)notification
{
[self update];
}
さて実際にキャプチャしてみよう。
良い感じだ。マルチスクリーン下でのアプリケーションキャプチャも上記で対応することができた。
- - - -
これですべてのキャプチャ方式がマルチスクリーン対応となった。
ずっと残っていた案件が片づいてちょっとうれしい。