致力于所有喜欢低级Window Server(CoreGraphicsPrivate.h等)、在Mac上使用X11、SIMBL和其他疯狂东西的人们 :)
有一个简单的在Mac上模拟X11的应用程序(如xterm、xeyes等),它只有一个窗口。当运行时,X11会以某种方式创建一个本地的Quartz窗口来表示这个模拟的应用程序,并通过Quartz Window Services使得我可以获取它的CSWindowID、标题、位置、大小和所有者的PID(X11.app的PID)。但是它不支持辅助功能API,所以没有办法控制它(除了可能来自同一进程的Core Graphics私有函数)。
现在,任务来了:
我需要在这样一个窗口上托管一个额外的NSView(或者只是绘制一些东西)。我的意思是一个本地的Quartz窗口,它出现是因为X11模拟了某个应用程序。我知道,在Mac上操作窗口必须在同一个进程中,即X11.app。
我写了一个SIMBL插件,侵入了X11.app进程。
在那里,我可以调用[NSApp windows],但每次都只能得到两个与真实应用程序窗口没有任何关系的NSWindows。它们甚至在屏幕上也看不见。
尽管如此,当我调用NSWindowList()时,我得到了任何我需要的东西(X11窗口的窗口ID),甚至更多(来自其他应用程序的窗口ID)。
当我得到了X11模拟窗口的CSWindowIDs时,我调用[Cocoa]的[NSApp windowWithWindowNumber: ]和[Carbon]的HIWindowFromCGWindowID(),但它们都返回nil!来自同一进程!
顺便说一下,当我侵入Safari进程和其他进程时,所有这些操作都能完美地工作...
那么,问题来了:
1. X11是如何创建这样的窗口,以至于从同一个进程中无法访问它们?
2. 我该如何获取指向X11窗口的指针(NSWindow*、CGContextRef或者至少是任何东西...)并将我的图形(我甚至不谈论NSViews)托管在它们上面?
非常感谢您的帮助!
有一个简单的在Mac上模拟X11的应用程序(如xterm、xeyes等),它只有一个窗口。当运行时,X11会以某种方式创建一个本地的Quartz窗口来表示这个模拟的应用程序,并通过Quartz Window Services使得我可以获取它的CSWindowID、标题、位置、大小和所有者的PID(X11.app的PID)。但是它不支持辅助功能API,所以没有办法控制它(除了可能来自同一进程的Core Graphics私有函数)。
现在,任务来了:
我需要在这样一个窗口上托管一个额外的NSView(或者只是绘制一些东西)。我的意思是一个本地的Quartz窗口,它出现是因为X11模拟了某个应用程序。我知道,在Mac上操作窗口必须在同一个进程中,即X11.app。
我写了一个SIMBL插件,侵入了X11.app进程。
在那里,我可以调用[NSApp windows],但每次都只能得到两个与真实应用程序窗口没有任何关系的NSWindows。它们甚至在屏幕上也看不见。
尽管如此,当我调用NSWindowList()时,我得到了任何我需要的东西(X11窗口的窗口ID),甚至更多(来自其他应用程序的窗口ID)。
当我得到了X11模拟窗口的CSWindowIDs时,我调用[Cocoa]的[NSApp windowWithWindowNumber: ]和[Carbon]的HIWindowFromCGWindowID(),但它们都返回nil!来自同一进程!
顺便说一下,当我侵入Safari进程和其他进程时,所有这些操作都能完美地工作...
那么,问题来了:
1. X11是如何创建这样的窗口,以至于从同一个进程中无法访问它们?
2. 我该如何获取指向X11窗口的指针(NSWindow*、CGContextRef或者至少是任何东西...)并将我的图形(我甚至不谈论NSViews)托管在它们上面?
非常感谢您的帮助!