簡體   English   中英

如何使用 Go 為 X11/Wayland 的多個屏幕添加背景圖像?

[英]How to add a background images to several screens for X11/Wayland using Go?

我在 Go 中為窗口管理器制作了一個自定義牆紙設置器。 目前我使用github.com/xyproto/wallutils項目,它又依賴於feh

對於一個屏幕,我可以使用它的尺寸來創建精確尺寸的圖像,並且一切正常,但如果有多個不同尺寸的屏幕連接到計算機,這種方法就不起作用了。

對於准確的圖像,我使用feh 的“填充”選項,該選項僅適用於其中一台顯示器。

我想要做的是為每個屏幕創建正確尺寸的圖像,並將它們作為背景圖像發送到 X11 或 Wayland 中的相應屏幕。 我怎樣才能在圍棋中實現這一點?

要求:

  • 將不同的壁紙發送到不同的顯示器
  • 從 Go 調用
  • 在下面使用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 ,其中包括:

這是從 C 實現“獲取所有 Xorg 顯示的列表”中獲得靈感的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM