使用FireBreath中的浏览器窗口识别显示器



我正在使用FireBreath创建一个跨浏览器插件,该插件利用了各自平台的一些本地库(一些适用于Windows的基于.NET的DLL和适用于Mac的基于Objective-C的dylibs/框架)。本机库显示UI屏幕。为了提高可用性,如果用户有多/扩展监视器设置,我希望本地UI显示在当前浏览器窗口所在的屏幕上。

如果可以检索到带有浏览器窗口的监视器的标识符,则可以将其传递给本地组件,这些组件可以配置为在该监视器上显示其UI。我使用了FireBreath的getWindowPosition()方法来获取插件的直角坐标,并使用该信息来识别Windows平台中正确的监视器。

然而,无论浏览器窗口当前所在的监视器如何,Mac中返回的坐标似乎总是0(或1)。我知道我们必须配置一个事件模型和一个绘图模型才能在Mac中工作。我尝试过以下活动/绘画模型组合,但没有取得多大成功。

1) Cocoa/CoreGraphics2) Carbon/CoreGraphics

我们非常感谢在这方面提供的任何帮助。此外,如果还有其他方法可以实现这一点,请分享。我想要实现的是识别Mac中当前活动浏览器窗口所在的监视器。在这一点上我不确定,但也许可以在Objective-C级别上实现这一点(在FireBreath级别上没有任何更改)。另外请注意,我想支持Safari、Firefox和Chrome浏览器。

你不会喜欢这个答案,但简单地说,你在Mac上无法做到这一点。问题是,使用CoreGraphics时,您只能使用CGContextRef,而它不知道它将绘制在哪里。从技术上讲,在旧的浏览器中,通过利用一些内部实现细节来获得NSWindow是可能的,但在许多浏览器中,这已经不可能了,也从未得到支持。

其他绘图模型相同;CoreAnimation你有一个CALayer,但它不知道它被绘制到哪个屏幕或监视器。我个人认为这也有点烦人,但我不知道有什么方法可以找出你的插件被渲染到哪个监视器,特别是因为大多数插件实际上都将缓冲区复制到其他地方,并在不同的过程中渲染。

我确实想出了一个解决方法,我只是在这里回复线程的完整性。正如@taxilian所解释的,使用窗口引用检索插件坐标是不可能的。作为一种替代方法,Javascript"Window"对象有两个名为"screenX"one_answers"screenY"的属性,它们返回浏览器窗口相对于屏幕的X和Y坐标。如果用户具有扩展监视器设置,则这些是相对于整个扩展屏幕的绝对坐标。我们可以使用这些值来确定浏览器窗口的监视器(如果X坐标在主监视器宽度的边界之外,则浏览器基本上应该在扩展监视器上)。我们可以从Firebreath检索DOM属性,如下链接所述:

http://www.firebreath.org/display/documentation/Invoking+methods+on+the+DOM

相关内容

  • 没有找到相关文章

最新更新