php小編香蕉將為您介紹如何使用Go語言將背景圖像添加到X11/Wayland的多個屏幕。在多屏幕環境下,為每個屏幕設置不同的背景圖像可以提升用戶體驗。本文將詳細講解Go語言中如何使用X11和Wayland的相關庫來實現這一功能。無論您是使用X11還是Wayland,本文都將為您提供適用的解決方案。跟隨本文的步驟,您將輕松掌握如何在多屏幕環境下添加背景圖像的技巧。讓我們一起來探索吧!
問題內容
我在 Go 中為窗口管理器制作了一個自定義壁紙設置器。目前我使用github.com/xyproto/wallutils
項目,該項目又依賴于feh
。
對于一個屏幕,我可以使用其尺寸來創建精確尺寸的圖像,并且一切正常,但如果有多個不同尺寸的屏幕連接到計算機,則這種方法不起作用。
對于確切的圖像,我使用 feh 的“填充”選項,該選項僅適用于其中一臺顯示器。
我想要做的是為每個屏幕創建正確尺寸的圖像,并將它們作為背景圖像發送到 X11 或 Wayland 中的相應屏幕。我怎樣才能在 Go 中實現這一目標?
解決方法
要求:
將不同的壁紙發送到不同的顯示器
來自 go 的調用
在下面使用 feh
muro 和 wallutils
wallutils
指定 wm
接口,該接口提供 setwallpaper
方法等。對于許多不同的窗口管理器,該接口都有相應的實現。
go 包 muro
依次使用 wallutils
。基于 withanywindowmanager
標志,它將使用 wallutils 的 setwallpapercustom
方法,該方法根據檢測到的窗口管理器選擇具體的 setwallpaper
實現,或者直接調用 feh
變體的 setwallpaper
。
wallutils 和 feh
具體的顯示模式取決于它的調用方式,但是 wallutils feh.go 中的 setwallpaper
基本上會在您的情況下調用 feh
,如下所示:
feh --bg-fill
登錄后復制
兩個注意事項:
此處 feh
將所有屏幕上的壁紙設置為完全相同的圖像
因此不直接支持擁有不同的圖像
此外,wallutils 的自述文件明確指出:
為每個顯示器設置壁紙
尚不支持為每個顯示器設置壁紙。目前,所有顯示器都設置了壁紙。
參見https://github.com/xyproto/wallutils#設置每個顯示器的壁紙
可能的解決方案
由于您可以確定顯示器和分辨率,因此我們重點關注使用 feh
以正確的順序將預定義圖像作為背景圖像發送到相應的屏幕。
feh
本身支持為每個顯示器設置不同的壁紙。您只需使用具有不同分辨率的不同圖像調用 feh
即可。該順序保證與調用 xrandr --listmonitors
確定的順序相同。
確定順序并將其作為給定后,最簡單的 go 程序將如下所示(另請參閱 wallutil 的實用函數 運行):
package main import ( "os/exec" ) func main() { args := []string{"--bg-fill", "1.png", "2.png"} cmd := exec.Command("feh", args...) if _, err := cmd.CombinedOutput(); err != nil { panic(err) } }
登錄后復制
(使用 fluxbox
窗口管理器進行測試)
如果 feh
與適當的窗口管理器配合使用,并且 go 目錄中有兩個準備好的圖像,這是最簡單的情況。當然,也可以通過編程方式確定屏幕并動態調整feh
的調用。
由于 feh
并不適用于所有環境,wallutils 為許多窗口管理器環境(cinnamon、deepin、gnome、mate、pekwm、plasma、sway、weston、xfce4)提供了 wm
接口的具體實現。這當然非常酷。但是,如果您想為 wallutils 創建 mr,您可能必須在所有變體中執行此操作,至少是那些支持它的變體。