使用gdk_screen_get_monitor_geometry,即使有兩個或更多個顯示器用作單個屏幕,我也可以獲得每個顯示器的總面積(以像素爲單位)和相對位置。Gtk:獲取每個顯示器的可用區域(不包括面板)
但是,我想獲得每個顯示器的可用區域(即排除面板)。我唯一發現的是_NET_WORKAREA,但這是一個跨越所有顯示器的巨大區域。根據分辨率和安排,該區域內可能有面板。
我怎樣才能得到每臺顯示器的實際可用面積?理想情況下,只使用Gtk/Gdk,沒有任何X11特定的。
使用gdk_screen_get_monitor_geometry,即使有兩個或更多個顯示器用作單個屏幕,我也可以獲得每個顯示器的總面積(以像素爲單位)和相對位置。Gtk:獲取每個顯示器的可用區域(不包括面板)
但是,我想獲得每個顯示器的可用區域(即排除面板)。我唯一發現的是_NET_WORKAREA,但這是一個跨越所有顯示器的巨大區域。根據分辨率和安排,該區域內可能有面板。
我怎樣才能得到每臺顯示器的實際可用面積?理想情況下,只使用Gtk/Gdk,沒有任何X11特定的。
最後我最終直接使用了xlib,像上面提到的那樣的各種「技巧」最終在長期運行中最終失敗,而且經常出現奇怪的角落案例,從未遵循過KISS原則。
我使用的解決方案是在X-Tile代碼庫中。
以下方法有點複雜,但它是我使用的。即使在窗口映射時窗口管理器和GTK +之間存在複雜的交互時(例如,某些面板自動隱藏時),它也應該是健壯的。
其基本思想是爲每個屏幕創建一個透明的無裝飾最大化窗口,獲取它的幾何圖形(大小和位置)(例如,使用map-event
回調)並立即銷燬它們。這讓你在每個屏幕內的可用區域。然後,您可以使用現有的gdk_screen_get_monitor_geometry()
方法來確定可用區域如何在顯示器之間分割(如果有)。
詳細:
使用gdk_display_get_default()
獲取默認的顯示,那麼gdk_display_get_n_screens()
找出有多少的屏幕了。
使用gtk_window_new()
爲每個屏幕創建一個新窗口,使用gtk_window_set_screen()
將窗口移動到各自的屏幕。使用gtk_window_set_decorated(,FALSE)
對窗口進行修補,使用gtk_window_maximize(,TRUE)
將它們最大化,並使用gtk_window_set_opacity(,0.0)
使它們變爲透明。將map-event
信號連接到回調處理程序(使用g_signal_connect()
)。使用gtk_widget_show()
顯示窗口。
信號處理程序需要調用gtk_window_get_position()
和/或gtk_window_get_size()
來獲取新映射窗口的位置和/或大小,然後使用gtk_widget_destroy()
銷燬該窗口。
請注意,在實踐中,您只需要一個窗口。我會親自使用一個簡單的循環。我懷疑由於窗口管理器的怪異/錯誤,爲每個屏幕創建一個新窗口,而不是在屏幕之間移動相同的窗口更加穩健。事實證明,它也更容易,因爲您可以使用一個簡單的回調函數來獲取每個屏幕的可用區域。
就像我說的,這是相當複雜的。另一方面,標準應用程序不應該關心屏幕尺寸;它應該簡單地做用戶或窗口管理員所要求的。因此,如果沒有更好的設施來找出這些信息,我不會感到驚訝。屏幕尺寸可能隨時改變,例如,如果用戶旋轉顯示屏或更改顯示分辨率。
你介意分享解決方案嗎? – 2014-04-15 06:47:52
請閱讀帖子 - 獲取更多幫助,請點擊此處http://bit.ly/1t8MY1H – 2014-04-16 09:02:48
我得到了x-tile源代碼,我不是個假人。但是與搜索完整的源代碼相比,它更容易看到一些系統調用,而不是您認爲的? – 2014-04-16 09:20:21