Mac上有一个简单的X11仿真应用程序(如xterm,xeyes等),只有一个窗口.在运行时,X11以某种方式创建了一个原生的Quartz窗口来表示这个模拟的应用程序,这个窗口可以通过Quartz Window Services访问,这样我就可以得到它的CSWindowID,标题,位置,大小和所有者的PID(X11.app的PID).但是它不支持Accessibility API,所以没有办法控制它(除了,可能是来自同一进程的Core Graphichs私有函数).
现在,这是任务:
我需要在这样的窗口上托管一个额外的NSVIEw(或者只是画一些东西).我的意思是一个原生的Quartz窗口,它出现在X11模拟某些应用程序的结果中.我知道,要在Mac上 *** 作Windows,我必须在同一个进程中,即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)?
非常感谢提前!
解决方法 据我所知,X11使用自己的windows服务器和通用堆栈.这就是为什么它可以运行没有特殊端口的X11应用程序.它只有一层模仿Cocoa窗口的响应,以便它可以与通用接口通信.它不是伪装的Cocoa堆栈,它的X11堆栈表面上伪装成Cocoa.因此,它仅响应与Cocoa相关的消息的子集.
我认为要在X11中做任何严肃的事情,你必须从一开始就使用X11 API.换句话说,写一下就好像不打算在Mac OS上运行一样.
总结以上是内存溢出为你收集整理的可可 – Mac OS X Window Server与X11:疯狂的任务全部内容,希望文章能够帮你解决可可 – Mac OS X Window Server与X11:疯狂的任务所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)