web-dev-qa-db-fra.com

Comment obtenir un Unity Launcher différent avec des icônes différentes sur chaque espace de travail?

J'ai lu différentes réponses pour avoir des dossiers de bureau séparés dans chaque espace de travail à l'aide de Screenlets, devilspie ou CCSM ... mais ce n'est pas la réponse à ma question. . J'ai installé 14.04 LTS il y a quelques jours et j'ai eu un bon succès en obtenant la plupart de mes applications et de nouvelles applications. Ce que j'aimerais, c'est avoir 4 espaces de travail distincts, chacun avec des icônes différentes pour les environnements que je lance. Par exemple,

  • Workspace 1 - dédié aux applications scientifiques et mathématiques
  • Workspace 2 - dédié aux outils de musique
  • Espace de travail 3 - pour circuits électroniques et simulations
  • Workspace 4 - pour la navigation sur le Web et l'informatique en général

Pensez à une tablette Android où chaque écran peut contenir des icônes distinctes.

Cela doit être évident, mais je ne trouve pas de réponse. J'ai 4 jours sur Ubuntu, alors ne présumez pas que je sais ce que je fais!

20
Dennis J

Définition d'un lanceur Unity différent par espace de travail:


1.  enter image description here  2.  enter image description here  3.  enter image description here  4.  enter image description here

La solution ci-dessous permet d’avoir facilement un ensemble différent d’icônes de lanceur par espace de travail, quel que soit le nombre d’espaces de travail dont vous disposez.

La configuration comprend deux parties:

  1. Une (une) seule combinaison de touches de raccourci pour "mémoriser" l'ensemble des icônes du lanceur pour l'espace de travail actuel.

  2. Un script à exécuter en arrière-plan, assurant le suivi de l'espace de travail actuel et définissant le programme de lancement Unity correspondant. Il agit chaque fois que l'utilisateur change d'espace de travail.

Comment ça fonctionne

Deux petits scripts sont impliqués:

Le premier script fait une chose simple: il enregistre le contenu du programme de lancement actuel dans un fichier (masqué) de votre répertoire personnel, nommé (numéroté) à la place de votre espace de travail actuel.

Le script second surveille ce qu'est l'espace de travail actuel. S'il existe un espace de travail change , le script voit si un fichier de données correspondant (launcher) existe (créé par le premier script). Si tel est le cas, le fichier est lu et le Unity Launcher est modifié, comme indiqué dans le fichier.

C'est ça.

Comment mettre en place

  1. Le script nécessite que wmctrl soit installé:

    Sudo apt-get install wmctrl
    
  2. Créez un répertoire dans lequel les deux scripts seront stockés. Il est important que les deux scripts soient conservés ensemble dans un répertoire, car ils partagent les mêmes fonctionnalités et que l'un importe à partir de l'autre. Pour la même raison, il est important que vous les nommiez exactement comme indiqué ci-dessous.

  3. Copiez chacun des scripts ci-dessous dans un fichier (différent) vide, enregistrez-les dans le répertoire (créé dans 2.), exactement nommé ainsi:

    set_workspace.py

    #!/usr/bin/env python3
    import subprocess    
    import os
    
    workspace_data = os.environ["HOME"]+"/.launcher_data_"
    key = ["gsettings get ", "gsettings set ", "com.canonical.Unity.Launcher favorites"]
    
    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)
    
    def remember_current():  
        currlauncher = subprocess.check_output(["/bin/bash", "-c", key[0]+key[2]]).decode("utf-8").strip()
        f = workspace_data+current()
        open(f, "w").write(currlauncher)
    
    if __== "__main__":
        remember_current()
    

    launcher_perworkspace.py

    #!/usr/bin/env python3
    import subprocess
    import set_workspace
    import time
    
    workspace_data = set_workspace.workspace_data
    key = set_workspace.key
    
    def check_datafile(desktop):
        f = workspace_data+str(desktop)
        try:
            new_launcher = open(f).read()
            command = key[1]+key[2]+' "'+str(new_launcher)+'"'
            subprocess.Popen(["/bin/bash", "-c", command])
        except FileNotFoundError:
            pass
    
    curr_dt1 = set_workspace.current()
    check_datafile(curr_dt1)
    
    while True:
        time.sleep(1)
        curr_dt2 = set_workspace.current()
        if curr_dt2 != curr_dt1:
            check_datafile(curr_dt2)
        curr_dt1 = curr_dt2
    
  4. Ajoutez le premier script (set_workspace.py) à une combinaison de touches de raccourci de votre choix: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande:

    python3 /path/to/set_workspace.py
    
  5. Exécutez la combinaison de touches et voyez si un fichier tel que: .launcher_data_3 est créé dans votre répertoire personnel. Vous devrez probablement appuyer sur Ctrl+H rendre le fichier visible (les fichiers commençant par . sont invisibles par défaut).

    Naviguez dans vos espaces de travail et répétez la procédure: définissez une combinaison d'icônes du lanceur et appuyez sur votre combinaison de touches pour "mémoriser" l'ensemble défini pour cet espace de travail spécifique.

  6. Vous avez pratiquement terminé maintenant. Testez et exécutez le script d'arrière-plan avec la commande (à partir d'une fenêtre de terminal, maintenez-le actif):

    python3 /path/to/launcher_perworkspace.py
    

    Si tout fonctionne correctement et que votre programme de lancement commute par espace de travail, ajoutez la commande suivante à vos applications de démarrage: Dash> Applications de démarrage> Ajouter:

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

