5

低レベルのウィンドウサーバー(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についても話しません)をホストするにはどうすればよいですか?


よろしくお願いします!

4

2 に答える 2

5

X11は独自のWindowsサーバーと一般的なスタックを使用していると私は理解しています。そのため、特別なポートなしでX11アプリを実行できます。

それは、一般的なインターフェースと通信できるように、Cocoaウィンドウの応答の層を模倣する応答の層のみを持っています。変装したCocoaスタックではなく、表面的にCocoaを装ったX11スタックです。そのため、Cocoa関連のメッセージのサブセットにのみ応答します。

X11で深刻なことをするためには、最初からX11APIを使用する必要があると思います。つまり、MacOS上で実行することを意図していないかのように記述します。

于 2010-06-24T14:09:03.017 に答える
5

すべてのX11.appソースおよびその他のもの(Xquartz)は、Appleの公式サイト(現在のバージョン2.3.5(サーバー85.2))で入手できます。Windows作成の中核は、xprサブディレクトリにあります。

ウィンドウを操作するために、XquartzはXpluginライブラリ(/usr/lib/libXplugin.dylib)を使用します。そのヘッダー/usr/include/Xplugin.hは、xp_create_surface()などの関数を定義し、CGSNewWindowWithOpaqueShape()などのプライベートCoreGraphicsAPIを使用してウィンドウを作成します。リバースエンジニアリングの結果である、文書化されていないCoreGraphicsPrivate.hまたはCSGPrivate.hは、Web上で見つけることができます。Xpluginは、そのようなQuartzウィンドウのIDを独自のハッシュで記憶し、不透明な整数(つまり、xp_resource_id)を返します。次に、Xquartzは特定のXIDをこのxp_resource_idに関連付け、それをクライアントに返します。

Xpluginはクローズドソースであり、xp_resource_idまたはXIDによって描画可能なネイティブQuartzを返すAPIはありません。

プライベートCoreGraphicsAPIで作成されたウィンドウを利用するには、それらのプライベートAPIを使用する必要があります。CGWindowContextCreate()という名前の関数があります。この関数は、QuartzIDによって特定のネイティブウィンドウのCGContextRefを返します。このコンテキストを使用してウィンドウに描画することができます。ただし、NULLではなく実際のコンテキストを受け取るには、ウィンドウを作成したプロセスに参加している必要があります。

于 2010-06-24T18:35:19.170 に答える