CGSClearWindowTags( )関数を使うと setIgnoresMouseEvents: の問題が解決できるらしい(掲示板:196)。
CGSClearWindowTags( )を調べてみると、これはプライベート関数らしい(またか。。)。
CocoaDev: CoreGraphicsPrivate
Fixing an annoying Exposé bug with NSWindows を参考にサンプルを作ってみた。
サンプル:TransparentWindow-2.zip
追加コードはこんな感じ。
typedef int CGSConnection;
typedef int CGSWindow;
typedef enum {
CGSTagNone = 0, // No tags
CGSTagExposeFade = 0x0002, // Fade out when Expose activates.
CGSTagNoShadow = 0x0008, // No window shadow.
CGSTagTransparent = 0x0200, // Transparent to mouse clicks.
CGSTagSticky = 0x0800, // Appears on all workspaces.
} CGSWindowTag;
extern CGSConnection _CGSDefaultConnection(void);
extern CGError CGSClearWindowTags(const CGSConnection cid, const CGSWindow wid, CGSWindowTag *tags, int thirtyTwo);
@implementation TransparentWindow
- (void)clearWindowTag
{
CGSConnection connectionID = _CGSDefaultConnection();
CGSWindow winNumber = [self windowNumber];
CGSWindowTag tags[2] = {0x0200, 0};
CGSClearWindowTags(connectionID, winNumber, tags, 32);
}
上記 clearWindowTag を setIgnoresMouseEvents:YES の後に呼出してみた。
[self setIgnoresMouseEvents:YES];
[self clearWindowTag];
すると赤枠がイベントを拾い、それ以外の透明部分はイベントを拾わなくなった。
おお。いい感じだ。
だがマウスカーソルに続いてまたしてもプライベート関数か。うーむ。
- - - -
その他参考情報
Cocoa Wiki >> Expse しないウィンドウ