Remarques

  1. Si vous souhaitez modifier le jeu d’icônes du lanceur pour un espace de travail spécifique, accédez simplement à l’espace de travail, ajoutez/supprimez des icônes à votre guise et appuyez sur votre combinaison de touches (inutile de redémarrer le script en arrière-plan).
  2. D'après le (s) commentaire (s), j'ai l'impression qu'il y a une incompréhension dans le raccourci permettant de se souvenir du lanceur actuel pour l'espace de travail actuel. Vous avez uniquement besoin d'un raccourci clavier pour "enregistrer" le programme de lancement actuel de l'espace de travail actuel. Cela fonctionnera exactement de la même manière, quel que soit l'espace de travail sur lequel vous vous trouvez. Le script lui-même déterminera quel est l'espace de travail actuel.

Modifier

D'après votre commentaire, je comprends que vous n'êtes pas sûr de lancer le (s) script (s) et que vous craignez de gâcher votre lanceur actuel.

Je suis à peu près sûr que c'est trop (ou trop peu :)) de respect pour ce que fait le script. Cependant, vous pouvez simplement sauvegarder votre Unity Launcher actuel avec la commande:

printf 'gsettings set com.canonical.Unity.Launcher favorites "' > ~/launcher_output&&printf "$(gsettings get com.canonical.Unity.Launcher favorites)">>~/launcher_output&&printf '"'>>~/launcher_output

Cela créera un fichier ~/launcher_output, contenant la commande complète pour restaurer votre Unity Launcher à la situation initiale. En cas d'urgence, copiez simplement le contenu du fichier et collez-le dans le terminal.

Mais encore une fois, il est très peu probable que vous fassiez des erreurs dans votre lanceur, à moins de changer le script manuellement.


IMPORTANT EDIT (2)

Comme demandé dans un commentaire, voici une version qui fonctionne sans avoir à utiliser aucune combinaison de raccourcis ; exécutez simplement le script et commencez à configurer vos lanceurs sur des espaces de travail spécifiques. Le script créera des fichiers (invisibles) dans votre répertoire personnel afin de mémoriser votre ensemble de lanceurs (Unity-) sur les différents espaces de travail.

J'ai essayé cela dans la "version 1" du script, mais "incorporer" toujours les deux vérifications de lanceur entre deux vérifications d'espace de travail s'est avéré être un truc pour éviter les comportements indésirables (enregistrement de données incorrectes) lors d'un déplacement rapide dans les espaces de travail.

Comment utiliser

  1. Comme la première version, ce script utilise wmctrl:

    Sudo apt-get install wmctrl

  2. Copiez le script dans un fichier vide, enregistrez-le sous le nom launcher_toworkspace.py

  3. Exécutez-le avec la commande:

    python3 /path/to/launcher_toworkspace.py
    
  4. Si cela fonctionne comme prévu, ajoutez la commande suivante à vos applications de démarrage:

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

Le scénario

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

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

key = [
    "gsettings get ",
    "gsettings set ",
    "com.canonical.Unity.Launcher favorites",
    ]

def get_launcher():
    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()
currlauncher1 = get_launcher()

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

Remarque

Si vous configurez vos espaces de travail avec la version précédente du script, ils doivent également fonctionner pour cette version.

APP

Depuis le 2015-04-23, la question de Dennis J et les encouragements de Parto ont permis de créer un ppa pour le script, couvert sur webupd8 , y compris une interface graphique pour gérer.

ppa:vlijm/lswitcher

Pour l'installer, lancez:

Sudo add-apt-repository ppa:vlijm/lswitcher
Sudo apt-get update
Sudo apt-get install lswitcher

enter image description here

Depuis, il est emballé pour Trusty & Utopic. J'en ajouterai d'autres après les tests. Je vais aussi ajouter un installateur .deb, mais je suggérerais d'utiliser la variable ppa, car ce genre de choses est mis à jour de temps en temps.

Étant donné que l'emplacement des données de la fenêtre a été modifié de ~/ à ~/.config/lswitcher, vous devez configurer à nouveau votre lanceur Unity si vous avez utilisé le script précédent.

24
Jacob Vlijm