2013-08-16 40 views
1

我使用FireBreath创建一个跨浏览器插件,它利用了各自平台的一些本地库(用于Windows和Objective-C的一些基于.NET的DLL基于dylibs /框架苹果电脑)。本地库显示UI屏幕。为了提高可用性,如果用户有多重/扩展显示器设置,我希望原生用户界面显示在浏览器窗口当前所在的同一屏幕上。确定显示器与FireBreath浏览器窗口

如果一个标识符与浏览器窗口中的监视器可以被检索,可传递至其可以被配置为在该显示器上显示其用户界面的天然组分。我使用FireBreath的getWindowPosition()方法获取插件的矩形坐标,并使用该信息在Windows平台中识别正确的显示器。

然而,在Mac的返回的坐标似乎总是0(或1),不考虑显示器的在其上的浏览器窗口当前所在。我知道我们必须配置一个事件模型和一个绘图模型才能在Mac中使用。我尝试过以下事件/绘图模型组合,但没有取得太多成功。

1)可可/ CoreGraphics中 2)碳/ CoreGraphics中

在这方面的任何帮助是非常赞赏。如果还有其他方法可以实现,请分享。我想要实现的是识别当前活动浏览器窗口驻留在Mac上的显示器。我不确定这一点,但可以在Objective-C级别实现此目标(FireBreath级别没有任何更改)。另请注意,我想支持Safari,Firefox和Chrome浏览器。

回答

1

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

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

+0

感谢您的信息。我确实想出了一个解决方法,下面将对此进行解释。 –

1

我还是设法拿出一个解决办法,我只是在这里回答为主题的完整性。正如@taxilian解释的那样,使用窗口引用无法检索插件坐标。作为一种替代方法,Javascript'Window'对象具有2个属性,称为'screenX'和'screenY',它们返回浏览器窗口相对于屏幕的X和Y坐标。如果用户具有扩展监视器设置,则这些是相对于完整扩展屏幕的绝对坐标。我们可以使用这些值通过浏览器窗口确定显示器(如果X坐标不在主显示器宽度范围内,那么浏览器本质上应该位于扩展显示器上)。我们可以从Firebreath检索DOM属性,如下面的链接解释说:

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

+0

好戏!我们必须记住那一个 – taxilian