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

20

J'ai lu les différentes réponses pour avoir des dossiers de bureau séparés dans chaque espace de travail en utilisant 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 réussi à faire fonctionner la plupart de mes applications et de nouvelles. Ce que j'aimerais, c'est avoir 4 espaces de travail séparés, chacun avec des icônes différentes pour les environnements que j'exécute. Par exemple,

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

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

La façon de procéder doit être évidente, 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!

Dennis J
la source
Vous voulez dire un ensemble différent d' icônes de lanceur par espace de travail? Miam j'aime ça, mais je dois courir, j'y travaillerai demain si c'est ce que tu veux dire. S'il vous plaît, faites-moi savoir.
Jacob Vlijm
Oui, c'est ça Jacob. Il existe des outils spécifiques (comme LTspice) pour la simulation de circuits qui n'ont aucune pertinence pour la musique.
Dennis J
Peut se faire sans aucun doute. Probablement demain ou dimanche :).
Jacob Vlijm
Merci Jacob. Je commence juste pour la journée, donc je vais essayer. Cela ressemble exactement à ce que j'ai demandé !!! Je vais y entrer et faire rapport.
Dennis J
Jacob, je n'ai pas encore commencé ça. Avant de commencer, je veux créer une image de sauvegarde. Je ne suis pas sûr que les sauvegardes dans les paramètres système restaureront la partition entière. Ont fait des recherches sur Clonezilla, ressemble à un bon outil pour créer / restaurer une image. De cette façon, si quelque chose se passe mal, je peux y revenir avant de tout gâcher. Un nouveau lecteur de 1 To est en route cette semaine. Je devrai utiliser Clonezilla pour y déplacer le système. Les scripts semblent pouvoir être suivis, et je ferai rapport dès que j'irai. Merci pour le suivi, je parie que les autres apprécieront également ce que vous avez fait.
Dennis J

Réponses:

24

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


1. entrez la description de l'image ici 2. entrez la description de l'image ici 3. entrez la description de l'image ici 4. entrez la description de l'image ici

La solution ci-dessous permet facilement d'avoir 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) combinaison de touches de raccourci pour "se souvenir" de l'ensemble des icônes du lanceur pour l'espace de travail actuel.

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

Comment ça marche

Deux petits scripts sont impliqués:

Le premier script fait une chose simple: il écrit le contenu du lanceur actuel dans un fichier (caché) dans votre répertoire personnel, nommé (numéroté) d'après votre espace de travail actuel.

Le deuxième script garde un œil sur l'espace de travail actuel. S'il y a un changement d' espace de travail , le script voit s'il existe un fichier de données (lanceur-) correspondant (créé par le premier script). Si tel est le cas, il lit le fichier et modifie le lanceur Unity, comme se souvient le fichier.

C'est ça.

Comment installer

  1. Le script doit wmctrlêtre 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 des fonctionnalités et l'un est importé de l'autre. Pour la même raison, il est important de les nommer 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éé en 2.), exactement nommé comme:

    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 __name__ == "__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, comme: .launcher_data_3est créé dans votre répertoire personnel. Vous devrez probablement appuyer sur Ctrl+ Hpour rendre le fichier visible (les fichiers commençant par un .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 de lanceur et appuyez sur votre combinaison de touches pour "mémoriser" l'ensemble pour cet espace de travail spécifique.

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

    python3 /path/to/launcher_perworkspace.py
    

    Si tout fonctionne correctement et que votre lanceur bascule par espace de travail, ajoutez la commande suivante à vos applications de démarrage: Dash> Startup Applications> Add:

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

