献给所有喜欢低级 Window Server(CoreGraphicsPrivate.h 等)、Mac 上的 X11、SIMBL 和其他疯狂东西的人 :)
Mac 上有一个简单的 X11 模拟应用程序(如 xterm、xeyes 等),只有一个窗口。在运行时,X11 以某种方式创建了一个原生 Quartz 窗口来表示这个模拟的应用程序,并且这个窗口可以通过 Quartz Window Services 访问,这样我就可以获得它的 CSWindowID、标题、位置、大小和所有者的 PID(X11.app 的 PID)。但它不支持 Accessibility API,因此无法控制它(除了,可能来自同一进程的 Core Graphichs 私有函数)。
现在,这是任务:
我需要在这样的窗口上托管一个额外的 NSView (或只是绘制一些东西)。我的意思是一个原生 Quartz 窗口,它是 X11 模拟某些应用程序的结果。我知道,要在 Mac 上操作窗口,我必须在同一个进程中,即 X11.app。
我写了一个 SIMBL 插件,它侵入了 X11.app 进程。
在那里我可以调用 [NSApp windows],但我总是得到 2 个 NSWindows,它们与实际应用程序的窗口没有任何共同之处。它们甚至在屏幕上都不可见。
然而,当我调用 NSWindowList() 时,我得到了我需要的任何东西(X11 窗口的窗口 ID)甚至更多(来自其他应用程序的窗口 ID)。
当我获得 X11 模拟窗口的 CSWindowID 时,我调用 [NSApp windowWithWindowNumber: ] (Cocoa) 和 HIWindowFromCGWindowID() (Carbon),但它们都返回 nil!来自同一个过程!
顺便说一句,当我侵入 Safari 进程和其他进程时,所有这些操作都能完美运行......
所以,问题是:
X11 是如何创建无法从同一个进程访问的窗口的?
如何获得指向 X11 窗口(NSWindow *、CGContextRef 或至少是任何东西......)的指针并在它们上面托管我的图形(我什至不谈论 NSView)?
提前非常感谢!