Maison >développement back-end >Golang >Comment ajouter une image d'arrière-plan à plusieurs écrans dans X11/Wayland à l'aide de Go ?

Comment ajouter une image d'arrière-plan à plusieurs écrans dans X11/Wayland à l'aide de Go ?

王林
王林avant
2024-02-13 08:54:09841parcourir

如何使用 Go 将背景图像添加到 X11/Wayland 的多个屏幕?

L'éditeur php Banana vous présentera comment utiliser le langage Go pour ajouter des images d'arrière-plan à plusieurs écrans de X11/Wayland. Dans un environnement multi-écran, la définition d'une image d'arrière-plan différente pour chaque écran peut améliorer l'expérience utilisateur. Cet article expliquera en détail comment utiliser les bibliothèques liées à X11 et Wayland pour implémenter cette fonction dans le langage Go. Que vous utilisiez X11 ou Wayland, cet article vous fournira des solutions applicables. En suivant les étapes de cet article, vous apprendrez facilement comment ajouter une image d'arrière-plan dans un environnement multi-écran. Explorons ensemble !

Contenu de la question

J'ai créé un poseur de fond d'écran personnalisé dans Go pour un gestionnaire de fenêtres. Actuellement, j'utilise github.com/xyproto/wallutils项目,该项目又依赖于feh.

Pour un écran, je peux utiliser ses dimensions pour créer une image de taille exacte et tout fonctionne bien, mais s'il y a plusieurs écrans de tailles différentes connectés à l'ordinateur, cette méthode ne fonctionne pas.

Pour l'image exacte, j'ai utilisé l'option "fill" de feh, qui ne fonctionne que sur l'un des moniteurs.

Ce que je veux faire, c'est créer des images de taille correcte pour chaque écran et les envoyer comme images d'arrière-plan aux écrans correspondants dans X11 ou Wayland. Comment puis-je y parvenir dans Go ?

Solution

Exigences :

  • Envoyez différents fonds d'écran à différents moniteurs
  • Appel depuis Go
  • Utilisez feh
  • ci-dessous

muro et wallutils

wallutils 指定 wm 接口,该接口提供 setwallpaper Méthodes, etc. Il existe des implémentations de cette interface pour de nombreux gestionnaires de fenêtres différents.

Le package go muro utilise à son tour wallutils. Basé sur l'indicateur withanywindowmanager, il utilisera la méthode setwallpapercustom de wallutils, qui sélectionne une implémentation setwallpaper spécifique en fonction du gestionnaire de fenêtres détecté, ou appellera directement la muro 依次使用 wallutils。基于 withanywindowmanager 标志,它将使用 wallutils 的 setwallpapercustom 方法,该方法根据检测到的窗口管理器选择具体的 setwallpaper 实现,或者直接调用 feh 变体的 setwallpaper variante de setwallpaper.

wallutils et feh

Le mode d'affichage exact dépend de la façon dont il est appelé, mais setwallpaper dans wallutils feh.go appellera essentiellement setwallpaper 基本上会在您的情况下调用 feh dans votre cas, comme ceci :

feh --bg-fill <image file name>

Deux choses à noter :

  • Ici feh Définissez le fond d'écran sur tous les écrans sur exactement la même image
  • Par conséquent, il n'y a pas de support direct pour avoir des images différentes

De plus, le fichier readme de wallutils indique clairement :

Définir un fond d'écran pour chaque moniteur

La définition de fonds d'écran pour chaque moniteur n'est pas encore prise en charge. Actuellement, tous les moniteurs ont des fonds d’écran définis.

Voir https://github.com/xyproto/wallutils#Définir un fond d'écran pour chaque moniteur

Solutions possibles

Puisque vous pouvez déterminer l'affichage et la résolution, nous nous sommes concentrés sur l'utilisation de feh pour envoyer des images prédéfinies comme images d'arrière-plan aux écrans correspondants dans le bon ordre.

feh本身支持为每个显示器设置不同的壁纸。您只需使用具有不同分辨率的不同图像调用 feh 即可。该顺序保证与调用 xrandr --listmonitorsPrend en charge nativement la définition de différents fonds d'écran pour chaque affichage. Vous appelez simplement

avec différentes images avec différentes résolutions. L'ordre est garanti être le même que celui déterminé en appelant xrandr --listmonitors.

Avec l'ordre déterminé et pris comme acquis, le programme go le plus simple ressemblerait à ceci (voir aussi la fonction utilitaire de 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 (testé avec

gestionnaire de fenêtres)

feh 与适当的窗口管理器配合使用,并且 go 目录中有两个准备好的图像,这是最简单的情况。当然,也可以通过编程方式确定屏幕并动态调整fehC'est le cas le plus simple si

est utilisé avec un gestionnaire de fenêtres approprié et qu'il y a deux images préparées dans le répertoire go. Bien entendu, il est également possible de déterminer par programme l'écran et d'ajuster dynamiquement l'appel vers

. feh 并不适用于所有环境,wallutils 为许多窗口管理器环境(cinnamon、deepin、gnome、mate、pekwm、plasma、sway、weston、xfce4)提供了 wm

Puisque 🎜 n'est pas applicable à tous les environnements, wallutils fournit des implémentations concrètes de l'interface wm pour de nombreux environnements de gestion de fenêtres (cannelle, deepin, gnome, mate, pekwm, plasma, sway, weston, xfce4). C'est bien sûr très cool. Cependant, si vous souhaitez créer un mr pour wallutils, vous devrez probablement le faire dans toutes les variantes, du moins celles qui le prennent en charge. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer