2013-08-16 31 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