所有喜欢低级别窗口服务器(CoreGraphicsPrivate.h等)、Mac上的X11、SIMBL和其他疯狂的东西的人:)
Mac上有一个简单的X11模拟应用程序(如xterm、xeyes等),只有一个窗口。在运行过程中,X11以某种方式创建了一个本机Quartz窗口来表示这个模拟应用程序,并且这个窗口可以通过Quartz window服务访问,这样我就可以获得它的CSWindowID、标题、位置、大小和所有者PID (PID为X11.app)。但是它不支持可访问性API,因此无法控制它(除了来自同一进程的Core Graphichs私有函数)。
现在,我们的任务是:
我需要在这样的窗口上托管一个额外的NSView (或者只是画一些东西)。我指的是一个本机Quartz窗口,它是X11模拟某些应用程序的结果。我知道,要在Mac上操作windows,我必须处于相同的过程中,即X11.app。
我编写了一个SIMBL插件,它侵入了X11应用程序进程。
在那里,我可以调用NSApp窗口,但是一直以来,我都得到了与实际应用程序窗口没有任何共同之处的2 NSWindows。它们甚至在屏幕上都看不见。
然而,当我调用NSWindowList()时,我得到了我需要的任何东西( X11窗口的窗口I),甚至更多的东西(来自其他应用程序的窗口I)。
当我获得X11模拟窗口的CSWindowID时,我调用NSApp windowWithWindowNumber:和HIWindowFromCGWindowID() (碳),但它们都返回零!从同样的过程!
顺便说一句,当我侵入Safari过程和其他过程时,所有这些动作都能完美地工作.
因此,问题是:
提前谢谢!
发布于 2010-06-24 18:35:19
所有的X11应用程序源代码和其他东西(X石英)都可以在苹果官方网站上使用(当前版本为2.3.5 (服务器85.2))。windows创建的核心在于xpr子目录。
要操作windows,X石英使用Xplugin库(/usr/lib/libXplugin.dylib)。它的头文件/usr/include/Xplugin.h定义了像xp_create_surface()等函数,这些函数使用私有CoreGraphics API创建窗口,比如CGSNewWindowWithOpaqueShape()。无文档的CoreGraphicsPrivate.h或CSGPrivate.h是逆向工程的结果,可以找到通过网络。Xplugin在自己的散列中记住这种Quartz窗口的ids,并为它们返回一个不透明的整数(即xp_resource_id)。然后,X石英将特定的XID与此xp_resource_id关联起来,并将其返回给客户端。
Xplugin是封闭源,没有API返回xp_resource_id或XID可绘制的本机Quartz。
为了使用使用私有CoreGraphics API创建的窗口,您必须使用这些私有API。有一个名为CGWindowContextCreate()的函数,它通过Quartz id返回特定本机窗口的CGContextRef。可以使用此上下文在窗口上进行绘图。但是要接收真正的上下文而不是NULL,您必须处于创建窗口的进程中。
发布于 2010-06-24 14:09:03
据我理解,X11使用自己的windows服务器和通用堆栈。这就是为什么它可以在没有特殊端口的情况下运行X11应用程序。
它只有一个类似Cocoa窗口的响应层,这样它就可以与通用接口进行通信。它不是伪装的可可堆栈,而是表面上伪装成可可的X11堆栈。因此,它只响应Cocoa相关消息的一个子集。
我认为要在X11中做任何严肃的事情,必须从一开始就使用X11 API。换句话说,写起来就像它不打算运行在Mac之上一样。
https://stackoverflow.com/questions/3110067
复制相似问题