低レベルのウィンドウサーバー(CoreGraphicsPrivate.hなど)、Mac上のX11、SIMBL、その他のクレイジーなものが好きなすべての人に捧げます:)
Macには、1つのウィンドウを備えた単純なX11エミュレートされたアプリケーション(xterm、xeyesなど)があります。実行中、X11はこのエミュレートされたアプリケーションを表すネイティブQuartzウィンドウを作成します。このウィンドウには、Quartz Window Servicesからアクセスできるため、CSWindowID、タイトル、位置、サイズ、および所有者のPID(X11.appのPID)を取得できます。ただし、Accessibility APIをサポートしていないため、それを制御する方法はありません(ただし、同じプロセスのCore Graphichsプライベート関数を除く)。
さて、これがタスクです:
そのようなウィンドウで追加のNSViewをホストする(または単に何かを描画する)必要があります。X11がいくつかのアプリケーションをエミュレートした結果として表示されたネイティブQuartzウィンドウを意味します。Macでウィンドウを操作するには、同じプロセス、つまりX11.appを使用する必要があります。
X11.appプロセスに侵入するSIMBLプラグインを作成しました。
そこで[NSAppウィンドウ]を呼び出すことができますが、実際のアプリケーションのウィンドウとは何の共通点もない2つのNSWindowsを常に取得しています。それらは画面にも表示されません。
それでも、NSWindowList()を呼び出すと、必要なもの(X11ウィンドウのウィンドウID)とそれ以上(他のアプリケーションのウィンドウID)が取得されます。
X11でエミュレートされたウィンドウのCSWindowIDを取得したら、[NSApp windowWithWindowNumber:](Cocoa)とHIWindowFromCGWindowID()(Carbon)を呼び出しますが、どちらもnilを返します。まったく同じプロセスから!
ところで、Safariプロセスなどに侵入すると、このすべてのアクションが完全に機能します...
したがって、質問は次のとおりです。
X11は、まったく同じプロセスからアクセスできないようなウィンドウをどのように作成しましたか?
X11ウィンドウ(NSWindow *、CGContextRef、または少なくとも何か...)へのポインターを取得し、それらでグラフィックス(NSViewsについても話しません)をホストするにはどうすればよいですか?
よろしくお願いします!