web-dev-qa-db-fra.com

Plusieurs fonds d'écran d'espace de travail sans utiliser ccsm

Existe-t-il un moyen d'avoir un arrière-plan différent pour chaque espace de travail sans utiliser CCSM? J'ai lu quelques histoires d'horreur et je préfère éviter si possible. J'utilise Raring Ringtail (13.04)

4
user165340

Avoir différents fonds d'écran sur différents espaces de travail sans utiliser ccsm

Le script ci-dessous n'utilise pas le gestionnaire de paramètres compiz, mais il suppose:

  • python3 est installé (sinon faites le moi savoir)
  • wmctrl est installé (pour récupérer les données sur les espaces de travail). Vous pourriez avoir besoin de l'installer: Sudo apt-get install wmctrl

Cela fonctionne quel que soit le nombre d'espaces de travail; il calcule le nombre de colonnes des espaces de travail et la ligne de l'espace de travail actuel et définit le papier peint défini par l'utilisateur pour cet espace de travail (actuel).
Une fois le script démarré, passez simplement aux différents espaces de travail et définissez le fond d'écran de la manière "normale" (GUI). Le script garde une trace du ou des papiers peints par espace de travail dans un petit fichier qu'il crée. Cela ne devrait pas entraîner de retard dans les performances, car le fichier n'est lu que lorsque le script démarre, ou lorsque les fonds d'écran par espace de travail sont modifiés par l'utilisateur.

enter image description here

Le script

#!/usr/bin/env python3

import subprocess
import time
import os

key1 = "gsettings set org.gnome.desktop.background picture-uri "
key2 = "gsettings get org.gnome.desktop.background picture-uri"

def write_wspaces(file, current):
    with open(file, "wt") as wt:
        wt.write(current)

def read_wspaces(file):
    with open(file) as src:
        return src.read().strip()

def get_info(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def get_currwallpaper():
    return get_info(key2).replace("file://", "").strip()

# get resolution
output = get_info("xrandr").split(); idf = output.index("current")
res = (int(output[idf+1]), int(output[idf+3].replace(",", "")))

def calculate_geometry():
    # get viewport data
    vp = get_info("wmctrl -d").split(" ")
    span = vp[4].split("x"), vp[7].split(",")
    # calculate number of (horizontal) viewports
    n_vps_hor = int(int(span[0][0])/int(res[0]))
    n_vps_vert = int(int(span[0][2])/int(res[1]))
    n_wspaces = int(n_vps_hor)*int(n_vps_vert)
    # calculate current viewport
    curr_vp_hor = int((int(span[1][0])/int(res[0]))+1)
    curr_vp_vert = int((int(span[1][3])/int(res[1]))+1)
    return ((curr_vp_vert-1)*n_vps_hor)+curr_vp_hor, n_wspaces

home = os.environ["HOME"]
wspaces = home+"/"+".config/wall_wspaces"
if not os.path.exists(wspaces):
    os.makedirs(wspaces)
if not os.path.exists(wspaces+"/wspaces.txt"):
    current = get_currwallpaper().replace("'", "")
    writelist = []; [writelist.append(current) for i in range(calculate_geometry()[1])]
    write_wspaces(wspaces+"/wspaces.txt", str(writelist))
wall_list = eval(read_wspaces(wspaces+"/wspaces.txt"))

while True:
    curr_vp1 = calculate_geometry()[0]; currwallpaper1 = get_currwallpaper()
    time.sleep(2)
    curr_vp2 = calculate_geometry()[0]; currwallpaper2 = get_currwallpaper()
    if curr_vp1 != curr_vp2:
        command = key1+"file://"+str(wall_list[curr_vp2-1])
        subprocess.Popen(["/bin/bash", "-c", command])
    Elif currwallpaper1 != currwallpaper2:
        wall_list = eval(read_wspaces(wspaces+"/wspaces.txt"))
        wall_list[int(curr_vp2)-1] = currwallpaper2
        write_wspaces(wspaces+"/wspaces.txt", str(wall_list))
    else:
        pass

Comment utiliser

Copiez simplement le script dans un fichier vide, enregistrez-le sous workspace_walls.py et exécutez-le par la commande:

python3 /path/to/workspace_walls.py

Si cela fonctionne comme vous le souhaitez, ajoutez-le à vos applications de démarrage: Dash> Startup Applications> Add


Éditer:

Ci-dessous une version complètement réécrite du script, sur le modèle de celui-ci .

Le script (avec quelques différences mineures) + GUI est également disponible en tant que ppa:

enter image description here

Sudo add-apt-repository ppa:vlijm/wswitcher
Sudo apt-get update
Sudo apt-get install wswitcher
#!/usr/bin/env python3
import subprocess    
import os
import time

workspace_data = os.environ["HOME"]+"/.wallpaper_data_"
key = [
    "gsettings get ",
    "gsettings set ",
    "org.gnome.desktop.background picture-uri",
    ]

def getwall():
    return subprocess.check_output(
        ["/bin/bash", "-c", key[0]+key[2]]
        ).decode("utf-8").strip()

def get_res():
    # get resolution
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    pos = xr.index("current")
    return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]

def current():
    # get the current viewport
    res = get_res()
    vp_data = subprocess.check_output(
        ["wmctrl", "-d"]
        ).decode("utf-8").split()
    dt = [int(n) for n in vp_data[3].split("x")]
    cols = int(dt[0]/res[0])
    curr_vpdata = [int(n) for n in vp_data[5].split(",")]
    curr_col = int(curr_vpdata[0]/res[0])+1
    curr_row = int(curr_vpdata[1]/res[1])
    return str(curr_col+curr_row*cols)

curr_ws1 = current()
currwall1 = getwall()

while True:
    time.sleep(1)
    currwall2 = getwall()
    # print(currwall2)
    curr_ws2 = current()
    datafile = workspace_data+curr_ws2
    if curr_ws2 == curr_ws1:
        if currwall2 != currwall1:
            open(datafile, "wt").write(currwall2)
    else:
        if not os.path.exists(datafile):
            open(datafile, "wt").write(currwall2)
        else:
            curr_set = open(datafile).read()
            command = key[1]+key[2]+' "'+str(curr_set)+'"'
            subprocess.Popen(["/bin/bash", "-c", command])
    curr_ws1 = curr_ws2
    currwall1 = getwall()

Budgie est désormais pris en charge

Ajout de la prise en charge de Budgie le 21 juillet 2017 pour Zesty, lorsqu'il est installé à partir du ppa (voir ci-dessus)

enter image description here

5
Jacob Vlijm