web-dev-qa-db-fra.com

comment rendre docky disponible uniquement dans un espace de travail?

Existe-t-il un moyen de rendre docky disponible uniquement dans un espace de travail et non dans un autre espace de travail dans Ubuntu 14.04.

3
Shash

Un script d'arrière-plan pour faire fonctionner Docky sur des espaces de travail spécifiques (ou non)

Basé exactement sur le même mécanisme que cette réponse , sous un script d'arrière-plan qui démarre/arrête le lanceur Docky, en fonction de l'espace de travail actuel.

Le mécanisme lui-même est à peu près testé. Cela dit, dans la question liée, il est testé en définissant différents lanceurs Unity et en définissant différents fonds d'écran par espace de travail, sans démarrer/arrêter Docky. Cela ne devrait cependant faire aucune différence, et pendant les heures où je l'ai testé, il a fonctionné sans une seule erreur.

Comment utiliser

  1. Le script a besoin de wmctrl:

    Sudo apt-get install wmctrl
    
  2. Copiez le script ci-dessous dans un fichier vide, enregistrez-le sous docky_perworkspace.py

  3. Testez le script:

    • Démarrer Docky
    • Démarrez le script avec la commande:

      python3 /path/to/docky_perworkspace.py
      
    • Docky fonctionne désormais sur tous les espaces de travail. Accédez aux espaces de travail que vous ne souhaitez pas que Docky apparaisse et s'exécute (dans l'espace de travail):

      pkill docky
      

    N.B. Utilisation pkill docky, ne fermez pas docky depuis son propre menu!

  4. C'est à peu près ça. Si vous souhaitez modifier le paramètre, démarrez ou supprimez simplement docky sur l'espace de travail que vous souhaitez qu'il exécute ou non; le script se souviendra de votre préférence.
  5. Si tout fonctionne bien, ajoutez-le à vos applications de démarrage: Dash> Startup Applications> Add the command:

    /bin/bash -c "sleep 15&&python3 /path/to/docky_perworkspace.py"
    

Le script

#!/usr/bin/env python3
import subprocess    
import os
import time

datadir = os.environ["HOME"]+"/.config/docky_run"
if not os.path.exists(datadir):
    os.makedirs(datadir)
workspace_data = datadir+"/docky_set_"

def get_runs():
    try:
        subprocess.check_output(["pgrep", "docky"]).decode("utf-8")
        return True
    except:
        return False

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()
runs1 = get_runs()

while True:
    time.sleep(1)
    runs2 = get_runs()
    curr_ws2 = current()
    datafile = workspace_data+curr_ws2
    if curr_ws2 == curr_ws1:
        if runs2 != runs1:
            open(datafile, "wt").write(str(runs2))
    else:
        if not os.path.exists(datafile):
            open(datafile, "wt").write(str(runs2))
        else:
            curr_set = eval(open(datafile).read())
            if all([curr_set == True, runs2 == False]):
                subprocess.Popen(["docky"])
            Elif all([curr_set == False, runs2 == True]):
                subprocess.Popen(["pkill", "docky"])           
    curr_ws1 = curr_ws2
    runs1 = get_runs()

Explication

Le script garde une trace de l'espace de travail actuel (quel que soit le nombre d'espaces de travail dont vous disposez). Par espace de travail, un fichier est créé dans /.config/docky_run, dans lequel est "écrit" si docky doit être présent ou non sur l'espace de travail référent (True ou False)

Si vous restez sur le même espace de travail, mais que docky est soit démarré, soit tué (son pid apparaît ou se termine), le script "comprend" que c'est vous qui avez effectué la modification sur l'espace de travail référent, et le fichier est mis à jour .

Si l'espace de travail change cependant, le script voit si le fichier existe, le lit et démarre ou tue Docky (ou ne fait rien si ce n'est pas nécessaire), selon au contenu du dossier et à la situation actuelle. Si le fichier n'existe pas encore (car vous utilisez l'espace de travail pour la première fois depuis que vous avez démarré le script pour la première fois), le fichier est créé et défini sur la situation actuelle (dernière).

Étant donné que les paramètres par espace de travail sont mémorisés dans les fichiers, ils seront mémorisés même après un redémarrage.

2
Jacob Vlijm