gpt4 book ai didi

cocoa - Mac OS X Window Server 与 X11 : the insane task

转载 作者:行者123 更新时间:2023-12-03 16:10:26 25 4
gpt4 key购买 nike

献给所有喜欢低级 Window Server(CoreGraphicsPrivate.h 等)、Mac 上的 X11、SIMBL 和其他疯狂东西的人:)

Mac 上有一个简单的 X11 模拟应用程序(如 xterm、xeyes 等),只有一个窗口。运行时,X11 以某种方式创建一个 native Quartz 窗口来表示这个模拟应用程序,并且可以通过 Quartz Window Services 访问该窗口,以便我可以获得它的 CSWindowID、标题、位置、大小和所有者的 PID(X11.app 的 PID)。但它不支持 Accessibility API,因此无法控制它(除了,可能来自同一进程的 Core Graphichs 私有(private)函数)。

<小时/>

现在,任务如下:

我需要在这样的窗口上托管一个额外的 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,或者至少任何东西...)的指针并在其上托管我的图形(我什至不谈论 NSViews)?

<小时/>

提前非常感谢!

最佳答案

据我了解,X11 使用自己的 Windows 服务器和通用堆栈。这就是为什么它无需特殊端口即可运行 X11 应用程序。

它只有一层模仿 Cocoa windows 的响应层,以便它可以与通用接口(interface)进行通信。它不是伪装的 Cocoa 堆栈,而是表面上伪装成 Cocoa 的 X11 堆栈。因此,它只响应 Cocoa 相关消息的子集。

我认为要在 X11 中做任何严肃的事情,你必须从一开始就使用 X11 API。换句话说,编写时就好像它不打算在 Mac OS 上运行一样。

关于cocoa - Mac OS X Window Server 与 X11 : the insane task,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3110067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com