2010-04-08 14 views
7

使用gdk_screen_get_monitor_geometry,即使有兩個或更多個顯示器用作單個屏幕,我也可以獲得每個顯示器的總面積(以像素爲單位)和相對位置。Gtk:獲取每個顯示器的可用區域(不包括面板)

但是,我想獲得每個顯示器的可用區域(即排除面板)。我唯一發現的是_NET_WORKAREA,但這是一個跨越所有顯示器的巨大區域。根據分辨率和安排,該區域內可能有面板。

我怎樣才能得到每臺顯示器的實際可用面積?理想情況下,只使用Gtk/Gdk,沒有任何X11特定的。

回答

1

最後我最終直接使用了xlib,像上面提到的那樣的各種「技巧」最終在長期運行中最終失敗,而且經常出現奇怪的角落案例,從未遵循過KISS原則。

我使用的解決方案是在X-Tile代碼庫中。

+1

你介意分享解決方案嗎? – 2014-04-15 06:47:52

+0

請閱讀帖子 - 獲取更多幫助,請點擊此處http://bit.ly/1t8MY1H – 2014-04-16 09:02:48

+1

我得到了x-tile源代碼,我不是個假人。但是與搜索完整的源代碼相比,它更容易看到一些系統調用,而不是您認爲的? – 2014-04-16 09:20:21

1

以下方法有點複雜,但它是我使用的。即使在窗口映射時窗口管理器和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()銷燬該窗口。

請注意,在實踐中,您只需要一個窗口。我會親自使用一個簡單的循環。我懷疑由於窗口管理器的怪異/錯誤,爲每個屏幕創建一個新窗口,而不是在屏幕之間移動相同的窗口更加穩健。事實證明,它也更容易,因爲您可以使用一個簡單的回調函數來獲取每個屏幕的可用區域。

就像我說的,這是相當複雜的。另一方面,標準應用程序不應該關心屏幕尺寸;它應該簡單地做用戶或窗口管理員所要求的。因此,如果沒有更好的設施來找出這些信息,我不會感到驚訝。屏幕尺寸可能隨時改變,例如,如果用戶旋轉顯示屏或更改顯示分辨率。

+0

這是非常聰明的,但我想知道是否可能有一種方法*同步*,即而不需要允許事件循環循環。 – zwol 2012-06-24 17:40:01

+0

請記住,並非所有桌面都是合成的,因此不透明度設置可能成爲無操作。 – ssokolow 2012-06-24 23:31:52

+0

@Zack:如果你不想循環使用_current_應用程序的事件循環,請fork一個子進程,並讓它通過一個管道作爲文本返回區域。 – 2012-06-26 13:26:17

相關問題