[英]How to add a background images to several screens for X11/Wayland using Go?
我在 Go 中為窗口管理器制作了一個自定義牆紙設置器。 目前我使用github.com/xyproto/wallutils
項目,它又依賴於feh
。
對於一個屏幕,我可以使用它的尺寸來創建精確尺寸的圖像,並且一切正常,但如果有多個不同尺寸的屏幕連接到計算機,這種方法就不起作用了。
對於准確的圖像,我使用feh 的“填充”選項,該選項僅適用於其中一台顯示器。
我想要做的是為每個屏幕創建正確尺寸的圖像,並將它們作為背景圖像發送到 X11 或 Wayland 中的相應屏幕。 我怎樣才能在圍棋中實現這一點?
要求:
feh
muro 和 wallutils
wallutils
指定一個WM
接口,該接口提供SetWallpaper
方法等。 對於許多不同的窗口管理器,這個接口都有相應的實現。
Go 包muro
反過來使用wallutils
。 基於WithAnyWindowManager
標志,它將使用 wallutils 的SetWallpaperCustom
方法,該方法根據檢測到的窗口管理器選擇具體的SetWallpaper
實現,或者直接調用feh
變體的SetWallpaper
。
wallutils 和 feh
具體顯示模式取決於它的調用方式,但是SetWallpaper
中的 SetWallpaper 基本上會在您的情況下調用feh
,如下所示:
feh --bg-fill <image file name>
兩個注意事項:
feh
將所有屏幕上的牆紙設置為完全相同的圖像此外,wallutils 的自述文件明確指出:
為每台顯示器設置壁紙
目前還不支持為每個顯示器設置壁紙。 目前,為所有顯示器設置了壁紙。
請參閱https://github.com/xyproto/wallutils#setting-a-wallpaper-per-monitor
可能的解決方案
由於您可以確定顯示器和分辨率,因此我們專注於在使用feh
的情況下以正確的順序將預定義圖像作為背景圖像發送到適當的屏幕。
feh
本身支持為每個顯示器設置不同的壁紙。 您只需使用具有不同分辨率的不同圖像調用feh
。 該順序保證與調用xrandr --listmonitors
所確定的順序相同。
在確定順序並將其作為給定之后,最簡單的 GO 程序可能看起來像這樣(另請參閱 wallutil 的實用函數run ):
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,您可能必須在所有變體中這樣做,至少是那些支持它的變體。
您可能會考慮vbsw/xlib
,其中包括:
XOpenDisplay()
,它返回一個 Display ( C.Display
)XScreenCount
,用於“屏幕”的數量XScreenOfDisplay
獲取給定“屏幕編號”的屏幕XWidthOfScreen
XHeightOfScreen
這是從 C 實現“獲取所有 Xorg 顯示的列表”中獲得靈感的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.