Remarques

  1. Si vous souhaitez modifier l'ensemble des icônes de lancement pour un espace de travail spécifique, accédez simplement à l'espace de travail, ajoutez / supprimez des icônes comme vous le souhaitez et appuyez sur votre combinaison de touches (pas besoin de redémarrer le script d'arrière-plan).
  2. D'après les commentaires, j'ai l'impression qu'il y a un malentendu sur le raccourci pour se souvenir du lanceur actuel pour l'espace de travail actuel. Vous n'avez besoin que d' un seul raccourci clavier pour «enregistrer» le lanceur actuel pour l'espace de travail actuel. Il fonctionnera exactement de la même manière, quel que soit l'espace de travail dans 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 d'exécuter le (s) script (s) et vous avez peur de gâcher votre lanceur actuel.

Je suis presque sûr que c'est trop (ou trop peu :)) de respect pour ce que fait le script. Cependant, vous pouvez simplement sauvegarder votre lanceur Unity 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 va créer un fichier ~/launcher_outputcontenant 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 gâchiez votre lanceur, sauf si vous modifiez le script manuellement.


MODIFICATION IMPORTANTE (2)

Comme demandé dans un commentaire, une version qui s'exécute sans avoir à utiliser de combinaison de raccourcis; exécutez simplement le script et commencez à configurer vos lanceurs sur les espaces de travail spécifiques. Le script créera des fichiers (invisibles) dans votre répertoire personnel, pour se souvenir de votre ensemble de lanceurs (Unity) sur les différents espaces de travail.

J'ai essayé cela dans la "version 1" du script, mais "incorporant" toujours les deux lanceurs-vérifications entre deux vérifications d'espace de travail s'est avéré être l'astuce pour empêcher un comportement indésirable (enregistrement de données incorrectes) lors du 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 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 script

#!/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 devraient également fonctionner pour cette version.

PPA

Selon 2015-04-23, la belle question de Dennis J, et l'encouragement de Parto, ont conduit à créer un ppapour le script, couvert sur webupd8 , y compris une interface graphique pour le gérer.

ppa:vlijm/lswitcher

Pour l'installer, exécutez:

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

entrez la description de l'image ici

Depuis, il est conditionné pour Trusty & Utopic. J'en ajouterai d'autres après le test. J'ajouterai également un programme d' .debinstallation, mais je suggère d'utiliser le ppa, car généralement ce genre de choses est mis à jour de temps en temps.

Étant donné que l'emplacement des données de la fenêtre d'affichage est passé de ~/à ~/.config/lswitcher, vous devrez reconfigurer votre lanceur Unity si vous avez utilisé le script précédent.

Jacob Vlijm
la source
Est-ce possible sans utiliser les raccourcis clavier? Voici comment je le visualise: Dans l'espace de travail 1, seul un ensemble d'icônes est affiché; lorsque je passe à l'espace de travail deux, le lanceur est vide à l'exception des icônes de tiret et de corbeille - puis j'ajoute les icônes que je veux qui sont enregistrées automatiquement. Répétez l'opération pour les autres espaces de travail. Peut-être que vous pouvez même créer une interface graphique pour cela - vous donnera +500 si vous le faites fonctionner. L'interface graphique est facultative.
Parto
1
@Parto WOW, vous savez comment attirer l'attention de quelqu'un :) C'est possible, bien sûr, mais il faudrait plusieurs threads pour que cela fonctionne sans problème (essayez-le dans un script de piste "mono"). Attendez-vous à une réponse dans les prochains jours :).
Jacob Vlijm
1
Impressionnant. J'attendrai ... belle question cependant, je me demande comment je n'ai pas pensé à ça.
Parto
1
@Parto Je dois dire que je suis impressionné par votre générosité. Je prévois de continuer à travailler dessus et peut-être créer un ppa, y compris une interface graphique pour démarrer / arrêter, les préférences, etc. Merci pour la poussée! Votre bureau a fière allure d'ailleurs!
Jacob Vlijm
1
À tout moment. Tout le monde a besoin d'un coup de pouce de temps en temps. De plus, vous m'avez déjà aidé - considérez cela comme un merci. A propos de ce «projet», un ppa serait bien car tout le monde n'est pas technicien.
Parto