ページ

2008年11月6日木曜日

透明なウィンドウ(2)非公開関数

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

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 しないウィンドウ